From 5ce6d73279f94463008c83aaf6610f43fbb0a843 Mon Sep 17 00:00:00 2001 From: MrPlatnum Date: Fri, 5 Sep 2025 16:05:03 +0200 Subject: [PATCH] include compiled sources --- .gitignore | 1 - packages/model-viewer/.gitignore | 2 - packages/model-viewer/Astronaut.glb | Bin 0 -> 2869044 bytes packages/model-viewer/Astronaut.usdz | Bin 0 -> 2145297 bytes .../model-viewer/dist/model-viewer-module.js | 29271 ++++++ .../dist/model-viewer-module.js.map | 1 + packages/model-viewer/dist/model-viewer.js | 80896 ++++++++++++++++ .../model-viewer/dist/model-viewer.js.map | 1 + packages/model-viewer/index.html | 4 +- packages/model-viewer/shared-assets | 1 + .../dist/image-comparison-app.js | 24431 +++++ .../dist/image-comparison-app.js.map | 1 + .../dist/image-comparison-worker.js | 240 + .../dist/image-comparison-worker.js.map | 1 + .../dist/renderer-harness.js | 250 + .../dist/renderer-harness.js.map | 1 + 16 files changed, 135096 insertions(+), 5 deletions(-) create mode 100644 packages/model-viewer/Astronaut.glb create mode 100644 packages/model-viewer/Astronaut.usdz create mode 100644 packages/model-viewer/dist/model-viewer-module.js create mode 100644 packages/model-viewer/dist/model-viewer-module.js.map create mode 100644 packages/model-viewer/dist/model-viewer.js create mode 100644 packages/model-viewer/dist/model-viewer.js.map create mode 120000 packages/model-viewer/shared-assets create mode 100644 packages/render-fidelity-tools/dist/image-comparison-app.js create mode 100644 packages/render-fidelity-tools/dist/image-comparison-app.js.map create mode 100644 packages/render-fidelity-tools/dist/image-comparison-worker.js create mode 100644 packages/render-fidelity-tools/dist/image-comparison-worker.js.map create mode 100644 packages/render-fidelity-tools/dist/renderer-harness.js create mode 100644 packages/render-fidelity-tools/dist/renderer-harness.js.map diff --git a/.gitignore b/.gitignore index 9eb3e95..c8c2855 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,4 @@ .DS_Store lib node_modules -dist .idea diff --git a/packages/model-viewer/.gitignore b/packages/model-viewer/.gitignore index 57b328d..e503426 100644 --- a/packages/model-viewer/.gitignore +++ b/packages/model-viewer/.gitignore @@ -1,7 +1,5 @@ renderers/* node_modules/* -shared-assets -dist/* lib/* **/*.sw* .DS_Store diff --git a/packages/model-viewer/Astronaut.glb b/packages/model-viewer/Astronaut.glb new file mode 100644 index 0000000000000000000000000000000000000000..aa572920b50a99c699628546e99b7f745a8fc107 GIT binary patch literal 2869044 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

-yYnYdd)IsJaHX6T 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�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

;mjE(&` z=XLf?UY%=>9X?UbjsGdVo>(311JPah6^w)AzwL;!CHpx^LPh7p@L9U0<_H--``QN- z5@1J)f>^iurRk&VbC^9n*9I0$8Hw%m+`SeP2X@hrt<{o>YoUXQy}%fXucjW;j)hec zU!N<1g@1&7U0K;R%rlm0*2~t6(N$3-g9TUs0G;#J?c28Vl}MjDAo84-<1C|irx?Isk10TZ+ILL~ zKV9$gl`CG$@{#qo^ds>x;yy!R7T7N_X60O>>+wUlZ^n4*op*dr`C#&?6f2Q_kS&L= zR)K(G`bk?FY!wZ)+Yrfngw;(ppW-&NWy)u`Oh4mDLcx>wQ67?FG7 zf|aj~cxZY_hB)c0pg>i65hTF5!#VRjJ$ttJo!|cLsuYVdPB2Wp0MiE<>bg+4g|^v= zpXyzw`y?qps|E#Nco+~wQ5h;&PbFt6jxLN|eWB$`Whdif9@O_n0qoHA%m94+vN)Yd zM5QNT)wf|m+L#0fX>#L@d8Ap0@HaR=B?zelEJeH8U*7V=nsdfzM062M-# za!0*uyK%KnMs_FqMRJy_P^n-Cx5oK%U;l=GN-(uoq!8Q%OtDn?&@M>uB!SaZQvn26 zrQMIQv>vq34a%9s=Q%B(yWuZt{FC}{U2>gqOd!L2j*%0&p&4j?enyW={72Wk7?ANM zB>ww-ZmOTx0Ved@*9ii6*~Gub`8q5A*CqaI6=&}kf_EgeoB%&(`J~_p6wLJXk{m?t zY3~{U=Fd{Sl?sp0DC;xn8(3D7q?`$2)tMr&dJ@j-#-@=W#J&b@m{ zY>(h?q&!Rvq6U@2DaZDck3TL)QGL@>HK%K12XtBBby10Q&7BhHdvfNh?T~+8`k&ts zkfhp<@oSD8l-$ZXAV8_#B?*0L0489USPe$ohN)z$z5_Tg)=vfYNjgyd7=Xa8*Q>@3 z$WUWyJ>Fa8&U4qL%jT@&4V(4FE{8=JM66 z-sej}q-W0-m(HI{m3>v6>Rz54JY9TZntjcWn7C49kB+2mSWi?V7hq8$$sAlX8T%Tm)+gPrAwFN zR}`a+4o~%dSPwKNs`)iHlCzTENgft>SwXVPSF8iPMr`XN^VDu2fTq}aw4}*ehs7op z{TVCrGd^H}f-A5^1u8bS*H87$?uj4lQ`0&7K0-xKvWLA1lR>YKePJdtqM**+m zAH)@?9Zhz!s(@KjqguJ?gDzjSPdLTr83Zurw%^@iaZ(@vAb^u5>`yECf1KU^StbA1 z`ZBO0)gB6fP*morK6ZOR*;3W|gC$CW-S%3=EA-v1ci#yEh}!d2uwFKWiVp~++rEUqFQ35HK_l4A@cNlQ*z#?WiM86?1Q3wePh@w%o9Ih=6%Scc$UXOoul4}b=M}&rmFKp_&!lg862CdOWtGpKXA>D) z@~HqxzIMq9=_9o`qSec=aY$Mhv*q;1%d;<$M1nZKi!8)m)EZFRM7^X7_8z2w0=qpj zGvI>$!k>qE01!yxZUHV6Qy{sHEKQ7PxupQt0ie(sy}GYC0033M~>c@m&E500P*TC?*QPzge@@AczfJuFawcwi9;j|lK9b-$;Hw; zn7O8pW_xLXq=}&tN)ST6<8`mA4?!_VUN zS^xmLvC{$p=v=P~2yhY*fX4AA0s(q3wF{9=7T24~2JjXDkf*nEZ>Rc8Mk%aPGwK-7 zP7!#iQY6T3$BIB@Lv-WlSYTEqf6h}>URB)=9jB|V%GvDeP03&A@yE$={N-LH*s1@oNXNB~g* zU{R+?K{yFiXu1zS_+U7@R09~WU@E=<7J6_^_xjtv`5Sgtp@PQg_q-HZ9~wA<3X+XW zNWV%*=~*c;lVGZ7R8y&=#DtM>&qRGM^x#(Y2#$fF>(H)YIw)~?sW`ZJ;i4UG1?oZ5 z@hm~Z55zYBkn%DUfSf31s^x}*S0IQ>_SctyH|(#~y~tb;&|McS>xM~} z&r21J6U;w=0=-%v!)AhZ3Yp&muFJ1O+TtWUNbee^HYE z-1{avbQtI_z%;xr0Kn@`{%-=*SV#N6N%DWJ!HUdE{<>w#_PLQbVJ})fJyG(ysE1WS z@8nndc2a?By(j9`797?+bh`equf##J3@X}XIXp@pl2mcBRQl37F2Oq-kT3+K&ojxg z1la-%ll)0v=Ku=;bcH@Tt!N?(L%-TVP66=g-gFE-qILbSktm@>YXpE?opKyHI{FER zy`X4FOJ@6?2c2!vlDb_`l2tdaU$b38<%o{|_kQ9h#<&Tl-`Tlu-JPnGfg-31(L%5f zHlbplLFa&MCkb3xXLP$M>dtH}-n%8L)@M$TDu5Rbo9!ZTBGE zI_qGs5~m-$|Gu~LpyjV1C5iMf?Zjr%HFbU}xdloQD~(7jiHJAeRn zQ0xUfkbd?WCzbFTui7SQ9O=iNwgKvCr~oSc(DfNMCgVvmItc~c<3IT?|1;D1ljuJy z`>Jk4iGQ^Y_~w7~4|0zNQeG%Y{x@%0eyC@psF|@Z-1B*R zdvW9X^=h-BYWI4Ui-nW_B%?I<`rXI(c1C52ZB2tnl7OI(uGa?)N{!}w0(c7~SqY`A zf62bk*WbQ=H9e~BE2OgK5C7l~hP>8&YfawY+b2%T$1q_;^&zcAIXs z6-)pT(K9pIGR*Q~i%BqyM3nc(xvVqoD|C?oW#wZb|14+Rj%_CKxCeZ?)g+JRio~F| zM@vAiv$tLb1fcWC$7B0#V#mG8b^!hQ-Dl$SO@ROc0DRt)|9|6e{;gvl$4M&xH%b2Y zYG2L2z&<3*c^+Y`NCF;4BliR^YU%5ij{yMaCHbuCI+CaQ3>$DHcb`2QOe*&MsYa8` zE?VAMn2>3~--_H!6r0vbydTMaz)ask5fh6j^w@TKJihPna^&N9SFvrigGrzU9K)a13{G-37?gTiUf5%=F z$m8j=#ic8k9mh}dNZ{$%EIW7ax!NBFRKVPht(A`QH44N6NWk(ztvS^qgZ8EcTJ|*x z6#Z#H0J?_Q07d~=ugH3VG@X9eu_D(8ylN(Z$kKpZPx|_zf&l*YpS}eEoOCU`&f_Ug z!|t|BB~C)JynzBDD~OfC{yPger0XtUzU(8usulps^SCHa_CtL35q~W306GLYG+HTE zwZ1jWR@lqLa3Z-Y0D$zOiXURz7kHuKFwvg{X(%?F9!uAI`!aQpGbXhtcAT)}X{@_D z_tFlzF%qUF%xuAef6;Y##!dV>$@}ZqZ`k*UA9}b@%!VQh^cis|;ta!vt5}_mGr+Ta zsL1WgDXf6@UgcW4x>79jDzCNaxnCOqfB}8cfB+`}0rUmF=>vM%<9cEiL9xlXRzU#z z%_eLBt7uQIwMkOoI3)R(833Spqz%AP0Du^$vkH4P8EIqlaItv&B-ER{NC-&es?zUi z(V-@ZEMrxu?`{9)DFezs`HVg_qoM^doU+>NY7zA+#tFO zEP&$hapg2n4XD2#S3gRjxDsS4$}yw0)58)fOBtIo@Nq(=?(|+`6x9su019f$(b~DY z;{*)BT;`4Bzn%7?;Zfp0&Ou9VltR@tsOFqi^+BeQFi3?~=F*9ORjittH^F-aFBPbj z!H_`QbRI{AWUHh{$&X|XJp@a^$}rG*bbllive&C8UyUb9mOC#@ekJI;66bfr5pUK5 zK~NO7gSyqyz-y$815?IT^=*T9@* z^nh##$Y1!zH^*FH0J=K1Dy+uZU7<#d?>gs|`Rqny-HwOT6MWedBp&Bz2SU@&b3T`8 zK+Sub70v7WvM2boJQKaT;JG_~z0M}OV-ubBqGQ$tVEgeWP5!R~ zLae*~s{{djn#8}x`oZ`9a^q=b{x*45tI2-?s_QN`>VJwIqCW=(tRgF_QpFY4q1={i zh7CZnUNns9(VZlf&YN~A*^^G{(GRSc0R$=lKrr&u)xVj59zn)97ID-PEKC5(eIBbC zUGjk-Db5NMt0eHyQ_!K&Zb14XRi(4_0F}7b4FW>AI-f*J>^12NRj=xE&3mfSvdMKm zB_*9yQUY2%-HUkuUGBCyx}QeDuls-^QGqN|saJK(h4b5sOQJicD(u;_#gG5wPdY&6 zV=76$|LE~z@8QD&;mNj0LW+vfk|4g0p21AmPtYNH2Pd@mw$**8J;7Bau#1U6$IBLY z@bJ;V9jG#oq_I%tR6xs7mQIxY^WppNR}z?Z3;`BuPINrUY(2vsP#0hA^L6!n)X#Hy5bv?ZR3+a7l zP_W$w`%wW-biTpVP)QeETfyMi-8~q+u>EB_Z2zIJKYGr#N>1nsd*E4P=^z09cJ;*K z(EC~EoiJ&T*MmiaHL4Nf{nlY@I)Px60C$qGdVeR85wH)fRdi4CWdx?x`&9m` z<(T$ul7^Zm{HOR`Ft;eFABt;|5NQj;=SeaReN!L@+D~vD_C4!Fx=r#eFQ`5Vt`Y2u zt*JE|wh7t}#Mg_BCLd=qKS?LRu0v}w1M&1+3n+pgM_VwDppr=dl=XL7WTgKo$9S%e z0RdQtmHgY32|&L&DF{HndGGtaujcU8{wJq`%)-~Q8odZIxcRr!BX5W#6s{%hdJ zCI62bSEv0y%Kq%&PRsM979L6HN+v3HkUc(u&1OO>ra{)Hp3^(;z2|wS`d{xq`skwq zFlEp9cqRPZf+zL^vQOV3t7!G2zwslH15?%os3c!`T~aQ!&>r7*j$*{vjj)%?|dkipKz!z2AGr$`boP$E2qJ;q_D?l4-%ett6 zsX2EhWrjv_Tmgay6KEJK`Xol?2TW+jffhfZ2DXP7dJ2R$m^ootV#z5)SY%h_wL+T>_6Nec4%0Sw7=4J$@3`R zOw4iBlE^-h071pt*5B)y^}U!PIJ1romUFt=GO1yMdy535J0Z6O#8%j zj!O`{$f)|%oA?kw22q&lQ_|D#a3htSLXqYJ6%5wXGb%D0N7rNtWV`Z^$ z)&Hu)8qmV5z#4n6oLBbgoV(S;Oq_qFbG7QfkBRTH*YeE_ROzn?{+Z8iw!v6ewcpX5 zzR%I7f#SBzTfUn~{pWu-N4iPkpKHA+QGT4Rc#-bf^t)+Ln*7({uL=P0 zMNj^tX8^A`i8m6k*|3s3ru$b=l?qo?UTh_hN-z)>0S9)9)x`Rssx&%-fRnyXswnBC zKv7j=8VCoKeGykN+#^|7HQ>jXI(Q`g zyJ{Ll#;t4mz51Tzxaw|H zc82Ph^`LbGOGWIsYF8y$b^d&+3;}o6`p_Kdc|d(l&{lS~#`=Rl^g{)9QF41y*;C=k zwJ)5@xcHCreDKl7woM1qMFradVp;CBs?+XIAmeRI9|Uw{FwjWmBtd=k(j^DMV49G; z|JQ%|rv=2F3GBPO_sef8onA~VnkR!nibccntmfFV*^DmJhNc=4h5!Zr{cQL5$2@Dj z8*rlpwPp0SWlEl7k{8HkeLg`uNg5H&N>U$o?rHB0i+_xqz5qY70nEYw44ZJ|1-c20d;|CPX&qez1XPQDJ#ftrmvO zULXdI!}jaSOL9Xm*4>*30?_zgH5CQmF!l{IhjO;pNzGqKQSwGujMQ#I%TbR98!tzJH_EqODc6JmSkzYkzHgZjJ z(2OLdqdKU~I#hm*W9iWyvL__h^tW1_D4%ifURa8{97pf1f+f+%U9Zwg#=p-=7T0gw z^j`vg>o*!dES8DQq$mZ@Gld9hb2R4=wxj89=~^1U^um7SDDK|7>vIF@*Y)h56q^xw znzZwrx?aAHUa^rPZ%2;oh@9ndE9Ytf&yPFqP5wRr0A44FV4uQWofZf{LwQv|fRlg# zG>$h72=KBXfC#YVo>tjFR23Y(08SeO@MQ-8$T+%oimH}C-DnXY!(5es4zfM5f^zl0Dg-NG?tnW~x%K!tCslkHz*0o2^d}JO z3YZFx%eV(nFi@~{ZmlmF=yDR2_}4X|sC9q5x@QNFL?0_hy%azPEjYNTpmEW;*(p+B zOnsQQx2>$G|A_%yV?;3>t1bS-SFO~dfURPx)Mq0)eSxK^nI8)G+If3dVRaFW(pjK$%l4GfqujEN3q?|}B z=ORh?(0~%`NfIT!&a_V4JHA*5q?ctc3b-V>t)!;z5xHvJc(^c7EUf@0P$6rR{n;xv zb3JsGE17+cRAwWybd1hP-+LvVlw_0Ml=FnX(wtBU=Vw#Ge+E306!LG18vDwni?KJ# zQPscy?vMZY5}-!G^Y;y|3oT~GJget4{sC}A;q>YfkVpi70Yuhjq*_kbafPsh?Qx3D z2Cy$+U8XR}S3UpqE_G|4gQtr-cWQi%;e`r(o!_#Wq-?bYBGFD&A@uRI7@#jHRociH zWUtqDC8(*S?n!BV53M{&!c~AkDtRa1Our#PjDrl7Y`;E11ShsHszN-;QSA+_BUcqv z@Bqdlo)i08=hr$$#%f)7%-f;vcV(i038OVZs_#=ZrV7XN3-$f`=)({Eo_@;QtIh>` z1wD!N8I|$?g0wUAToqttJ`H$jl+7JL8@;R6PN{73{HW@ZKyOvbXWIp^8QX7G@#TDx zU#x3AtAI8#e@CtYNiNQQ-q8=Uof&J8 zdzK6W$P#w31ol`%vZ-}m?BUE&=123~Y5xU63Dd)qlD*S@PlXL2u(Ujo>=GaUn<5a53AaX*^U@Bez(y)=AX@#^)NzoJugf1PB0mcoHT6{YEnCB>2wP z#RR~5UT34O0s%Gw0Gw9x|2US$&m#HX0q#Q()Ek1?>ykGl|FPT9Vfc5F4T>p{NCjZ3 zzi+?uj_p0kW^~CXAAjttVxNvgYk}Y+4-}AYV4?zI!4AOl);^~NRb*u<@_1=%W)f0d zq1plf3hH1bzyPv!yhoILm2KP@{zw?>+Sbj*9s_eD?0m4dI3`o92vq2im>-pn4OHgw zSF5XBLw0#=(_t@`?l551V+@<6{^MGJB$gRlC{{?^%YLs49z5rH54(V_*W(9$kM(#3 zF%rpz-U=WE6IUAmV0VCVIal`?NuEdNgxxCgIZO~dQ#~)@1tYFiApa!zQ|Z6NR#5F7 zv)__P;@Y;M3M2u*3K>m{EOZ)xTIN>55GK)R698Xn-wCK>R0GtY4Du>{t>X;XAVKA1 zSr`;X6(~go&34Adoc2YXqcI7P0HgXJ;f?<6^FL!(UY#Qz1W;yKR)opt=B=Bf%0YTl z^RxG0fAMgC&-=nmP|f%0iGIfz3v|-KIj}7mY*V^!9SA_ z2AQiOap~`qwgW(hyzrzeU%oCT0A2P?Y6y=Vpo=&foN zx;!1buSCvlyi;)v1F>mClKh3_ngIZdEw=!W9NWErzhWZsCp+7Yu4ft2+AzZa;JiSA zt8^a8Min;db@TRZ$9Hyj?+rlOi2IhT?@R#rAU*b=*H&I+LU(7lMkKw}UnU9wf|0u+vtD^VPaf;@CM?V{1enrqsh z0Zfbx&oephb@f{2@r(9a1^~>b@mlZmw15C70RiX+9UR^8brK-JNk9O){7DlI8xDEt zu$Kh_oHhu+0<$^(tM}3qWcsctUsNO5?Y~WWgImzBQajVD6HVwKpRcBcX=?&Zs+uQHH<7D!ESF%(kpp&LSiQzC3 z+$YeAVGUZ91a$&Sl@P89l2r92xMl%c0dv-75{n52>Hl$d?Et9aQq->pN^T^sZd$ae zpmFfIs8>2&#s`49$uhXMjq1HUc*^1B?`rPYI zw3|iW>*t|k#4u1!t(@u`H*Uu9FPdoq0B}D3<*)yGp??z?OSQGAy@Uu34X)+^hcAv~ zC1hNEn*O2+JWkrUC{j5#so)ICTd$GhXbFFihbV98Lxc8)7A`=71TYe;@cP;am=6b5Z%NfKR-aDj=S*hgt`whd8q_kphUQ9=}!bpS=jO za`ykVA<_`ze#SY`2)663`YnsfISBcNwuD(=MbNNL*U3_XF+cb9Z;bh1p64@7fSA2I z(e}$A0OZ%I!P9bDweOcJ?dQB#zor5b04yLVKoTFcC{FGSV$8kN6aJAkxn`HgGp|Nv z$@BVY&M(Q1;|-{{$^Yk9+Gzm*zUaySp7>`Lts~uUa+yYxq#$(buG%SCp30;o(TyT5 zxspoCNqwg4DRGj@$~a++LG;*80x6hzKC;}2%A#k}_)_U2RC2%svNI=*dGu=na0w2Q z6eMXllaLvgd$m_3kt=7bDmMEt6l+vgksL}@(QFNb&e!Kk^3WzhI@q$Nbk(p&8zm~V zn7Rh&YZ6b;x7taC^`++Zom)4b3%vgH&;IO4NJ$6Wf3UyUfAZLR7+UA#vsBStIuYlw z6304jRN#odUEnb#?VqLpe3I|gudWiCVgooQ{aW;tuJ(EKXz}2o+9GWm6aby4&K1DO zVJgwfesMLkE161r>Gg3TS3t&sK%~Sy$AjQhdrNofn%GmL$H_96&EmAlbm0 zM~^%o*qw|y6~xgaNd%`tT1f!0FK9g`$(U9iN_74C|MzF1Mz7WYvKjduT4f4@vh4J{q!@(Cg*$IN5G#mS)<^C_KT~VNvNFPHgHn5UuPfC zwcIbgRfX&R`7Me6)k=S!lh;OpPc^raF~g`X8*4C1VUyWjkKvsbQUPi^apj8hR0oE! zBlbG$mgG+6BFSdiQVMuz90naZu`<_&=>A;=r%Knd&-Co~9%X*9i)?dyofSoOqu;h| z4w$@>HcGUNB(uT7YWpCDiIUCgmwEAmTYPw(*ILtW{`imnXbe#Idv7z*K7)bVmRvVSZ84HHp303yp1R`A`lc#~ zyT2-X)bhZwq5vJG)2tJ!6_4~OHjU#J6`ye&$Jb6$+rR|bYb1_Kwqw&^^Jy$2_Emr< zzOzo*mK_t@5P*P^nAij);B_owKSemP@rakeuGIkwUb9MC6xfZ#abil#ETptLwC`Nh z?UD(KrBF%Ex_A5y3SU?O#GX)~U&hXTc3>5;D?k8#zV+Llu*G(ozUpkfCko~0<|j_p zCPp&ZFMA9Z1{Thp>&}8IWPNY7G^#J_hBbcMOV!pg;0G~X7PCzy(4Al}JqJa!fv(jG z37Os3Byx8oqndt#0W6^9SxpaE#N((S0fj5JUCOrOd3ELp=07pJ#5?(H$hg{L!&X@; zrYMkb15lvzh$Ah>B*J=TJx#n1rpz|ZZgc5b+`M_q`$o^pz}3TrdrwEF&NfLTnE*zx z)-*3(I~D8HKBIMqW!4)80??Rxi`K4Vj(Y#5G65ieH@OFnd6Sp`KI`QFN#;$*ep$f+ zRKO1w7CX($EIj_G3fZus6XOXh%4oMzj4Kx|U9?>P%GbVTIjVw?&W;9q2#j5}sarDM zaj?;5W}s+obC}s=d)oju$*`S!VO|WNI(`AIkNFH)>RYJf{gRws30|xCPGh>iyX${N z(=VnJ>p9yHVVrUN0t$YBV2zev-{CLV2062}xK%P)iGS%Jfh}{MDFpt(4X4Iqxh^DF}07+SX!ItT!yF_lw2u}*-cC$M@z6e=qcns_sVvaA9$OTTZ4 z`Vo|^&lqd3g6)Ze80>K_hEYh8uzGpnEHN+rSdwpm3N)@W=guu|m-BH~eW|LV1(pRJ zLy#G|O_K6QZNvUdK>bRXKCVP~kjV<%#o5e#RUnamU`F=JkxX(ON5cW$3NSj@Sk>JC z3I;_@(YH$wyFY6Mkj*w=`qT?nPI`|MD)hJ6anL#H6w`HL4u z)u})wrjTCg+ZLyFQso64P!+Ljl(-$Ao>i|z{iwxXN&Z7q`zAvc)TilCIdi{4LD;1LcfFuhnTNn#Myw0#p36`{>=e|i1Qp{f@ckSvoj?yen3B6 zUSN!na9^#c>ENag4rxOgh*9L{IyQkWTN&eI4&WZb5&(E+j;+)Fw}?N`PNC{qj)#)Bv)phdL03?x{+90-ge` z>6t>!=485)-qi!WXxB$V$kqOxMy{BFsv4C_F5QJ_(iFHR@uc604M6|)B)4d~sUk~I zGk`X|M(}qyt7&C3><-gw7N8NT+p2o+*VQ#|Rgbn&opN}%cytifAt&qw7_5Z29Ai1M zvMu)a)Fvlwh#U|!Ye79zC}#^a3FRpa1Ew=2F)BT(YOrDFy2z0SN&qiGcw`q+w{Op}Pg7yBnlay1Q#W-f#WifB395C(p?}&)WCi*QJ)3Fw>*C z4?vwXBcYR$gGE5VnBE&dr=JZ3UfK#rSKh~O#C?$9QQjd?0~s{G?I)0v5w^sW%|_%M zFNz7Ai&0p`-WX5zFF4X|1o{JsQ{}ax%NBx{Sl_m&Z$EMkKee=@Hdt>(K#+9wMbixX zt^~rtmb-|bZ#qNv@EJ)?{N?njpECQXrS^KN+HU1%^BY72gn^!=B1@C?hv#{}CH!8& zba>G*x*!y~apPpl3rXLF`tO#Sp$m-(jTItlsCsRI%TJ*Y5di~9l*)YmH`N|m$UR6= zT$hC2L!0;UO@gc$^2F)%9=T_VOVR$IkPyCiTZHB&?OmMX7FI4BMMeg>551K3i=7o1 zZjCjOze#RsASBPUQ|VCU#y+eIXLS&F<>Zw?D-dW)yvYInoTQ;EA8cky2r=6VCUELk55bGCg>QFGteb_K;Ph$_fw7E zDd)6my5XQwYZEP>`77C{ueV`>L1(7f^L)2{#GlS>H~mzfss-iLyq5UcPK#&ClBGjX zN)8jBulw!Rg zV>q|kaIe^|7vKhRZLP!*GCh@)FhW!xC$?Oi7F=!;zg<>jC-;sz#a1#@)`p*aWtls= zYU#D9g6>v&HknsSVPPH5v?Z@br{L0HQ#M^@V6)d+GPK)zQBlu?=Z!su_D@CM&qr|x ziuHnb1Z&Q`o)Z>~K*#yS#7Mg#DKHLK8Hp)Spo+K!(m#5BU>C;EpYFE%8m@HLw7{YD zU}5Lo)I9-MCG<>rmu}v$SL$SY$g?u*RHDfouMRtSbrpMfdr?Ls6@M35ziOg4D9l+) z()-P^kCcUrvYWlD0I>LhtXFVv8y%-(eujSqdfW`uOHk1)QNrYHwodo{^tz4OK$~JV z`?N2et%B>Ci@fvsf_q1}iuKZqS_zQg{jwHKhPMe7XkQ>&e7V9T>$eO5q%0Ek9vmH{ zZ=49;&$6*}26F=n*=|3^cJ9*PmF>gt9ALl=*@=)pY zFjDKZkPkWb@n6-bXpXk>1;McmoeYQIZSt|X4+<=18vqyA% z9}Xa}gYT^iW2{)X4ri%@GRcabiiIgLc^e1LUaEOQQ<2a+Q1NUY0u~s_{&d+gu~xB z^MUHyYjmf#TvOF#8%Fq4a}*`c5z9{THXd$%>N)j}XIEF|j(+8A5?{$Q;41ciJmxtJwKGvADmZL(<(4wB_m|I7>bW=dyGJtG*eQsN=1;z z&pxDF63d`hzXK>mgE;1`0%F_;FaX5eMqX#R6AJj@COyLCtY2)6ZD`qkW}0Od9q|Q! zwXzN%eMW4ek=k+}pwWE7A@iDu=yGDqogSAw8#+5zlJn3BZes5qtQJjqy9h|k(d-S_Su$ls*T znkp}A&Z)w)Oo`T&w!=g@enhyZxqWSnf|8iE)pI>X2SX21&spaB^`e7~J%&$PZ~Kw4 zdyA8N!6u}D6Hoc4!DOMMn#e1^*bNEcIY}xN(c&%_{lzdei<#f=QQVruHdT-jV;8*<2O|lA zP^*02XoPAs`J?&nS^HX{#2c%-UmcjMBI>h3JYY4Xk*OA=rrN*Yt66LM!E@qL9;9vU zVs3_`=Fztj2uV}MQ-JTz@^J`BaM(0uC=SP}aSe6A3#oQ5#uehRx+OX$|935#5z^gm zphLqa8d%n)54Pc?px{MnJ##680dUr;ct9-TGh|2W)lw2**0ETCDT4^(6LRP6oDQm6$pFJEouU zDKI|$$SbA`;8GdqTDT%Cr9dBKSp&#bcp&YR%1}HMn_F(!KA6gyFSQ+JY>;6-0jo{@ zVKj|n(bOot7oJopSU$5Jy}22Tx3R+CH`RW>JU55wjfQ!S_2iw_IKb1pyP|c|D>Fqo zGmp8SNT?Je4?v9;!>cNWZw`E-#qQI;SJp=U()9@sj-ug6*D3cLg#wdZO$eWSBTMJG z!i_&to*J+uR4`%9z0MVme_)rpTbHfq1i?7NDZal2Fe(1FG_s)oF2_$QT`qzWXoR?iYq z{)Sp13lGU@R;oa_m%3RjJZIYcmw#JUW1YtT6_kPib|lqr(A=|poMJV6{~R5Tv5I38 z0M5P}>Y@L4W$I_VuB`afTClgWPBOL>{(7`EQsHURgzIcg-{*;xU|Xr~%L?B5WT&i^ z+_Um=gY)?h3)(7A zZN7Gst~ccF=97=p%-Ng&jABnKfdtk=NonxIzAr0|;NKlt8*X{$0%N?d^}3R>6tnF_ z@fJGbwTkqV5Bwp;^5d$lz2jJg1|eR!=P&18vI9^JmYiA+RFin^-cZ7F!MJkb zw=@d)?U6l;Noo1B1haNsJvS+O%YUOLtWRH54l)yUX;!O;>`KkVFQwGf==t2V2Zv#U zf=LM^+W@d%!aef!`IN-fyzxQrxK*5{iB0l@AAG864^#ltz> zm)9!BN(3A6j!W0~7+yC3`NYH`Q^djC4n8y{#d&+S(yiZZEKgBXy3v@A(mLeHQ6Rlt zc!e96x~*5)2```Pw=zQ%5-av1U*>YJBtBn~-Zv$o79|ldrOhrcSg}p)+p6!btjvWR z*&$Y7JdjJa6`*7y}eFWTQ+M907LKMD^}F(Yb~p_Xm9}tw=SE+ z*o3J>PU9;*66WZUdOtspu4bxZwyn(#au?ku{2e;jAO%}CjOR29IA5`H(w%ebH{LRj z18AdA;XQ*6eUW%B7A@2Q_L;p%FixKP%P#9>t)ys|&x5-1v$YvT?I)7dk4-N~=XTN} zTXmQ4DgaXtBvh!o^MRiGY*%hyQu*LslhLXOFgk8DP>PR=5RRXmvX`a-L+zQdwwsze zlAk_C`qPrTa`@dgACo96giqo{x5cXEW`%1-DEl9^3jiLyiuYtGq|SHTB&FTe8D&4R z^cT~a?CAb6Et7zQ%U*~2ZyxW<;?7*kYP~8(E@Dmcl`SkNVwm^msw^ecaQwYe zx*0+7W1A;BD5Y`J4wh;B5u;SL_XGhF`h;ncuxSW!1ge}EsSQJlFsfeQ~5VNO(u-fPke1d$je00K&)nBCMK? z5n*9uCB9DNzgu2M7~tCxWHH&g1swx+aKKZ}Jfk}rru6Ej<5++D{DB{AX8>@uWU(1P zrSclfWQz}M$;dlp>i5GtZuKU?0{~C5N1*WiR<`qP2pw!v?!oSj_|39ux=q8vy4aP+ z#Vg5F#mx}OvTDW~cUtixQrszItu|3RPBg%l zZQ@eoBF}q$!o0`xer#!7ooKPi=U>NK$L(Q^+Ew#UnwFwt8u84P8-4Ug5|qT)^m^3* z8kkH$EjZ!tyt=d~^n*985_EJ0WfPZP6JBA!{Z{SEs;T-BX-Z6bX0bPI-U{{pFMz*q z)Z`L!%DHT$d?k8J_iHP2pVt{BS6ippWmd-T>q5#n1{yXumWaZiBk4+@o)ICf2dgg% za7k|%ECtRiE^*~q+DQAr?)S-gdxV+cn{w-FJDLvPQ`JlXO5eHK8PkmWs0B-+@@DD= zo0K{uQkVTYMo1ROoTNBQC~OxnqH6A@wMarIX-7M@i%2fFJyFMPogHZYIhVyvUHOJ_ zCN-{1QsmCa!fh>YmYcY5yjgP!zd5I6R5;1ZUJU!d5>}Vj%Di|xBFExnyUe&nbe^IjujTx{m9{mL zky^Z--F6W3%_apGr%8$zjVe9u2dpL>m5F7oE z_X?JwseP>GcDz6J6bXGt`0CIWV&RsqwU?KhL=>A{YS2amdG)odk6={(mhxtxn%1gF z74wf90o5Uo7gyw?h7RL>+fKEY>aej4*BR>HjKI>7V8;0v?JyXvg26cy-)BjTjZS%U%F#y~`M|=w}Kg zdv_|r>V2v&_tPTZT$3)_7{DFMxy2vbq-Y3i)}dHCaS?Wryv}AB>vOC@TDQaQZ%ALt z`CQGhO`aQtr~~AucR}Q1UvhT>M7RLSo8;O+(dZz^AAatuF=apL`VyCZ$k0Abzs zTc9t5dlcLIZmV?RsqgADqxv21jQ7Qh(-%HW53kr(VskR2ak{pX6yg0lH%|wZ&1p@X z5+DiYhNdKZg>6Ku@XHsixYWGyd8lhFesm-SACX43F52#nY^KH1?~3WJ$p@A@^5qxf zH-8j0*wp`Zqam`?l8TF<(UkU;!uPhTu7QxR#1L5IO*qrHl&0lYo$S;OsGSlZOO0`@}{6B{%tjDY@-E^&g=j zM-rwj^ewdoYD@=+`0wd?lG%g`psK?-+4PqN_r3t;*1V(DLp zK+r~8l+Pvmm3m0OCPCkAuu1tEpfWL+oXgDGmAy2AUqE|oFt643Jns<<1hCNIybbe) z{i~~khJa-Bm2WOHE zn#L~WT0jEbj=VjN@p=Thaidqb@Y;TVZp`;l(+lb>A<7uI(v46*cfH(8wok=3BgqM)>`A7kFNK)iA}GRh~u zlsk~9$s~S$&8}X&QVznTA4}N1cev1<3Kdiuk1LOisZ^FCLv$2ivD%iIC@=U~^oA%1 z7JM4?Y;fHiSexh$Bi%3uwC!BBlDG~$D)ln{u%>#WjkNft9;4ib_Dbd5Tr0cd+bLW5 z*EtDizFYA$rPIP`_A%6L@ALhf*gt}VN)?4Jm3dslWEkFv+ z(-Ca!rGs1P*gi2cCuTHCP$8Oq)!FN2iw}p`HygTwl_3;5E@4%?tp4J4~|`CGS5*RbE{lk3t_`ZnlvXuNEw4 zloHT)Zk6Y2hDk_dCn0EfTVnhuv-gM}hP=^%?HI5{Bi#tzb}-S$Uo{Ow1Qn4EFn=!7 zK}paK>o#wCFDLW;y=TI4HCLWpN!U!xgT$ND(FXl$rD@*_Hsy3>AiyyeS*?-BjPy*9 zzxse~8xixzJR`p$57{O_xr&4)SMN28quMsj_A1s#gmh*p5cX59LPh2UO*s<@bI#W zx@7x%W~*FTC?2|NHqnIw$h~UACbhv@L|%qzb&x9Fvh~@eqL;JJVk-yH0QB z*fv4Z+&Hn^Sqc6iS+3%I(bJCEBJvJ_lO1HnH**dd-hQU9!I|U6AmE=gjf1#Z1gd4h z@{*Nc1vE*#ql~TRM}ehH`Nd@On3ZI&n;C9{;W`n483fM&-xYp#q-+!-4FLa=oioK! zu`Q$e^Tsgx^fVRF`;A(gzs0g}B&I*ZOauPoxcM3yhA;8ZW;ZCXa;uOefK~=ctUmVY zFd6+YHH$SpuVOzne}D_436H6?&aj~tK)kDb1Hkzh<-vqzZy-q=&b}HFXxsf_j(DJ5 zAwXBU#*j>FAMY7Uj3byEixuIeJ=NGlX*M7v(fj+R!0ou`4u<)g^-WTqxVTIJ!`#Zu z8{N@;o_o)p1LLb^hm)$rOC=f_sy~DpSKOmhQx8)uV3`*YZ#fFA@U5?yiAPZq3ZA$S zPL*6{KfB1k{`(K5%eXKpm6^80sHW7WeTG_#p7b^xWh%WC{sd#Lh^;(lEZ($+6yyl$ zD3%9K`wDx3Q~y1x-@#q?2wsj!S>r#^2n(3RZk zYp-Z^f07)EnS9>$yRbjgX^`9HPqxzoWYK4)*KYIue!D-W$V?X4_O)ON!B#mjMt_$p zTArzq&VJS&W5aO1BY73^Fgz^YK?GKvs9MZ>Sm2J5CC1kRX6DASccf;;A00EdEm}WB z;;eZ6zDX%@6}E2GxlR^+DnesU!rSz3yuhcD-v7YUg|E*-lEZF1qdzL{yrQ*yZ=~UpHl+ zz}ex-2v)3j*KKG7_e_rnW;KBZZ0P8tni}szocUCP?|BcQnPJ1-NN>gmWC|$%;H;hn=1Y9x}Y~ zn2(hENq|VoPBsEFdK(5}YI2hJ%m9_59|e+JGpd`^{?l5TyHm;N8V)8?u0bZ00om$^ zb3?X#@3Gl!`)w{%d&WW_`c4vE@Uyi7sghw@@74X=ML6+0dt67R7xSuVyslb_c678i ze^v8vH%0@AaVn~-;@-TO__sC7R(3fYfSjKqx@hsWvO{qhEq#ZvQK@gKyp^JSE*rZ) zYjz#hE2hm?UZr7V0Ymh&h5J9(;9Y*I_J$#(u|PgoG0Fbw1ecJkEVA+#YpgbGTpbct ztdqw(oU{UkJj{&omYUU6Q%XnRuNq>cxg*!uMwBh<6rLdb*Bg-vtKM| ze-_>eWOH6gCcQY2oBq>K%@TaLQ@<9x+*J5CJUhjf4w<3eXB{E%cUvK0|Lx^I#b`0( zRb$|g9&f(TjIC3^z9mO~mG6-Bup)s+?ixC;B&gr^+Mt+X`bW6jm&^kEGx^7mVL*VjetNWsFpa_Wq22ew;?e3Vyn!C5Q# z6lb=Q;^l- zVe;lha9y8$;ma3Jyj1nyr|RPv1HuFWpCI$8KmEQ|Eb^AYyXiWe#mB)PH(B!w4`32*b1H|AAa~|Pj_2TqaqO7Z|+}>>SGpel3X1Przi_DsVSYP zY%?IrJjd={6%4dOH0x(%(JQ<81VN&E9v7)EF-3KKgB5i8e+KrdrW*ZqRv6o(fd~-U zt6ml#ydmst_7gZH^I~j)V?7rhmmDb{K=QVZzofG4)x^%3xPxclSIGBgJ} zsTN!peM<}8aBm~1jKA26pO_`nqFwRbPV4Tag>I|^g!FW@oZe^DYn){fK4#u*zXf8` z6g42%x*5GBdirj>2z6)j;e~!tQ1t2`c&XNbVeQ{#?nw_Fy4N~`%t>BolE)QfJ7)jVu~<84593^X}&?r)6*6Y3Nh2=#cN{( z$nm{lvnqUAEOx_|gk1{3)IROMm17*!oNLx%S@Tm%d*Sp>l9y~W!*uZv4W&n^`Vy}; z@<0sgQFlpdTq_3Gif(pn8 zwJ`zImf<~t#>cgkXktN;gr5Gsr$+YDk$42bApM2UA2VI*alf;fvG>h5IF%zOz{_>2 z_-KZ(%MXlqvTGIOMt>Z^npl>BPp3k|N*W=mN!B_n)j(m9c73feu2u4`wR^1Wmz;qI zCIOgj`%`p*SS@9s<;3p$8%6v7!osmAaaE=NzzgcnaiC~01)uNJzjB=?NBBd=z2KVe z@72UIBLSF9gY<#;Jc9zr5M5H;#C@5Km&iM9Bm2r{jdFoin8lA`j9dV+%5cCFsPSo% zFuO1ye3=kSOxS*?icupbZKF+&JTWrb=vX*(7T7C;me)X#K%cD6#rk5u!uL(v_YGTv zCN0#DHK+l&W=!p16iK|j)c4}QDA=#+4+9hozKLp|7TD!6N|AWRr8|q1l2oj+k+dGG zI#d^Z$^g3=&cgw!=wjcfgw^1HT#%V$i?T)i6)09_PZf;isj6d!#T+w8jujnxW7I0KB zzC3xQDFOCAk0=uFIhy86fUk88JAHpC&Z6hmJz5G-Jjw39cslyp+&dluluu=G=U}~z zFNY34g^*iqOfq|LZx%T`=}>|C*aXykWG%Uem<7KqR@k@rzON4t>^^Gt4(y*0Dz0J} z+XV{#zHtE_YNYC(n(iJTP<={9N)y+}?+!-NM8F3E$3nswW7idAd-`wPmkjVee4%~w zWl>3ybd%lE4+CI!3+dsl6ON6dhn9Ezb+MAe*`W&`so0AkUpM=X867qovc0Q#bLR>G zFdgtq_p72}IK2}9ESclG)6~hBki3MIE#MZc_c%`+o09%-TuW)8YNd`^KI#qft1*v5 z5R&AJRiaXxOY|D$#di3_->v+}4V2-Id$B5JGuPWV0I3+Ds<;zD87t!MXmmjpgjE zKgxudcy_d+kaoNTCT`KPaFFodJo44flkyK0Ta%!rxO?ms3w%oX8}<|VC|$Kb26fII zffbSPA;oiPI}pL-^D&rj=W}-28@7VfZQWkcdyznt0UTyw@PLW=| zbzjSIt~^-;jM9dlkkzRkARK4LkzMySpRgd+EG@Q85)>-$>Q9NE7Db$4BmB&;iW7R3 zApUmGIZsHg%BOhefJqWS8bw2Fh9vMgj9mVM4`wd9t37fS4Vl2#3Lxy-83hGX1h$V* zx3cGBtp`iqMmw7W{hzabHOU=PXAYdA zT<)_cWwOB|Rjgk4cNWF$!@s+?vF=#d2pdS9psjtvlgGhNR?QvmQJS&aG!#PPBKr)5 z2@!Q46IdMtHe{goh!`ezI?W{qw8B!bDOu}JPewXJGF!f_BB_Qv zI+SpoqByrr$erN+#o|vPf+1-qCGXB`xeGOvRBHSF!~17MzCR0}z$0}d>o$a&;GS)? z=kd4;_8VDI&_cAD$4CfN8zvhaTz|_T`}Jq?8-hx&ttj-Dn+$x~PDVf%sEt0GdBqemnXcxRg|LL7s~`<@J90r< z;C{oR?YTh}MZ=oA_qcoKywsAy-eO-dVtEaNC0iU$RcJ$I|4@kA7 zF^sZZXhprZER4AK00TO3Q?d#1tOZ}nl_hVHuwaEyyF->rhYF{=R=X&?o&W`!kIa!l zdWS-gbVA|*v1X6^t2MP!1xme*M!%cjY=!03smI4|BHh1MzBZfh2#v2Q(lcOmSY^9^ zU{Nlj9NcF9M;Z$;7hVcm|ax2H*{46yUc*-<9i9>Sx8?Nd}U$^#{Cy_Mh~%3uPQq82Mik%lLG8pZ;K)cvJVY>}BSeX}o3w+&%MIbSxZ2!tYlGS}EUDu*nHlt=gKnv_S&ZN30@A z1O0exZSHM7vR0i0bRvrJab49%@eYL3y%5@l@}v`W?cam$Wp60}iVL+9WS^KL^aioA zrOcg-&Cs|U;?-AP6lV#GD}9tdXyZd!?*OF4m7!KlJ$?z~Rd|Xe=D8Rro}!{g!D zg_Wn$710e5Q1&PQ3;M@%=(vS=m;b)9N9Z?xO;dM*|5~p_uDU!ud)-sL9byEM z`~A-0r{vzdFW-h6v(!&(^}QKC)Sakdz7^t(zk@`7#N5$(pCwWY-TRdHp>q%P7g!lj^<`UsMCH)7|eV|aYH4U=xISq!9Lj>thJzQ!^e z_{~H&>WqkWb~pZb$;an}S3y$RN*r*M+~yh3I3-d-MaPzgL1;Ttcm@wd4k9O!l!~mW5wYt1+OJ<6J?d+_ z2xqX*7nL7jh$dEB@qI+yBvMIdOiI8F=y&H?qO1W#B+N5l2d4h9s07~ zN_F~;?q;mZV2RUW$w>xpj|Vl~*r=aY4H5^XbVS^5l%!h4?{al)VokW6ws`;RlB(cT zT6urC=a-+Xnf>!D*Nc z=Runk8c*vY4S5$(GPhEg9^Qvf-gW>s+>IiiPD>^aX^z?8-+pf<_2Nq-0&Wffzn&?s zE0X&3PE+?J*4YWiZ{HMMCWy)L_f>*^uBP(1i9Kfhp#ne~RZOhVn1fv)AWK`27q+_- zHk|MJ9j=Q;n^1CaXED$d@;Zj5*^BisBKlGyGXbzY;<;Q1gMK}6b@p>Chbcl*tOgk- z`yxZfY%m7dYlbq*?fj|uR0YdTjE!1+`teGi!oJKK9O#q_iOhY%ub**O|ED>8AS4=Y zk|5$xi(rnLEJ75GVr*S+`@iD2hwH<0@85=ZZ&n4VceW8&K;_uCO}I! zyvyN%w?DVH6>OP_J_HL&N5y{Ie&0K~OzFSi#Weq3A?xA_td?Q-x=IYO6l^u>kW3?? zLQtC?(V}QNr4}3eH$gc|2<^iAe5FaF(AT91vDVpbKxd@@P%!E)IM2#pgHBEx((*PL+ov`?UB^Wo2AhH zaMEN$!lqy7X^BYJs3FY&v28MIyq8G`wsW+X(x^dhCZ)smwPazBkHKM`SP1ri$18DS zOYJf@q#rqj^cI_Zq0S@nky`K1ypY+dOfO@L_D2eg(W|b8*8X)qn#20Ur{;U|Hq$|p zURy;-JKZ<;Cj2Y44|o~3g5!>$*uLv;Ms}~CsQO*O-wcjzt~k!d z9dwI$F#JLiOv*${LVaM|&9)dzne||!RY)Sp=E`r&AW1%^q9g+1Pho17!$OL|j96RG zd(;P73@t`m`7q-PTlKQhoQb;&iP$#t0bCZQrC^|5WJlaIN0vofa5)$S@sBF; z=h6G=`x#u2-ZPx;xtFW8wo-Mh2!A*Z@ms2E+ZdmNOK&$HLllYj=M0{kH1~=KhESCf zO{@>{*uQ9aCp>Sw`))#~W`k*i$mjgzk7Uq4Wpv33{4pZyTgMTb; z(J{CCEFX8Ho}@r1l2jULUoOy-^oop;eHKMnRy}jSi9uh@-jIv0tX5Fzfj-=L7N%$h zGasbi0{sjfbQcM8IibK&%C5*V4@K*wgb}#2H2;hZ$GR!H_{&{{h2E8E(u>_+0#e_p z0}>~_^yQKQ^`M4tPQNBeIf#D(&x%l;3lo{l3= zc$A~36q5-BfY|1hS|x5As@1;XGoR(ky{dOX1I!{tzO7w;99vHlnd;%YHeV?^AUxnZ z5WixdF_|KA8MM4s>yn~6Em&`EX_ce{taw}Oe;bGHi*!qyUR@R?10D{jC&iyG>1!vZ zOj}XGR1z8a&Rt9nC=m9n;4EI2v-fxge$RKCLL{}lpdjrpu+%_tT_cm$|AsGnD_Bn9 z95DMyw?xUBZu8eGp0$Cm8=L)C%9s9ptUuNPjHYwAA1xUhK6}jOb=V$D1r31yhrw0K z7im7MkNI{#KTG+h_+0EtDBUhIoKyGl>uC@4to~{^dhX$hrm=PXZEd_h(s`1-Exz&i zJmu34Kw0VyKV?LVtH=2PwCY-v)rm+Seg3Vg1t#=p#JK?gE1WX9{gC?H*abruNX^8{ z+~{EBESz~L3TF0D)O{v80O+fj_uAd!t)@nak z{F@`c<+6zZtH!R`)%aeR79P;azk}uLHfzR!YF?7qBm6Ht0>t$3$+ba!EN@wR69MVP zh)`0(;K9&L-Gju_FilwO&bq=l%T63kqI0MdsYq4wz5yc9|8@5U%=yw-8=>g``OyT} zioEr^IUc-C!mtn$KsmoC_i9yFrX+v`_{m?5o%2BB*KaPj6&X`w2};Fa;1L;r=E5Aw z>@CcO$w(eoNhuN?ReY+0eG)gX@_U9c<>Sv+1S6U~zkG$g+>62|zG)8^(tQlTC+8cL zU3R)->azl&U?`A3>g~8rkH`(wS{H72Zda(OeKrZ&%^sH2rH@ez=lIHmaSd7euq4R`)Vv#w|tl4(Xhpev3s9Z3+sIl7gLB6pVyi7*l zDqt=V$?_HY$;+DJ<=B~Oq2pZ6^dMs6f9lHQPsVzJXJB@8N9A(3c@}huBTx)1Oys8O z5f)kNO<{W4{$pxIobeaky0i)M zBEB;xY*zTIMjetJZ(A;Jj5P)M3dgdrB%%YrN5wU>*DVzphe9!FkE&9+n5+Ah{F z3n%T|t$u+tO`5-YIu{ll<$u^aDTFFnXlr&!Up{A;8M%p8alML#Uz- z)jJZ-sCB#VSrW3~Dd>J`1yIgQ00hTlwLFLb+%8jQO26Wh7p&iPVqsW~Xxl3-Op&~m zzTPusydmlHGFmknZcpZw=kZR{S~Kk(D4P=3L9Jug4if_VML@zy>t}hornwz*yVoiu zh48PM9JP(j=eKoU9p%)t@gAk6>^GvX|1)oUWjw^Otou338Ct*>Nz6fMn1$g`9CeY+67DVtqucPQ43=UZ2=@#f8^fWC8p}?rj zjUCPX(|%LKMsAq`0m6XQYK8y0y0qT*vDVf7MzmzXS!b=9)#WBHIlof#0{Z~Q=$hR)t&V$Dxu43kz?pD5ll{2;|r6%GDrpdUDVkEO}y+zoHC9!B96W$lON|9 z+if+U{7mZI-F{=J@n>0K_;p>YvzU;hWnpWW1wJ10s|^`XWgcz3sQz}#2tMA6M%t4cpHFE+VN z*4-np6m#~UCtRGeR6LbJ4;5YS=g3lcfJ2X$-9X?6&d~&kl)k5Ds*h{Se;5K{lxRCt zy5?OwB7!z~0N}B~u^o^i9;E8A7~=po2xW)m`EcpQmU?UaQ5a0@TS6(xe~sf(@zmn_ zOm4#`^SkVQa=5><70DVsozt(rnj4VKN5#6wp%rKiF^cD)^Va3jhcR`B9jF?PY97En z2cTWo(#P<73bW!fj~=m~^%r~Ey&x?$7BSD`1nc~w5 z(0B6B7t#}zAh0=9^FD2-o(i31G!8j6jRzyY#Ucm%+!e`F7f*(!bXvDWajx%A0RVaN zCj;9T{|~{Cr_zCOQZx&At*c^CR`-ucA06fG$gS543`rm;obN~5tn8FYvB1%`f}0Nf zceA4anl8#I9|D5l0`bZgo@}OOn#fmt=6|)~kM@F?{12i6j8!qF>vyT}aJ4}Jw19^* z{4|&{?EHz2E6P^FyZ~_d;G`2`m!0{1iAd}B;H(`_Hb2C2$~v~2%qXQw(o7P_>bIU` z6Rskv3!wd|g!t>SzgMMJ8>5tCZusL`u0i)5J@7Bj_fkOEv}wB-YL+o~fu##uKUhXC z$`Z7FLCasNjG9jTeZCQC=6t(Hg6_|+GpuOyGw@GNKp3n}++))K`(p4P{^PRw>GSst zQlMZ0&L?!?L$DZ#Dv71VSysrF2~+7vki5jQ6T*uC`DT8fF4p}3Z^CpiU~`H4iQh-3 zD(3(6FfC?ZlxPn^V%amdg=EgL^TzJrI{X56WT)!Km1P-;x6aOCHka8%TVf!_tlx?D z^cLB-)9I7E(z^24cAzA|6dv7ZZlw_Wj!-^3uRDc9MSHtw?EZeBBiLWQzri0 z3#|Nij=gfTr8g)x7xj8LbrY{1DHMELqMJMn{UtWB4G3h|9`IPC#k?IM7%M)%_nZM1 zCuNJ9LWdrFDcx^#%F%oNCIb_wP8u?NOEGo6wFF6KbWYV98Y?ERD_!J|e|(%PDI1JU zeLiU1m^~vh4kfhW&v%GnmNOTAJlXk6|ITh7Mo$d+i5Nav!+ZgUl)Di0@oTfL;C@)#xL9Hx+Qal?%Gn zKwS#r*3?vQMjY7vDGgg7UXaRC{(MP+D*=DB zCHAQi)xi;iT2rtKb4a-ho7xtngdO#-!RM8I4S7@Ja@}Q2>GJ!T?OKZiNd8%}wR|y- zZZ>e{OSOf;eow-ow{^0qb(=?lVC_F8HkdreyEwhpXnS=>N^_FzK8pdHfY(NKl2 zK7vJup;mPTOEp#wWV#YYggRa{R`hTE+MmOU{q*0#W`h$?UfWy4Rel=&`Bz{MclRdz zO5wBsi`$W7WJ@pXv7~MEJtGntIcCSeJWO-S z0^QpLe_m9X)&(i-gP3^Pu5hzB%m}_3z))^U8}QY?c9^Y&Ho;RG#AgO6vFKjvklpJ} z33L!6r^0@HK)?SAn_%P(bq0)aPL;M?!&mM~bb*rs;ok}AQ(Jly7*UD$l*mACLiOs< z=uUcq$3Q9e^GZ!DOex^z-mqivTvRtlwUkw8ySPH|2jYIAu%-(${>_2=|Nc4 zO|IR%H@rp96!E-8vESb|=$!9_Jc=w3x@TI@Pc8SYzAE~QCHKADVo9H*Z$4wE@N->T z8~G2h17mw?146p@@?9_03~+eR#v6iOwOw`z|9lp&?sOh3U@B}r>})Q|nq$FG#@lav zv)P(m)8@#`%=|fu8Nbi%ccF&7ka<1xU6+TU)-Wj+P(~T2?XKsC??mGL!Aptf^p~L& zi_YcH!G~}`=hPjSqaYU?k=g_K-iD&h4ja2MNt~_@05MKuOQ>?RGh{I&S$+m}DBc}B ziyv~UEP=N5GscJYqb$|m?SfGIdBqqdiqj;vWvSkqbP*T8*FOOiRo3=V_)hX9qc%ev zJzZ`Grg4XZj!C9VQ4VP!@hkGqiiLTTS4YC>ek8P*X1t5(6O{+3gl@kE?Pkg-S;{O> zL3CRMXNDChgON`Ab-dQ35@%E8`o70UM|ey` zSfXY)E-l#s@tt@qp5#Kw>c8TZDkE)gi$&3J0K8j9y&a;4U#UdEkLLQOm4G&jAG@?P zcMo?;C8!PCY2M~XDYw*ZUgPKwUJfIM$uWM{UhBF6_kDJy4)Ow?&y6@LRG-S|> zBP%`2qXy%?pp!?5rz(NuC5{M1Ph&26M1$JClYhc`sFRdaB=$Iw$_RV`$@*2o_{vQ} zgYa4UTeenVU2Vkn`_c$6J^phDk-lz^cDK8_UQ4XCjUiQ5+B~l_IRMIvR*13ko z3Z;@?;zPf#cHzizzB=FwzQ?~NL-v+GgmU&$PV+6u7Y+>4xXw7&t$2E9+3Y`Qapdg( zitLrUfS~oHl3~LF-8W0V9TmR|7K?A@DwHAlwn1@8lZz)R>S=HAZixXFmyfPGWJMSJ zzFqM+1ZeLcLkA6R_P`?xQ`9XZRyZ!(HuJFdK-{k{ZhLx20{YR#_d{JmJ&Fe3sRsi) z?tx4;@+&BuVS5#?2+*B?`IS4km>urfAMj-mXr-9E0AdaA@GwXsZ5bP~wFYJW*NeTQDiG*p-c;P^R*F*f^zM4a|2GqXn1`M`HNetp8UZiTV(hfZ z=Fm3Okmthbggx4Vzu;@sp*S~w*lQ@R4D0@jx z7R)dssSizhIfs@XZR_b?4(gU}bD#LCTBY3ppamrgW&659)RgC9r%AGyKx+cT#jsFR zrt~3)mUY^ZaoUilVgn$VO0w>kzWwc?FOtAoEN) zg!*Z*n=b~zEf{>6odCpMY%P!yE*0ob{uaAL5mGmWHL9kk5a%H{SP9!*QU`iQC zp1Ymx#U~$qw4}2iKYp@!P!;sZNtny>dl*!bunGuAYwODH?&9hd0XmY**Pc`2AEpDn zW6jNHckWhOj3jShPSMW>Hw(NVKLb_-0f_28_?1fN3!LPHPYFGZO=}R4me!6dy+{-( z7*@fhRF>u$Y}3OoQ*uqelh|VIX`d*8=JVW>GVCEqvZTl5xSsrvqKBsPH}4_ymFp|m zm}HanMu8X%DwXYD`;+W?9_|O^sC6y9 z2|Ed(%z(UO%aEk!JAD5RQY3c8O9b4LmOTL<66o*A(FDk2$7pXurJf`*?376iV;fNn zLJ*wzL{FqL_Uz%7*rrWDYj4wI0x*t@#Ry}RS@DzjN7q>H;nz3dpR3oaO&|aO**w^A zwwc5-Q-v*nC9sD^+klm#l95QR;uGngE>F>06r!Z{MQkA2ZCx+WsNRSAD33N=6el6y zN+$p`(0oJ&R}cGPCzcG2!dddsm;2ZYsE`DPdq7(+Wu5{qNdSZQ#r&Inp!9fWcffAr zyTpuota3UltP9;jb_Z+P`vEqq0+X?}&DIqK;W48_IG2_MytAI%M}Hg_M*z%eKyPCc zV=V!;wCy8+VA*dYP9h*o0T8oCDz*-*BY6O zZI#2S7F#K1DfXak0q`T2;}4KV$)F_Dl-Sm9Y6T$qcJJ<;Vk6EFW-KG;*jFs36n-A^ zxNb1=14l=Tk3as{*H!ynmFYgXci-2UzD)`~Ewf8kGFJfNiL;FM)D^SQGhM&F=W9vl zN;XUO($W*agMC@WeV*;S+ud^vOKIe=h?QaYMD8ohn zoD~pY6A*yLA=>VBKkFtu*1evE*XXOdeAb(S0B{C+(78K9Jt0Zue?N!O#At^SYgQ1D zU>n9+Lv5|H0rWsP1|tDll60V*gZfgSECLjxlCiC_8T3l=L2F#7>>#((ubpSd8Rr9W*Tf1FE%2Y&yVQC^c1u>62huB^WNGzcLkv zx-LCSodBo``%xWNy>n&gGe^T{2aQ~my9CjpUq*2xz_l{~0`5Cm4v4O4%DAoc#ALoS zCZq5V57Wc15Xb4I8ycs7_CNnmem*Nq1*HGN9)J&C(o=*;d`{`Z~&HObx4l=e# z{AZ7(@+TEPVOVg2MnUtco}~XNi2PJ921o#_K@e-1YoL5uGYOohUmDIL{hl4LD~H%~ zQo%tKutY9k4+YfqQLt0v5*?6^Bl*;m{n-bxQV90tyBXjhvG0FJU{(EimucT@P&j~% zp_FS66l7Ho>D#bP#Qbq`1EYgvaSO0$-bI@(%G;~guGt8QN>A{X&p-Ix|0ds;Z%ajc z#-9XDXL3LWbfypXOV((T_k1_@QaNtit5^M_T4u%mOt5!{w}j&=OTFEpsaAgieSoMrP#SL7k5Lti4HMD#6Fu_CU{o4jxr*)eG9eHMKUVKGmrt zqe3`U^i)<6@alU}*Ao-KuBz7CAHMVJza9xvU=8O_#G(jJ zL0sNd5`&@xPe8E;H;FE2Y+6HCuUs)GAnZi59TF7hI^XtA1v_DdBA|R=8!CWBB~JMe z_=bu%Ndr}5Cqer7@grYTKs)VF>*&(Wo+FLF0>ZjB366j#LUm66-tIS$?6pqa+Okbc zl3#(wk3Rl*@#7!=*w-h(tNW2eHyA+u}+P*H3f!>qei9jrx5BGO| z_RIlajTeB)NZ=IM!+{1fFs0pZEM|5(b=7h3^3U(c_$G3)sq zP$@vG?(c+ntxYN|t|@VU^~$LJba3Y3BeM~(S0w{gB^P#;B&rNZstWLrZ{D}ZM z_*Z}N7k&pM^wnee(bFfc_D2qfbtQI8Ksu5$NsffIB{q@9L3;x|uVf)|jP_)Jn6MLR ztKll%R;?(x;kFZIlL!F76}tuMHCRjQsaRqRoT|!F%}q}FUnc^44Q8ErCbSG<(zDw*R zc3y039Xo$_Osg?x2B4)_#xgKn`s>>DtLZ)b{Q2VH{Rer5x-U95c1-MV{|xA>-f6dG znKRofr7wout@w}iP*Ek@ekplO(#8cY)nb!>vGs_pLEZ0rQ>ao&qgjMdg%~leOa26u zi%sf1&_Ekrqs6c_zyyF3DxTtbY&6-~N0Xtg+t&b(qfZhS(?|0?8Ec*mTafmd0QOwO zRqHwLJ~jY8T5PYxh5EWhZs5c9@#(!N!R0X&7)N7MoexSk0oHw+n;mBm0AcafQ|o){nnnB* z7eZEHp_AU_n_w%X?bp%b>b2|Ehu{2#U$8C^!^~0nH1;`1F>8RloqbWhjqGG9-owNd zA6);5HCorWCI*0K&&>XtnD=A{1}K)0PsQI$XO5tG#pUs@9n;^sxVUxmmJiXIlWcT* zoYK{?Pl`F)#g1X1R`MMmF8Y^NzS#Q#HS0O|Zrt>9+`V(#Hq3*E4`xf9DsEW5W|*P1 zucf2pyQCN;Ezuk^sA8Dz&wXeCu-RUCv!l;A^8Us^fY)FH(1dKl2(SqdU=t94xA1Ew zR$lc|Hw6L^93?^Duf0l_&)-PK0SZ7!UjV(_XmocC{Mrji4zw2L@1c1SBB&wSz7K((r|IaoS+jZLIklv5ln zg1pe*yD~?pTT|PmN)9Ii0322Pp^c4VAgG#tuL&T!pKB#y6y%{NtIjc9Y0*~d__R7m z5=IDJ8D9U}AO8!_9rJCvw0fRY(oOo#L9MSUq1|0yKMEy%j&FbV*#JrSnpF*8ki|}@ z|Cv{+WKfE^r;_sN8?4|sH2->*1i<6W26U1(4tfWsYOS8XR5uai&bup$zGiGtNu_Zr z0HVOFDj76BBMqA&Kyn&KjlTh6nXtvI_z{3Cqi5Fpv`mho@UG{1G|KNB3QC*Y1N1;g~38QPUM+vAT0GvP!!P1GYoYhbI z4taA@aE)trhL9u@+H;2dVrhLM%li5AyNtiH3v~IqI!73F03W)J$UH=5<`uon9?-Ad ze@2ZjKg;pS{i*UlB>$J+)yuQ{x&VMplmD+{CY^wlfhv? zf#`B%k>n^n>CODJRD~aX2cT>uUPUo?^TtS`VT*m|*M80O@8qSNP9-2=D;j#HUKxxB zi=)L?RJ~mG5Y+egA3Yw)>jb>3VznxCwMJ~0RVAISn)e#{t1;=lxR*PL!-kZ%PT#%k z_Xx$h?hz_~Rgy>MB7dr-O@vrs|PaUXmB|@V-^ghwLEVd@Sv-InG=ES{{ z-=0&m0;Iw}0EL~!-rkMHkAC>W0oWuF!8kalUmJD+S6^4cM(;oXT7d*~T~!reTcwIp z6?)m@wks>Bo|aWf=;SRaIvtxNA5UWXma8o`m%aC*=1!U{RV@bv zW-LlvVjM#z6;*uKGu>b8)aK~fzVDG~!)_*_TH{PId&Y*UW#To0RqiuXnz4;ax&?~*gUik??b;NJ|EHSZ)>m>*8NeOQcnjGyl-Y3(>?tsnH{l$0EHn7iVCmrSj=YWLYRH3FY&e@iER^B4Xt>m^s|JDyPbp%VJY zx1lRZ($_r^7~DgJ1M;Dz3vb@KWt-r^gL@VGrtqWM-xY8Vozm}BN@3^*=TM3r=;qB^ z{$8z-^br7nkAdm!`R7u|%)wsZf`UR;BtMfQwJ!w#kX~2OqGUEXi}-|Lm;=<8d`0$J z;x%bur+EMfZBSs1DS*2eD-=h5j+X0MkMeF>0Gu?G&mj$W|H!ZpRv0?W>w#BZ7YD4pol){#~3=+&;jROdA6!vaR6(7 z(4lr<0IwtH;s~~{{>)bg_0;W8Kg+YWU^5le?q^!T+9jIUO2!729VP=%>?G|+53x#A z>pAGJN|2OZx=v&lMWt!yDuDKM|B3szDX6A@p-cu0pfM{6fbsuCV1^495&*7%lmtGG z9aU8WOkNGB!F+;`p8N| z%39aa*aW~ZOG5QO*0XkWDAav+`m36bpj+rm5B%;lw+RG`ys-}=7dVbd4NF*51 zHXRuhH`S&v5STW#=xi0Onm1uS#G*o*42mI5Fa1U@o966TyL@w%B^)`|-Hjs*3?P#%-{LeehKAN&IzxU)f z6;NGP#R<(7*xx;9lAm*}yoU;HDYaUj{vKZ4&$Z&KQ?} zpCcI#c0FjnZ{%tquEzltI5#pr&)!vgKc^pa(mb5>eZS9f$E>6C&e-Hw>yg$;yl)Bu zIP2v9CW-&rX`@&3X_NA%mH#JKwxNrkMNd1?7s_%cPpZnv3F}J0C!kdfEVap~JdJ~q z1` z><;TVSN*0k6+IKW=c)e*4);KD54ce|6D5iKs-#N`gyGDRw9>sbPo~?yygR6B6Ku?N zG&UvB|swDxQ0A#n>^elST>({P2*wzD||K2bEa;kiaVqU27+xPE# zOfOz&-eh|PU9R)4UAeNjdU-dM=KK3;9kYM1_{pcAjzoKG&LqZ=B~X3#DxT1x&Nf2P z-wAf=6F^8D%>>Mo6eE#I;`iy}$F^Irs|oZ04xBb{^h;3wVnxv0R>gMN4n2uW^_Rw| zVGZc)1l)I3ml5RmcrR|(J@Xv0+p>=`Zi8c7@t1e3witSDf$|Oy_wzTsZvg;Q zt$#V|0UbGe^rip1?U9RHi>;lV#kH$f7Y`qb;X&1YN}8mvpP#>4PRQO-8v>FaS`z|& z>UpnRz2>TUJs*`4N=OTkp^tvn-ZB+oflnP&ewz2fTK~w`vcvVh zp}g1H6o`er?dOpFT|le=e6LX{7z0_7L&0 zQlT7>cG&C6S17iR2{ReWlMj?ErGh*@FOdpOY%YPqJUm0|;Op0Kj=m{+~8) z=PmiK_pg1xM+^WR0C1&R*eC{|cn%CN#1n{f0Duf==UG@usznE~z`%e@DGUhHVhS3N ze^hj9?1HN{<|MeY#|_@uy)A)u}xav8LV3R)NPtvXfa#35tqX!L`M*7APz&a z7y4b2zSgN#f!BSw5d*aComd@(9mI;T3DLW@a|_hSoX|dLAP?Gx?LYwT-I*tS&yvH) zOJac>FPVL9@4DwqI#$(=iAh9WWAhp;+t>#a%gA8D`Z9Y#yI7|B66ZS6yD%Q`ywMW{ z>MQ*`^i`{nACJtjRNj|O4S1x35~+x^EG{6j?^hs^_zAINu_2=CrCY;X6}v$NH(@%% zmZWu-*J9Z}=*9kQ(YXP#CC;+K%FsaDvGrnic7Sng=xVLgDpk=joq+?pf^|jwIqxv{ zck2S{zkoj#H^XOBLRC5*e|TLGK6p7(0LZow>o2+; zfOzCTAgc~{k8cGN%!m_=qJ#ho(9{Y>t_T(|93U<-Yf1& z*hXl?P$kKaK$}V31YjpBHWix>csYp!EDiUuJbRT{EQ35!J&lY#@+=(HqN+Z+pZh2f#$j6>7gSMPG ziFTh;!9E%BoC~Fzt0Kz?XL}+z?Fd3aTFCQM2nKaED0BxsT7qQ?xVnF-C@(KvvH;h7 z(MrI9sf!n__^$6=x05Ahb$KL4@+?6?2ki-fKnij9(&fC*0wYkB^@Hz!FN#IfY4iwn zrB$fnlx*o>6MzHyPQ7{!E_in6By*gu3!@Fgy*omI$Ei!uF~L>`@oQ~})-{3h*(cLM zUNIOHJ>6^_kc5&d5?GhKLxTw_fM^=gCNDKF9$TZ^(VvwtQt+QK=s3~bX#EIbD5vYe zg9qjCOj*+>qk7A53-=CHQaSNd4#nbW*QmvpwO7?n zEji8jv|iK_gZooe@SDH$yCY~F<02PKVtg7N*^e`UpW|Zq^dvgTdEN=H00W7805Is^ zBag;@TA|!uo%3!aB7^!ds|G-v**s(3%TTNh?7;NS3j8oG@T@c7)4>IOt<8CPxt+jN z<;P#=O^uf2aV%f0&)2K&bB1QdsgJi#(!XD169B;HA^Csm1XlHI_F3$Vj^=&&{F(gM z-=KbWa<&3mJ&|K)j;eZ9L02$~q%&)b{pFtMRcR^t6q%h-$O*xrvQ31HF1?tfJ;9~` z3S2QPy6MZ8J-)O!II;sYg9njQ)_jz zT}Pn!=HA}W;~L*D|H`k}!8D^lC2S9$zgRph2igv%s^c$STzvBJM?-JQnbha*gNJG5 zAbR$)L0#FccTj*Q2jEM-QhlEU{}8gn@y^;@rqJthTRPWHdR6*S1*mgeNvi~IQI@AC zxv1&G=;R=9=~mfqR0fk2M7dGPMU{P6t}fXgfYHg!0Yz88bul2sK>=Uu(mJc0b3HE! z5GeJZFJe;-AZJyuS8mqB(Yn2MO-cBJ0d^4;zN*j<_7AIXaasg8z+63g1sb`0^|Eat z1zPov^v?9G0f=sU-DwU2Fx~b$>pDpLQ~OZoSeF~DSv`|$T`ry<7Jw)3%s~mU1n9U* zOzRn;=+(0lihravR^SUW2Jrk!eyhs7=(;!U&F6qK3Z8 z1k5MUIW+lz8hc_N77_d+jj;z}G!8wZ=2Ghqx!K1T`SyJA(Ty8!(II+a)%pZ*^bU1R+4@?` z0(od%;TLpyM*uFg*V*3yppuYC#fkkA`$K72BAeX)6IF@jSGpMbt-wO0@utu@1SQae;d;*-{YZZXm3B{6y(OL0x z1;*&~-{>>^Pl=ad;}(Fm17M%_gWbp#G2w%V32doF%m@N?>uv&Ds-V-{JInlqz zRZe%^Xdqj)p6KtMWdC3TEt?siqu&d#o^>IKqMADxvREHU98LDmku+;;vBcdpei$@J z^ur#C?ZKWA1HdJ(C*!Qn9M_<%)sBT{cc?D!vZMbHnd$gfVd}FyP%HO>>8m!J#|4Zi!lne+B z2FCc}0mmbclM{$9fN^eru!;$F&aGRw96L}BL$XoqHTaT4UY1|e?V91A!mL|*%6SF@ z+>^5rz(B`pZlo&&K8g%ZF+~(**p;E&cF4ny4jCcJx9{>QJ`V1rVZwm;p z2?!vIaUzFLd%0)D2Ec|p?f&cjouJZj$FB~|o+YQ=v9R2ed5^kX1*rU750^gvZ zW5iPpqGB=~=-obw8U8@=?`=j^J%{xhpgP^G0i@Fjhs;<;L zkd&B=5mcEc2tZHl5$rFzKnw{z?=|%rIy$lgtKgpAmjj|L8P!E`UUfEU5;TlEN0Imk zQD{fD5a(IGSu1skK}VcK22_W$y1~XvQ6zS!&hM<~_*chw_1d-20@WXW^S6Fyw8j|g zy(RyVg&loQvY#RQ*+!q{BzxGqGub{t0-V?71_{8KOkZXRz!?W*(8ti30JzSakL9uO zJUwZj@y{eZyPo$sgGDD*^hYS>xH`K9U03hb-^uD6)=F6dA`C&a<_~Y0{69mp;+0RZ zY0`i7V(Wka&Rg;y@YOo6wzKt|c0BS89Z#U?`14*){_D8(9xJNO0#qe9S>PG>DXadS z?pq&6hNRJK(UZLac#O&?0;(g6Lf&4+Q}6se3JO1FE;&7 z^*1?+01HTx(LWXnY13L3z=Zy~G88SUTe8aTWJ_#J zyO$Q1FR7n>lAtPQEpqb|wpx+++D7G-#TEGF?W%=EcPz;Vb)pXaGqVDxd0^q zu%|-#lEuY|!`{rfCui&FoxLs-Ky1s+Kma<2MBr&Q27iB_KmaEJ0Nz&OUvu*B z{|Eo!u~WB+{iX}Ns`CH1xY0@P>$K$ms}ldZ=DM{1+`lLP^`xLhCHE^DOrW9^iqZ?d9*t8}yUDpE@XvLH-+l{QyEmCt+(DykwAW?5tsXWy24< z$+16lXsbdeaZflAImNNIRbZ+F>{WElW8N!q1K48t+ea^)JP|lc@?5rz6Tf1esTc?`+~jBb`!wWqM9c<$)p*m?m^&=Metu3IX;+S(q~^=|?K(3~ia$Na9t1W;RH z?REe<{&krEbnaQR0eq1_0Ot_^&~+;n=j+->U)19i?+^gB z>9OhKVywvN9t8GrgGu`0;>O+$KeE=4ayODW_;Sg$#lA7CqT^t#Z~`D8ptUL{q4-Ak z5&(b!OZWO7PacnA2^}N5L9vDua87#+@FOji@sVJ8qY%__v<=#gyvh2%a`noaoc`9& zJzoHTv6JQ^dD~C?MnHfT(cc6Jun7o2&wExt0EEfgnA2B*09;X2Xie@#aJ*OjBTR-t zOfN7cj$5FN1pZhareLJ1n`)OB$`0_TN`6qPC(wvv16u&cF-`&t1{PF{0LI)C{Sls% z=>R%068VyE>2FmP>!W9EoUjO;P`UQ!iovX4XBnxWfm^k*002Up%XxhC@R5ZfiB{?_ z=y9p%=ya0=geI~#RWa#nUx@XhrKdv3D5}FauGVW6Jf!795AOPJPMXA7ks?UqJx&V2 zP<^Mri3(O@()T)^>MZ@P0E`nHi$zsLhVsjlR&r9G9WJh1jvy8NdwSc4zViFu{ry3? zn|`wid>U0W z(DUgz(*G{VJv+i?amc*sT6*?W!?oUS1@zGRFwITTkfySUBt#hwW9`g-!2(+d1t+AQ z#v_HzyFE@GL{Gyu(5riLG>&b6jZ+{AMW1_Opp|XtsoGU0MdLfnfKg#Rpt*Td{ha}HV9Mw5=zOx9h|TX z44B8|x#mh5Hu6gRm;0})gN`#yId>g>_O6rvZ<_R#UPSu<03ZNKL_t*V^YSVHz@~|R z*5A7GuH!bP{Xg%?fA2|GLk18>LQwzWF!i8}1EUpy&HPm`NxG!yt#SBzLQQ|uW{_^} z0nzN!?2}RPRTOE18R$q=|5ps|V_$a~Q;kCj(o{C5|1E(&S_fEXsfxLhW={T96|8$< zsv5cys|F@?I@3znxZ*}hC)p&GAft*les0lxyQg=8(+={9!n)`<9Zan2xhJiw*n{cC-O@@vVktuwU8&@`L$mQ@DZjTCG-eLS5TEewDjxaef46G z?V*qD4%t>^?+}Eh1(U|1WEWrss7Q6L98f6QmAJ+J^VrKK6|imCQ)P?j9!~02WjPeR z=pYBwi*br;ttNy0d!y0Qcx0E^`4zK4QJTV1q`%9?kbPsuiE7c1K76U;gfLAa_bNBJho8G$$o}l_Q z&#Erc81%E|kl+96FaL4`XaMP`e{SC4?BA^W>_2@{;DRuk$i9-TC;y#!q(aPxqguil(a9&E8VF0Qu#=)n+MkVN5NVX34TJ_7njcB`qmi;g(VE^7OgYh>+DCOi8LMG300<~m89$?mt`@gjgW z{mpY)x+C=40br02qdIml-j!SzI|n*L@4_u>%5VPw0@%d5S}eZ&m9K1e!ZAl52LO0m z$^VlQ|6YBy-`0JA_ci&i=R2wT-}A5n0O(GTz+@c&Knq2K&kBqsoo~CXfRgyk=rKTU z*eM;j$=-A!hI8N6W9BZ(XTGCWyH?arXxneOXodRGW_fc#p zg%TqkcyzR6hf&CaO~CW5vV|ZoSx;KSt1(3DlcFTXM#8;B|F}A_fPQA?DZQwend4#2 zAskGX&1oZ^XWOK7sFJ_2zmBXssh%B0CC$ej?ZcY=icRIOrlVeMK_{qT(Eqo-_spxt zntd1A;sGLD0$EL#Q~ti{Z%_R)V?%tWd&q79kUWy(^(<)@89=7a89=%6A9%Mt`9I?= z0Rv+wa4hyciTc>H(ZBfqy}gdd>KN-}CU7ju^U@e-4KhtU7~2S@Oo~59a1AD;D&o@P zYA)3FLG3;|06>2uvHk%Buq^#QFaf-*4bOY>e|5x9o`in>!{_B0c=+(qjDI&P=pe{Ol*UT#m|51Tb4QZ?%xYYNx-F&tM)Y-Q(4+e#-FfFFQ24X zC26H2`%JM5F#yPx7tlb-_`zONai3mnI(2XXi4AB=KFqPG(xv$C^2r1M&_`^-8spu& zcRikrEy?%+ny4wIC?dL{m~;xj(Br2%@9Ony25Rg6x`*_$Vn*_z_35@pbjtH$jf;-d zz3_`@cO1}rS}nuijShSp>;9)v$^W|JKA!*pp5~0A_iqFO=tkTZye+_KAOKC(su55B zkKtfApf{^pIcFr+E7_0ni|~kKDH^A$)}`tn!_-w+a%fBkq99V30tSUiRUq{$h1IJ6 zu@q|@gF&EzyHr;hWKcX z-wP*;RADZKVTXAH053Sut{}I1+W`{LzY6Y(;#kgEPfEz4C3r2Ntz^HPE-1gW1{7>1 zI4i}efaD+l(LWzl{X>z^bF!)n2}m<e9qBYg?QeBfuxv)$49kfiWkb(sA z_1>wbBl%50m48KHr(;Y3q^hgOkFyV2pL*7M&PjDbpRc~(S(^?>&@Zr-5^HKHd0W8; z2TWiF=+uQmy5p=>Ft~#YaH2=bx$dd{*TI4B{z^8NCBcCY{jG2bnlC7UM4Pfq?%z{5#~&l#Bx$KGz!=i0aUiPVxX{bJhnV)ff}plBl=v;$ zZ|mEUoFf@Gdt358s6I~eCe_H&1FjCM1Qr2ZC0fF^bC4D$4u&R?6PY#JB502Tau_|a ztCux)6BSGZ;zGTagfEWg$OuEpUrsL0sTl`cDU%-AIxj%Fe9xT7Ru}=v)_x(_4E z7foX=h95oCtWIJ~VMEHZ>R#8cUhynZ8LRKU^XtDplD$+e>A4JmD4`(z`{|uKi;Gai zYQ77kmntSz!(Se@tCMpAD%PA^50*Y7*vWg+J^efdL?t+xD*u4{pn|mnS`?|83)yQ4 zayN#cvfVs?1!@S0FxMk_O0w0JZdK6-g9K8X-h57?R{&KzhJ?D3mg1th?X2vr>3zc*?0P|AXE@*89G+M?) zOZ=;vf6Ql9#R0G(fr?BpV?q7$&=q^K5uYudzevlh0Td}F0PH%xr;;*3-n2=8g=FkE z+bjXekU-CI2Tn5kQ??GRG8~Mkwjc(I6gwEU6@ZKE(**nVUD^)_G@5n}t|YCsqF{*5 zmw%9i^^p@y0&H*$Kn1_=0?KHgnJJ)yKB{eo?kT%e`@nsn)kQi~UTj!buP&}# z3nQ6)hWV_qS-JQB^(TKa_M~n1{r$z`{rw@kSS$3Ocd)7KPq#;r4`rVq3@!%TR=bgr ztQdA|RV@MpC;$>5DP$W71Z*Dbft89*65X(^7&Nh)_A747)splMifwH#w@9n~Lefl$ ze^u|>_i$oAfEHK}#2x@s%m8MYg)QI%kG1?TY*FhP+KCmtB>)+ZDo@~$iY8P7=ofS&x)^4wTIe%M0MI_%f44 zh`3kwUA0%N`(f)~1G`wMZ1EITu?}K`W9#$Wy0+I;fk^;s5>rSLsal^2^wNL>J??;i zmL(R(if+5JHob1e=2<{%5@Yy@DfEfm8sDPq%ZlN6E~*WZ!M8gCw(cyRJbgL<02;&N zhmQsW0Q3JofdKprRgiU>j9vZvd1C^wt*}A0?oYcN!21RO;QcGU{Nb}a11eBJCcPA^ zrRdEEET0$u23F@{XDxO_dfb2G=YQTg7XdI}4?yI*-nqD#KNp~WTZb$#8_?GY|qSUi68FknL+ zQ%QZ|))M7|^{ZkkcVX6cNg`ELXSXi@b|*Z}lMn=k^L6&t`XuHJAZ zt^)$-w^&W~^Ec4URBY>e0^}uihtTPX021j`_Ul*)g;e|`h}aXmGGbFb6v2>$WTbZx zPLo1}u_c%_10AbL#N0DUK-vVrA^<4CL7t+SB-lD2RW#$uL^ts2X-V%ndrJto<3Pz-rcP#u>`dfP>r!41yoeWg-S+Q zP%-JMk#Yv8^4E7tctaa&G<%_Ob)MG$)obagCg-_b2~*c(4{2f zbj?(z*31vS_Xo9J(ofc{4d`2=govG`D2q5aP}6`^3pFb1LXSSt&hhIt_qv80LjC>z zz57Z2S70uR_qhXO0s-h=1P?Sv7^8ZA0?MpKJx$g~C2y+we+K6d!fbK)%)wAy127Fr z)#&)@?QG>(z!4b_*W3f>g$)2bgOn*UAbWTwRhPj7fK@;RCTT;03KaBsCm_{ZI}eg2 z>`f|22^0(^PQ_#noCxr$PV9jN{w`p{fA;tPi{S{*{XW3};3lTSIpZ|5LZMm}wCWaU zbg7IYvCngK2Nnl4j_fo_mXq(Z%3s&$>#YL{`rnwFp6FjSdV010>fh%1%ZAeGapT>z zb+G(Q4UvCBMmfiKHiBO8Fz?@=WeB~MAGr6+e?K3||JO;XpY*J+`hFDvaMsEHO%wkb z`@5+8f9>RdCCK|6M+aVXB1bwRI&(gU_wb6Y9Kox=zEdq+!6}lEqavoj0`x&sb*1*G zDyQ|K&$MKK)d55i5KfXe75=@IQ2MGDMZ3UiWjn=&OK=X5rs>uR9@qR?2dX-H zd&kK}&8u{k96UXzl9(eNNDy#h>1}>vzmM z!yYi5C@fM+)>cI`@5Ervs(i=srXSu|W38o5cdkL4o3^i#wPvO&bbTs|#ZHmAhi;XG zUgkdz_ylfNWmxOQyX)kAY$jb#3H{ho>T{lVtTDitfUIR4c9t91K+k2sXjRsc5cNA! za@b5pvxh86XjAe%f4;bS_3C0<_RsF6QKjGajLyX#@_sA^F9N-qBVAL;S3MW|WrAqa zrbEvuu#bWRPOMZ=!HN5NZUa3G!cec!ROQphp5(lNhZRVX9UMDd!SYZTlJGXrs0H~6 z;(L!Puv{&(mVlE5{2jJvy;IvQ1|by-MOBY?JJox(sw#ASy=Of$AN@`{CfTls-v6oU z(<;$?x{|c@38r$y@~!^!SjtxR+N*JC51ECl0zjYKk}r}ys(ID(LR;^>@%;JXFaP|{ zV+R)#!NK7(gHK0=YwKgFV00`ZG)I$M7pK>&KLO@RQXCB0Yey*B{?bO69{ z$$xb6CbsA2jq+d5zA5cL^R+Jhf9$#`i(_BSS#Lic3jhFAu7CmzcD?s!(EltvD z6Ocqe4w0p!0#VF8PoEY`RjT%fZ(X|Dg*SE&WRh+jb<@g~M5u z?#B65wR|vt1*Em@IOAAO)Hl1u@vn-HNnT(RV)Ihvk6moPpeB3x3I$y2u?0XOB>l~H zQ%qkx51;|oKoVoo!?G8`aFe-{PQym9j%uwbSa$>HU3OeR6{+gvLxSI9ZQyWSn>I`O zTL%E>T-h;V0N^8AvBzlj{o4Wo=vs;y>T_1@02nX!+a~(ptU&-8%UQMrc$Xjm+Y6On zcwdwMt80U5>rK|o=keGixmyAs`PKDk`4yuzKr7mtK6`Yo^e+H_uYcnkl|X;A#H>Q= z8gv6}D9G#B8DXIFr?JQB=Nq?fS&rVgdDHsqz8QcgTWe(aay)$4E%k%%S-G;+HZx)X zkS>)hl+Mr`QB+{Cboq3avE?rVY$vu8eTmIoR2s$bBoRPB6QNG9 z&ra8~XA4z3t0zi=ph9!qABbnFrEz*3bStA72f)`Iw7j7+PGBfOPHnGLDk&hJ{*!tZ z&{PiQigNwI1HT{r{mJ9UcCHgtJM!=PUdU+~^EwwJ9Ko+ZqMk*9|LT>iPE^Q9(=%zz zN|+=Fr@*k@eJGXVe1--Sr}KaL{`UqmfUEBYMP`tqsnSXH7F7MbpP4wVUc5%>O}9~N z&Pu8h6Ef^PZqdoP9YK2E;MhpPLfNNh*YQ-15xmyih|M4shR^(WT~p6z8sSla{-TmX z&*Kd3NWsTZHEQjm0`kk1J5;CZ5fp4R(4qQx-n#XX4UXHNe(FHJ-qUL0IBT^huWS9= zt7YvJ)okrk&CN*G7Bw{Mm&&qK$0u+!on=&%f3&ur8HP@2C6z7-=|-iI9=b!iq2B$e2BoA^I;A`2o&S5z`O3#xi}n2W-uHc7;^LXJ7Q(Z82(-~}rHxO2$twmB z7ZQkjKBx9TUjLnsTTgB`DqLRsX#W1rV@7?eHVIm|%$ZJ^8<>C`Po}Fkx;k9%XdCXm5!V?BDO+Z4~F3u7vNTG)B=!z%r0PQw|`kAL5_LzfJs52*tmMv@Sk z{Z-TwH;%UK$@0)=;Q@!!?;vzVS{SMJ^maIn8Su9ZQIqP07T=Ie0ZE3%cdp7w9v8a3 z6#Q6jE8mPucXL@qX}=!ssWvf=_fdj)<6@jI{euQE0^Ye-xPF%~!N}|3g?}0JG;W%h zEUYz{?n(HDv9G6HL<0MUwNFUb=wQ%o03E^WB^^h;HABA5CB?i9w`7EYYfuZQJ_bW? zrMXV}-J#h zVX{Y#;^fB=+|-JY%5MwM=CI{wcUC)C^oLbAEQ-wW&(q1~GZ58x1kg+egj=}bQyiot z=T5swO-EEJl`3D>A@r@PRVPWbkppoUIl~v+H(Z0}R_ZwTSF8*VKWT}P7`9eO4CW7? zh8B03vM*$7(n&r0RlbjRX8Iml3=D3m+v9c}K9sd#S%4~y)+LyCB+-6~>$OcK{MM5C z5eJ|K4mCefREJokI=qR`hLZ3TYhhR73`<7iZx<=RH51BTIzIf~H$c%jpz8kgT_|WK zMPUr`wl*0p%Qi^Prl`Q1@MN}o7aI73@P6(d;B}J*VHfkx9;3x`eesdNT>5JB3a*2` zHBEQ7uJxFy1!@fGlT)X)1XvwypsRZefmcO=FSs1%{XLJ--CiKpZL;f1FXTLA`MW== z4^>u_PfaYgj;2qZ*G^8 zh^8Mf`%BM-+0GQ3qvsU;L*^Ha@Yt1k5W6oW9&DG#RlSrxoRjb8O9>CFI!W3=-vit? zKEK|Q!hAAi%_Lk>bZ_DnJ^5>Q`Nhl12~IHyDNx`4byv*5B>#-1xxWD!XKo#Lk&13O zguzhX1o)vcReL2TE7jrJ$P~{JaPi{shw9zWvG%f>2(EhqSrKFVB6`vwVDLPY8#5X2 z;A_95D~IRl1iF%EyyWR+JqvJk^}2M1XBTUusBgeX%`k}R6nvRPk&P6h{N@=ED<9pYF zdrR}dfXN?!gf)cdvQfnN{0l^Bc8WMG>=QP`1so6CE4Ex;SDgodfYcr&W}uCOAHa1X zl7W4I0U1cz5gulWyMz-KWS16Lc1?PnFdPtnC@k}3FA}S5_x{u;+Wy1(3Ys-4)n!)9 z@hl)I37_r`$7?UU;B7i`#fmw42BP<0?)0z z#WlKG2_~}~4T2c1Ln=B7F;}$Ln*uzlkI9Ma`=6$(9!Cj`avnD|*r>q1B{Om-zp;j( zCMEyAII6oUT_yz^#!^dMxUvq0qF66%e6FNO7mS;IR-fB{B;!$f_wH{VD`ySS?h_iw zfOxty*dH6+H|O7R({Q>b*B&{lMY-E>_mR9Tc(DALkid%(8pK*G8efKQ`?n=_bk&`| z7Q4oA%PuB#CmIF1L%8_`MJVQ^LEqZMKQRm@m1$F2uRb%}iQI{l#iyCi9p6g)6E;J( zpeZ7tjPYGI&X6PkPr8vJjH{g4&C?|ld$YN$ln=MbG8^5KgM{jMvs#xG!N{HwH_YN z>iMG|?8lcBrhxdoKkK41F--Y7+pNU)t`5-&q9nj8NOaaRpCc)7zMeMitW_t&C%;a4W;OC>X&i^nU*`UNeBOvzgRBGcJ3O=7}wOlFB&r-wECZFcQs_e z?GS>CMm)D39==qP$tz4QFieisj*ma?utk|L(bQtR-HL$kx6lzAr6U?E4 z$wB*j6KnCkY9E#)A%(8%x=Do(Rw>^%l+83Ep+UT;#{D-3)mU$3t>{Z+?y=@wD4l$3 zk)M@M=f7JFoxQIo*Y~$ZvITC4KU=R^Li?wJVc$U}zp@jV zejK^0AFJ_GKPI<3?Y${GO%;Q9L_9CcaeD&qmhwsZh#hzZuR~(xqQINIS3KkerPWzo zo+RG!oSLa9qI*%VAi;(c#vDQhEc4s_b}g)cx5Obf?A3y-LVZShM?YS{_qm?N*G4)9 zm6ASPqVp=%lDn-Eh&l-ho8@f^jkon8wn z`u6jJxUr2H9=(mZR&jLa03AVd3q|lhW|nJfZ*cZNOmnKP8cFk{q|KVfQn&5^MZo=`tP6kl$en#tpx|Lv%&6%s=d?l*QMI80 z29Wfv*()pn&Z&RYjR&YINzu$Z-sJw2ea$F-6lgEL?%3;qHl=XTVAmfPVQE=4^n_at zN8bqZDE>AZa{=X~$DV*=gy-VZ9V~}uNb(D`ix%ZI02z%+X zACoxK`t_$V8 zdr*i;Fp=rcu!OHW&)EwH^cGt;zq7CC-z2B3h%F_cKYU%|WJ(-K0~EMz3#={qnXvTC zxIR>^7mIBRxv94suiy`y#faQA4rEu$dTCXWh5YPs<6m*YRr2v-c^Q(8s%j#_RQshg zuqwk=rLYg)d{U=zB1*tG5o7y$ zpO^D?o+d}$0nJUKubkHx>B~H$=Sa#rClnb25}6Rv1|O?uG}$co*i$DiJT#fuTBCj>=BDJn;^V}C z;M|!Slzu9O0BBT!Zw$llHj@()hIe_`vyk3xo{OwP1vk|95U*hW5-cS?&pTecP}_+I zSIWnQ=OHMUP($uaL)Hf@dZ4;H=y&O-TGPed#$v2mmq&w(!o8m?pIr`SIGCoTV{do6 zLrTr$YiHaF^JrO%#+B!1Jnr-i+pHH<(Npm8kGkeqgoO1BntgsLVemvqA6w@dD4-Rf zpJ}005i6E@tedb{v!Lrd{sUPu%Q1$g5^qiwsgTZA9eZbGXlW4t_~a3hJ`?me9h*4& zcglpaiLUt_8B#(;$09|ekM3;PoC^4Qn)#l22usit#KU{PC7P)M%F3ScVju~6W=@%) zNG+L4`h^vKTFJ+q0>AZ#(5E3OXCIJ6py@aaC6|Pk|3fFAmn2Hzu}1CY?q`%p1&F+N z89tGiYKXH+1~`>YXO(i}(pHu;f@ohQTAH`bN5#`|^@_Vi1qPP-+oy(P&hKKHquZCY z!>AC+Cxge*pbxKT=9jtw`bWhL{IEL87Qc1_MS)%{NYnQwiOrr^Bn_%Hv_q zbK(14(>XVkFj_QPg8uOk3i=CQFk*^zyfO zM*h=k=WRv_&)*`B=zWDI_hphXQ-fsyoL8Ixw z6=73>!`Jy{)PEWi2KJ6#?~H~Y?rR^3J3<^Nx>W8ycg@M+ku4(8c1#I!K+JADtP@Z6 zcz9KfhTRDd8jA|e$UV`b;U2RUQ|}6U{)eNr zKE6IJUqMv6OWlSYR-n?U#Vd$tzx51${TdNbEh0+c6{H5y0!Ha^6utud^j zdLb49{l=97{;PD5RvVsDm-J}2m({yTWg}lD`@^g{bh@^P_@vHXGgsyW@v4A<=)2jQdrcy-Pfc!@L z9W^@9APeV>10%w{%rPOp`0$+$IxwDqXvEbj-j{#1>%Yh#;5nN!^v>6z zeU4aPfsYSq@vtuUHEN2v`I6L_i%tJr4tID%c!Wb>vHkKCe*mA=JBmt*C*6DR;$as( zTCoL7gtXbIkWt5Xc;;I@hJLgr8Hcdd+YBtv^$>r=ViD&(;e40x0gfP5{k)Wou;=kM z?pV&s$kCX%zHN|YYuyNiUdXg37b?!0wPN|40;eiht!m4J!Gd zOLGDIH)F}O@f;JYeT0&i1C)yA7yp0C$2^J4*$VM56>0N}pA002~+E&me4oroZC-(u#k z^fP)shg94kYj$M2q$+?eqgQ0cyJ_c<{HTJnN45epTwZu~y!38@f`z=iH;}}_O=xJ< zJ<1PveywHuzqrp#k@EPInJ22I1kjC~;f3?_IY^iFXwBnd%gyj_9l?NHc4{BIf7$%^ z9Epo5k?+^2@^w(ENe0pd+3_0anuzQ}W_&pE`nV*^h_~f@hK_)%Ygu*UF7`Q27M^kM z-vdGc@p%xICzXy1OR_(#R=HNKfr#wD-+oH4pnmpFl>l?e8NPt~mhiu-Ts^B+2g^4i zvyj0Xu>Xn^&{b`(#og%igl0^EQBCOozX@5DADDDqtza-MhDbaolt8}!83t|mybY@P zY~Oe^0TwnakdswwxA^9FFkWxT{r7Kcvts5tj5?`ZQ!c~v(+46clmu^XU|&CSFcNeJ_UeBw|1jC3iIk)+`MZLn$vsj!Tjw(%dxX!X3~r4Sk(T!c$v-5Euc{K1$t)Y z!p%-`o>3PIjM{wzfYJk_lnVCkg6wtbN5!2qJ*`Lg0^&b39hH8S;!|54AW54v%;N>eg?Kq*{Jm>6v1k0Jff>> zy;<)soIYo(c6HnZ->W_`6tYPz6D=>>y!wV~Nzv^oLnb&W@Y9 zD9H{U^&)jTo~_F6XQ)-p509+~s;TZC%^r-x7ms(xPwSj`VMO%agcl`W&g-Z-?DKae zE{xE@CbK?o6|0A4!l{z!e*^%;YimC9cJdD;sFH*hC~vF)SvL_{%*CFMAXeMJsiUxY zNg9!MRQB;!0TVYntJC#j=4Hj$h5izY%5Be4^ZB8G*+y&)5T_O>TDq~$p`$cjfIQd! zllGlMd=U%d8%rBHOcxp>g%`G+dMHosYn8ihd zR`*Sdv0@ZAt|xrGxVGN&?}?>Hbh46Mu3UDUzXprq3ex-PAJa-s)>{mArg6@ooJ*>{ zUyCZkl4;Hplf<3h^dCDAp4&y-RUv#z^zf-tde1CTVraw_y4YPa9z!|5CKNQVs)k$S zJyl*uA6wsfgAt`>_E)dZXvbbg4AX;8nCiwR6Vl)rh?)578&gx=ud!2X&}Fh8_AXW7 z@nMRXz74Ew9(e6^K`)Wa1Zt)`^pFVamW0h&_q5oXUJ(0@@U$}BCuVU)Le^4SP#lr* z2W~7@7^9cCCj5>fKuzZ-m=I1i49DioMH$o!h+7EB#kO|uZus(AkIz=w6g>XdSQ9zd zJeKQ$k#|UB;Sa%I`oy=2Y)j4Z{Z4;cy{ng$w=cp2bP}WUJG+5#5a39q(*nte(E-i! z$2Clxyx7#h0Z^iJ`88xOpA8AF@Fpg&JDXvb8gDHVN zN*gLUrAWff%Z(Gt>CA37EdA(1l4Vi=cA38z+2?pkt!G-X+YvX=)C0heeJEhsAi(Vq zSwAPM}xU{%f zC$2G3yjfX%=i3mt&?g-Wk5s_KhrPI)6!!?4a*O)(hV>-TfHc3lYYhM2YL$)@3;_2XyScKanI5E+aZdn14Tis+xm9Hv2um1yc1#`WQr0K4(+;`WWd&pM#*0#;S^LO zxzLsz2~y5){U=mYVYM81W>Hg?qd4(*yg958oS5=@elGB4Hwba*YcFM%^^p}}_SyM! z{C&@QxdTTBVtG~3q?N!0-bguGF-(Q|Df3k-wa+-ud3LXN_}!<}xBhlrFcPa^SK8qV zE#e1kL+4Bmmd%Qz$jA}x%De2+(%DR#_NgyYb_w^2B@xhy7 zwO8KywomSa+Zp>kP2LY>l1O#Y2(lz1HlVBhRHc0>G20TNS#Aa^auiR-$-3qVwX&iIV~3+a=t>N;||k z+gP!SVVG<5smG_Hi|Q-Awy|%84Z`Xnz0=XjU3WuBV)9;rB-BAa=soM+8tjMUTZJ6yA}_e{7TrmcLySgFV7eN-BzmtOx=1h>PuHE!A ze1Y3cR15&Mh@9wdtID$Y9y|X{fB?lI1pE4_DhPPLaxYpJr33)w7!gI3qS23^ zC;u45;qjYG)<}E?i><*XNZ)&yH0m+~jR_tF$KY#*E z2VM?ZQg4-No;A{3 zMP&!sxySYB2=v_z9t(eQ1>N3d9nzD2rupf!_UPlS70EU4FvnJ(u$J|6Umlwt<}2J3 z5?=F@(yFY7>0kFMpb(WTIvt#gLLm&8K>2gffNG_xx5eBNjzY;}Hpt2Fd*-4!Z=w0$>U*K7)HB$^0KezXud2%heV@fkaJXLaGzv+T_>ENuCGyC1M&^|f?TDdIji ze^JU!+m}S0az0zP>;1nn8l@5gC%rDH*HbioPi({9{gb(7!mD2*ixT|cM+j0}LydyRm1i@MR^vh$(OOo(V<{2IsZ7p2l}>cQLfpUG^i>6b9S+WfrQ z42Wb{G@U4%?Ju+iqv)@)tiephL!aTn*cy#)$b&6Ov+2)(gqq)PaQ@e#9c*!tz`kHA@y?P8 zz?GZ#yR?%qPglk?$Lxcoyj%Wqddx}$?b3w5-7(fuRqnpspSCqL#KdYRV+liQar9G1 zay4P^##~gci(|9q$ zbI0yhO!H*nw+urhW@@yBS1pp z)}>+*HF`21qh04{w)%oJc64F8M+zlX;-7eK86AxFMCG0=lTvJk5xN`B$fJ;uzFj$! zIVE`|9}H!`cj#}fltfCEfzeW{>wuI)5NX?rg7OvQ_@Fi#fU4g;y2v~u#us4vHC$mR(ZA44i{++gr{ z?x!px=hFVf_VI-o$YW;dt*#i&{xJlbsJOtE;lio;wcB`0lY9O#ACWPHN@Gjdrp=vQ zia-pztNrDAnP+=tS!in6W~8mr8o-pEILP`aR}e_Jm4<(3=h^j)7Nd?y4R=f7Rwx!m zn_0|8HRwC*QWB6-$)agkby6Cz8Xx98JN5c)6$SzPcFrZQbuYX2jnXr=WSH??!8iES zBj)hFReYEazRv*q*dK8?KuJOy)7s`tsLT(u*^G2~yP84TvGC@y7cmp#(}I>+!z%D| zDX#Y=$&@nhadAr0o8qC{`&}-}vqCCv$;5?rT(tPRN>!19jS5foX!L-tT3G~`^G$`w|bEW6<b3hiE}3b4<|B z!XfpLXrTA*VJipWU1JRKdt+at0N>3TTv?SUCN)9z3hq-H^El{VSzkdx9px!3@_ zC9?xdVb0*hmFqh~RNn^!Er_|~Z`Jfy9A&s4S-a{|-wliRBPM*Bs??amxH(2m^jsl@ zgmNPb9NctVc+%(n@enQT$fu!8E+s%S{D`7+88gSW zE*OVg!Lg=#to_0}Rti{g(w|2;2nbl9g#})zAog0`Q4O?n3v8LWKM)g*OW zb)PAHW;}az#d2EoWKi`EaqPeHu#!-U;MmXx05NX{p#>0-g7XT?M0=x$F;t6+F$w1L zK8+$PrtJerA=R>)2*~a6*b`#$g}UIH38D2Q8#Vl6W+WY8!g0faV>J)dv>>5T1+Kh| z{$Z8i@1aqsgP5sY0go0X5kei4ui>fAJdM4OQDVKC!e<+0^iK^3vtdTOzg%!mq%@8N zV;ov^*UXnYdTi@8rF9#%XT5iMw=pxu8q>-inbv3zT(lO|b$Ufj?aXuDG*Nx+Cikt{ zN?FJ2YbiL_29d@LOp933^cJRhFnELANUUz-b%Rn+nx6Q_C2}gy$Nuc9+e;@u zI_c!=giUG(KkT*g=9&OUA6Ud)K`?Y34|>DYsj_3JjSc(xt_gq{rU61{%I3Q~zkjS`-=E(eBf=0a%Yz5^ z0s=WGv|UIOc00Td0GDU{*u(x#QILP_jfx?!dR7G?;(fW0mrIrD7Ulto=o$Jttq{R9 zM`mhi`}0$w1sAs88qC1*7$dS@64$@|DS5w~o>(bTF3q^?N%n@vNUi%Tk1I>DgF>R_ z!tVTM>Xh;QKgJ#(8%f%5Ejz^tR~AK5l%}iJcFMctOk}$Cg*?+~P#>qAcC0$C8uD61 z4IXyGBovZ-)Vc(jb=x)F{4Xn9;J*4K2$irisp`euX?Ge4YTh2?kHb@|c#JChp=S~5 zt^GRo3e-}igUuD1xHc=h+T65P012}wKFBX+(Y}Nl8-nODiuWHMPw}4y2Pzo9h8U={ zg4$;>E(O0}W-`K(j@R1=2a{h#=d1HNNPB)EoNSiTPzj6Jm%pACBiq0LY-f_#GoMR_eKB7y=;1l9ILkzy{p$2JGZTMIL024ggzC07V=S$vk|N1xSHk-|n z#G)qsPXH0L!zQ@xIOP25oE5`l%1Q)DmMv61X;pfnNx5n2DDk)Zn0EIZ!gKa6X>jtm zaIW!p>ct@dmPH6KPeeMtm?4{sRbs#$kz^QHQkEpqO*#qM!?=2}yF5QdXDZa?bio)) z9YXzEY$CCo6AetL62eg!Z{GM$@73U4%|-b|xUa^DhYQ>dOtsupH|K(56i3bR?XR!a z+Yb_SKX>IneEwwN8#1PE{d-NYBF!Mz&?A?q8fr?p$UWU47)rC+((uFo+K5oclB{wV zsQ`S_8q1=Sn zdv*pKoEUu3u%jE#j$zX0s^LI#;ip??lkn}m6>B?)Ww)JeuT1=(W+Ov0&2RwuFZg^B zxYtf)%?z~y>Tl@5d5$C5FHg+ChPEaP3NIN$8N|?;UQ5c8Kjdc(k_8wKIiod>vg_Y* zV)Ghmw!pBzh-r^L3%n!?{QFnU{cHQNyY6F3O#)t7I})@o^Xf{tv8~d@_4sbRP6X7a zyjEcCQAXq55T{e>!Q%55##QU&prJW|n{=)G0vhWae`}g6{37XCcpzX4d&1sG`TlF^ zjpm75{f*DSzYitXnj~+|)J)2FZp!qE;UZ=dpZ`jCG-n$gEZW;Divp=~>MX7lH18V& z;vLZE??2jN!rpD9t-*A~6eG#H>f*gqJUCNCU$fc_?c~*6q+fS@JJ!eayUoZC^oUQp z=&@McZZGPYJM==;Q|z(RlNtyDE@l~MyM(}?_u|yg~42v#nh&(xglO@QYqkc@>f-y(*-Jd(OzNwsroh$c+`1X~O2FB+Uf| z5FcOgg)46^3yOzE&qaKZ8;^svd0wwruL|`W2uIL^i4g`)q}4!bF@JsqLqrU&pfgwr zNqJeWG<|dtH#F3Xy~HO#6Kqy z2Gf2byslBP5!<&Sm#^!Mm^5R836PCwD&Z_b^l_X^UUTcwO@D7gW{%zguJ{?{eUBH* zNOZ_~%S&w7Z|_A~n8CRV8CB8KLuD$!8+SfKxMtXZqO;%uYA06!@j z-_;V`k3Z#azQq^t&9JFZm@^`s{`l@k25Teu2CJSW{3&ep(NT?48`?I}RYDqq=c%R3 z&{f3;d7Em|SR7AcLRU@V-1U9*%`~zE3R6c@69upAKhwkeRt7H7;w;jf#m?xiOezcB zw+&yz%D^TgRiT#9E!DEHFYJPCym`%C9X9*=h3>99K~lDRhj| zI^wWVFicma(-RSw+!>YQwIHl=o_fdV0l+s6#)!8tH}&Q?1B>742{Tb+h%AC8P_K4X zmTXx<-WP|gxVqh=bk##yg|LXJ#i}Rp_8xK96d-c${MoCm`Z#?w3TgCWpi_cuq7Wi{Vp~V|2WlqbFjR% zoHGqVZdW%7L7^Ym5UbK>o!Xk&y!VH3%J-dGXPw2+`4=eT+Cz+uk!%qoH7;gFI+1cW zsp(UgZCtogi#P@Kv%W$C4{YrO&(HlzWEsz%Ur}5UwlIVplA@?*@+QykaEdtIuo z2(KZ;8V?$2%iUiS9XsC)@SQ@PD|!qUGJya(Fk%#4~NSJ8z0UQ#g5B z%Vrt)&nRMpN{j-Q_q45WgG8BkK6*YWUj)=V-=%V=_sRSf89AVmO-?W_l{>?PYGEP% z1*Zx%TcN?$P?cm1jlb9|ZNK~l4fM%~iKYKVONaJk#jp#LQ|{lYQhso2-7v@WA-yH8 z68i}n|7i8bFQd4%+TQ{r-CB298bPrEa!^0!M+@Uf&|1rafnnPZuZNqV^_tzepKBC` z_A>=-ty}~c>}f)1#BZn5a>@wAFXWk6a*uPwW<{c$;DI2kViK~X8%zr;>J8(~<^jJK ze$SBHNOd|re&EH`kKb8|qX~bzX9ZF{8709#M&H6y-VFcog({Ki>l?*l0hjb`0W+>O zD@e2aU;HUjXsl*F#v!Y(GC~8fM4v?`TieJqNH|{8fnosX_UT+`lB*t|-G21fP%AYv zR5H<{6P7v0{+jaCrJ8o#zUDqjUSjec&LhrlF(3P)4s7|6(WNZZM&Lk@DVx=_=$3NS zs5D9#P344So%n+ zb<)2TEL1}bQhEhiK#OR%@AJ~>MNPwc_j=+{-+)>;&O{DH=Dg@%05V@LWr06jrq4G1 zKI)PF)H2ylswVGsjQ+{`SPY4%pdIdd%k%*Z`MK(> zRM{VYZk~fzibxLw5mvAUbp7moFUHUPtppmgU`z@~&Wd`msv435H@odQ41nad_Y^-6 zb%}zpHXVO2$_=_{*X~{rzWaDdPKNJy6ZKpW4`M=9olE7BU8w2e>aYG8$wCGs%F^3N zPUmIoopRiz&irmhw*HjBRL?GV0{$IzR9c|nnEqzMyfCU@F%6**9&P4UTvfw}#I3kj zj9Grzr8~eN2mbVb`VLBA_Pk1BFhP(=^SiSWNw_MN>xgo_7UjGvPI`erU`_UUEv zzxCu@+ks3Ty1pnfe@2=Ja+sUMQ|3h!Ilv3PRlF1Rx}imlL$eMOLvwy1ow4at-dO6d z{BTWdxJ!rp3jaNmg7Dsm28chpkjKZ~`*8z+=&cY0Y>!0jnLpGA0cDsKDI_mJGY_9> z*}8e|0(U)2Qw?n_6H|S{3iX!cOtfB>pCG*k@6K_qEVDy{nEBG#J;l9Rk>BC4$nS@{Iie}%K_Y1NiqRN-1Hbu3WDCi1V zC((4MS&=yfKB;e8*WU-cj3(KfXoqHfw_ED;olRtJO;IO_mvj`zGblk6`;<^pYoP`b z&Uh>k3u>&DjN8Q0h#UA_3^9eg>X>?btc%izy1`@I9ilmS2W#|^A#1IZ z3-yEFAm zlkZ#^;QfsSFDvmZrSYrqXD!CK*z*cbR3>d*y@r7Ijp*|+GRga9HiQ`bBf)+)HLI;0 zLSq6l%n9wF4=nxq(Tr#(er-d&U|gZ$`T28G-3sc`S?aU)5qW>vhO(#6RLp;>pt^=v z3_hUt=Uubkzo4{Bc99RL?Vx_I<|6NEA1PCh@Z{Zb@jX3$Snd=d%7DEexqUB-#K%Qf z2Rc{Jkuld^SoM={=RybwcTo$JRXy7-NRqSEc`(PdN!o}Gv4Y8}6;V6aiZ%njQzWqZWJo5UOd>R1?Q^D(Vt`!{y6OVaF^rKr8#h0CLrT zZE7~2dTJ;W+!}mGZ}UysMn1`Zkq9*k#Kpa)_{RBp;wKx;ilV-s5N9HS39+Z+z;mbJ zrr=X%_Gj_W7dZ1yul=#DqocWYI4His#C-dY3APKdPIl#vp8pE6HyL`~ey%9;O{6hv znp(+0i}&e{K<6y$57u{a0Q-=PbWY}YoJZzh8g>Aa;-!8NV8YzLbCk+$-?B=z$2XGD zoR}jWm@S(Dq&X?)i?7_kbr8+W?o0zdZ}U@~;Qy#Fs|dSe8Y4_tDs2nJ?Q0m_tzRpRQ~(o+xb zw%_+&`iY2^S>&xC{~aT+T_lC5;?9HsI?)3aU_kf)_TT5v#IDsMILO(wH>x7VYgi8G z+SGK=%KXY)4RbF!3^Vfzme<%BMpG*LRr>UrYW7j}ANQu#ydJ$qHI*qT?O$<8wE9z) zD_Z+mmt`=RoD$0yS~CLglw})_FF-p^XFwjl5>&*W!`1pck<)69+0-?deEpShBg)xb z>$*2&WopUO8RZ^5u#xFLyosKllr&8|XRgxV=eZ88g$3fzR-c0I5IKtXqDW*%d`AWh zZNLnhUXIg_94wd}>c5?vieF7u`uHnZmow744oS4B)2Xu-+gdGahm5(tK(-X0*@-J7 z$xFbA_G%HxP%josP|yYaPsY2ghs<3>;x) zP%}xJaC7`+ozGzEl+>|G1Kq=;quV<(x8y^O5o^Lz;704HYh%5V2qtmP7@we!esIUS ztLYK~1A6oE@Fum22keATICRm~&a`tSZwr3zc#O1TN3v;G&96dzA-87N|5j@LrG`Ip z&Gp6F2k7)+@=9!~P-a*QPn>naFmsrIE~}h?mYJ(NGh|;e{=*yWs?_0GGl(FgM$P|t zCckvNrjzt6HtxeXVI`1MX`F|#X=)0rm3$QzR2}Pq1jD5h$MaM~tQjY^iN2F-8b%XR zhG?}KgI-}WKA*0PnV)xAH|$Y)J71e*V(|D&#^Gfq8uUT&VvT#7$i6%v50Xs9MeL6# zAN&;G;*-trEe+0q=>Ph*^)$bdIPKe!*@!oT@W zeh*lQBvbxV)bcPmefu`VMrq%5d;htbwbthj>-R2x3~_zTa0~v&4GZQppxB7H@ zoEvI85^DM=+=@S{{`K|YKb`oxz#~ZD+6H^Rl+P1;<+4S!Ep;x3IYN2=JeIQsr@P2Z z-wT94^M5NP@@zw%2V(kr!9~50`HSJD4xV|jfjgz!+1rc)vhq}N%?V;AmTU0M1a`J; z5^=v2^p>Fb^SU7WV6Mam9x+!W19-hsm=K!)w{o=x3wq-1ikv6&9xNf>=W-c*SS`4QGjm-WHMd$uJ1>$3W5)jW1 zaB4SO0PeG6r9+xPhksdn_KCO^>j7FvTXfTzZDlu5QviZy|)dJB3aeE*>)pbw; zPU%2G9Kgj41gCbgomC3dGlM6G&X^98Lxc0E0Pr>@Vsmp|gyt_Yhw} zGNdQ@bss&C{2jne8XG=F0#*@P_%>l>OM-@~PwgG~Yzf}MtT3ziliW({FPK{Zy=fl2 zKesM=uWCN15FNlWCGyG_Nl>f&-KwI+SAvB=W5!ko&`t0#fySBmgmt6a1b{@2vlG6k zAOOw9yKD(?8UWyJRsHL^P68`@o|6Bze_QgaC;zRljsd=$HT}QtyAA-LC;zeII{<(} z0sT!30386J7@Izd4M=Wk7G1hSETD6N^!(h7!HViu0RZ%I zi_HcA@RzMh_%r}O*5oqv`l|o{I{sa?0bnhk2M~b9LSpSWeSO?_=M@B?vBDs{?z5aF z2;f8V|KzvuDiA={Zwnx8&~pkrECVlGSlrm#vyL$Xz_Vuq0KglYY_|BJ zIiE2S3vr7)KX&dgu?`U6I1m5<4@oA`wo=s&(iUXw za?&l8LN*4grz`aS2sYC~l@s7<(3Q^RnQTvNpe$$ zVd&6oq?eErvgz9Oy(E3B5?_Hg68I7{1A$)2b0ML2tI|c+v;*M)cTu}nQkO)sk;xag z9C(_QOQD&WbixTHk*NQPxYsoja87ki|DY(OBxYZi1SE0BsL+{#`}87}k|6M>YjQ0GZS+i<3$3fC z4%FrPRQjY6D9TCi>gKIm9+u|t`t|>xy*KNzEK9G$PDI9(5joae)dK~{q5wm0X0r!B z7_guGU;|{U*-c9SLXXm4GOU(Fnl>z06lsY~Q-lo&FhB}2=dS9i%8ZtM@hW*+marp z=;dsZif>R&Af&>TW5}LJ1u$vge|}%c07?3rIKuIFUsauRPbf^!3ETeKkA6eWk*lcQ zd;h)Ri_gDkL169kBO;{&=Ma1pgnZZ z{v^=ur(wiq%rmf=Bht zzxZsnbkWxl^dGN)!>|kqU{&ycRmp$NhK#;0N@;C}2#z@7lR_?(r_u4L7D2(-dEN|JnY6ub%alvFj_16le`_gzG^ zv^^qFhn}LA*v?onL1+na94_`oiNG$Kr$y0((UKHM^)I%qpm9K6+$a1S;30ddI-rCU zoyeNHA4v*^bQh2{AXk#rA;HlOA+c+qPKqmC;=T7C)n}?k-W=ABU(nX7!bu<{?m<}Y zc*d}w|MDOFgAtfOFxd&zNaUj>6_S;YpFAB^y^Gi&LS6{20#~K}BmxSQpPcYEnXy%Q zo3zq^LodW39Aplqg_YV0xYA&4jlOd#!;*|oQXSXExo9$pfSRd{~7Lnvsw6N$cHIjVJ+>iV(-be8Z6y zM<{_IfkeU``~FXV_Gg_y5kJa_6Sf2c*pJp2Rt5>c!O9QMXKOX7lEw2yYlVnTe9qbH zGF9)B3il@ID1rs%A;ubG0CH>q9<3K$CN(M`eQf)80gQS=$chhW%f<>EC3A4=QaPU3 ztr8W|RzSpOkx?pWO|^mo=uHX3Bl6^=bz4*sFs6C-72|ca0>o-cJRJ->J3Ca~Vr&cI zG2<^00TTC#L?M+r%KAS?QcrEkFuxKr^lE&Q4on~-0m6i%sC^{ym8qUF75Q5Cmt+Pj zzcl~Sz|_=+Ch6I1=^P~hY(pZz3Q7R6Q_Hpk!1m{@1b|~;JXd+WE)u{z0>D{;|MOG| zzG~n69NEK z1M$Mzh8%BY7nO&y^-(Qtw$kfh2>w%; zTmS$d07*naRDbw9{w-UqxE(=!o{;J~h}4UOqEgCzxJPpJl?1+s6p_3VZxH-v&yiOHMchs+!BpXTq zLoCaClKwX~SOkgvLmdIQLKFbwFEk=tQKn|mpIiPCkAXt8b0o=^q+K`m0|Ef{gErK# zjUWJM&9|zX73zT3h}a#qJLM;3>tYXO<5O%`37%+E_cpv{5wDl6_@7?i*P8&4(RhU>a1stSf6u9XAAvdUsfcCkTioEuaHSeeIbQ^gOG z!ub6+zy0mu$rDthtPOX*xWfcEoblb=Jyxnn@u2sIPXYsD1|tLK2}uf7>r;= z`aX#_CH)BUd(73#OQ1TFv!!|r!On00^na#dW8yM%z?D}_wmaB@RA@Cc6*$2h41k`h zDQw$VwwK79D#1WT{ogGllFZ%6=4;5O#E5$sg)OPB!T(i(f1LS61OIDM zvCgdkEF=>+a7ZP2m8ay~x4*;W=mx6V4YFGXU-n!<6{|~Wr?s9d(dGo36O<$|LORXW zuTrn+GMw^#6x5LTMFLoF!y({Kl~*~xR5aCVg#AULP(W=5_gGck+94rXb}I|E z%QERg&y>g`7^nE*vBT4KB0eyQC-6O~KA*{1WNqwErNeAhIsT{eurb8ustp89w~@W2uw@tal5C+9x=`z0OV5q7Cf!`9(>9 zlgKC0#+jt-Ln}_nmrQTYoPTf0mi7m#d=HS2wjpfS<`^N#CDNoo=xWuiQsK(;8KRJg z-fBmXv5o2j;xNoND%p9x=Gv2L8n$55I-^zvCYI8_mxOcXBEHA5laM2ME3Mz$k^=Wt z3Ni9gMKbHYcM^PzW89J>Hih%fpUHqsp-fqkN(7jdkgB%kB9Z{|EY$N{^zVyE0yvET z@Ku)l$9+0$+5g=83jW9L=ev2;|IKv{FfC~O+ zEy=d)>z&*Z1%OHbNJt2K338W+p&}QGZN!W#S6Jkcd=uo8 zl`HElnfe&oXKji*QXIwkD5s$FN`X&X<4Z13bEwZ8{F}#y|5a3rRA3@oLt+5@SLf5> z16INqY)ImemK!nwAbq7Z)@t9A`-bC({L#pwZ1E)((VjaShMnyl+M6d&rIOPWq+Fm< zi9)npOA-KNgT^cKA_73>;%V#oA_V~a?kw8?}KMB`33SMf>kN*$$GCiS)?)*KHR!}oBKnIhhqbrPti#f0TZiIZI9~8F35weHGw`# zIl#D*KT2CW_SU+)k`}g*ny-O?>d@^=b@u9{ibsM;{5a<(s^*HwVaP#)<^O!a( z?Q@ooId2Cq3;buFmjr-1x^FQNU{w+TE_)e8fJH=rIR9h>nH|goa@eVH;4Hz3B#5N4 zRDGaCud3G*)Fp9;1p^>8!1&4z1V{~I5l0Wf1}iGyc*e1XY`vXPI?U|7zDbD{ILv81 zfNgM%2?!dCm_Y~F&X905o7$3RI4%MzRJh>S>e;Fuj_Q-Es`gg(X9>_$`onQ%qRGKg z{w9%_9+vTYEBh){BYW5OhDQ$`4)1;N{_xj-^;bNPtGl}diIJ!W(11As8Doqg0$U`g zS*6BGBPErRfRps2d$+PmMZm)52CCtoG#Ofw9V|Ttr335>@A3MbfALdqXKCTqmsr(p zNhZMwV?rDZWXoPwW?WmGnh`a_*op|1*bxv{iE1S#0oY^Vj}f53bU$P5+f`pSc2Qd3 z^|}`*nam~;;CQu?620_bNMO7$XTSS{A8;=G{=fM@B;!lv0?#p4DG3Gy-J2W<^#wD4A4r|JS$&|q^x?0t`E20xy|_jWzx(yG|kFv?MgG1Ysk0eJs$F7OM=0lP{T?|FYLE7a8n zoE$I~IL z6wU(gHHS3GToW8LY*Xp~lP10r0O~#J`|E^+>2We%I!^Z`$JO^;y&%VG_x&YH?EA60 zy1*juC%*ykk1KlUe$P?Y!0$i*#cU;jMf?7$e}5VY;G%*5s{#L7h|at6|Fpoeg8#IS zse-km2KG^s^UoxboFEl8ER1VrxTa#dF{ks zo!46Tw3f3Pi|vm@=*ug;oJCUT{ae%f3@diz)Rh1gIg-^sAko1_x%xJ1WP)Hx!Y8q+ zH81UUu-?k&kbfXxPQhP(6Xh6QhwV=imH|WC`euNT*Wm;xt~IjaAiBXm!u{I6yRQmt z%b>zHf^7|OOaR@LwVT`WcOripb~@D&0N#}rKVjG7Ude}1fJ|S{Ab%3KBm|(M*MX-? z&WGI{R7R_s90MyK62u4lL?(><7r*?=#aq$+sOlEDPmpxS`DUJQKBE1AL2%s%1=bSdX4OrT>cUq9%~JO+PFxrBFpca)uSU(nHbbPo)MbBJIe3D};sYuY;qS z%dP6oq>5Cy2eim@6ObU|orF8*eaHY?TU6-UxU$~JZJzR7`N+2SKmF;S^7yHw)3Ymb zPA6QTt=GZu%*5eH_J@cOu)O*bT3rQxM`;9p858>6JAJGs>kptot)b{|9#|D%9m%U5 zK4Y9mg}j-uxOMv-o&x3pszW$OYMT!&3N683=THbz*}nA~X42@$eH^u}G|-}{jH$x3 z5rcfqQD^C@C6<0JgwFJ~PNKLck2H50z+&Z;5Rf=mCOwp+h(f@^C>qDvpie-w$bE9| zVV$*tn1B+k`{|_}<%9rwj5V;nx_wx$tQDDD)k0AmQ2UN3!tviBTQxFHcXk_S^OleR za1YK~4d9}Y0RG+Y|Nh9<L6>yL5kp9I4DOf-fb-rHxPH+OGF6YPE0iANFgoA)AIG>s$ zs~|wHHY~)d7L#|i!}yvlU*T;~L8+pjHL7if?38>V!429mUqkX42FjyUBPB^)Z~Vln z+Ex9tN)S!uC`b{pa{(=C4mBW)fcX?Ch+rI527Dfym}B#I>zy=*i&5(sNld2=WeA?J z*YFu(ca%%&1c1zq5CAj}T}b4)vycFwN!g#-1q1;4G%K_Lm=XYTj&+fk5&-ZW6e{ov zIcDiarEGXf0$4n1Z;ui{pO{fCsaJQY3^2ae%aQ>2JkL;;3K2Fc(2Hl%*>0i2xfDxq z(QibkIQR`qa7&n+L2Mvm_NI#V;>ECs3jOu<;gfHElm7aH2dHir@s{y{W6Qvi`l z{n(!nyA!u0UPc}jF~Y5P6pMWc#b^`pY$cSJaqda>LpkH*w4$n*b52uW$I#ur&G&ogbIiGxagr~p&uQ-v~&C#?=3yZ&OJH2?82@jT3nFTeak`3z%+ zQKCVfQ6xL$IuuyS-l`C_<}ec1%hagY1o@-a@j5N{xazTA75wM8|C4|E&t_A+S3R4r z()MRS1bC^o0H**i=h+qjw`~y-U{+9F6#)WlE7`67w{X~1>Yl~ z7BT^oQbmRfo2Swn$B``jp{tD`kGjK!DhoCo;jm|sEKa2euA7xnmeR#S2(^S4M~9ZK zHBgL7rbATYOPW06j>Qb)bN%{tF1iVf7(5toz*vxRWdei(2lP?Xd0>v>o}kBQn8Cb0 zSF)svkV#ipu*)_9Fi=AIw}1Lm{zcFr`|a=Z4}jqwl|Aks%be+EWiDPNH^SrX_8 zwsiYCXj0k4VcW@w2)t;?Lo>ic2#_&Kwh`wDvP3G>QYEg%SwMx1gQ_?2J?0GzYXUE9 z_uu@t{~cL;F=Wr59}K_uum5!efRjKE=>hxE+)~mt^CJN>nADMb#&IyWQ1zece&rIC zP)tCXIZP143KIMs0#^hqyL%jydw1`0&OnN^R*e$$DhW!>U5!<6>r_Q%UWaMVdlS|> z-zeadRo7lpT_zHM=0yT+Z#D{A^<98}?dsQl^rI&IUm4-=fA|4g0OTddLXMdNPgQX? z20Qr+0&g@YBl+LWV16G*DDUg%A)eIadd_(Y-e+#kGW->MpY`vyK6TDTyVg7xoDp4} zn%`Fw)`s=Cc1OJqXYR(B^31U$AJHoFfnUC_$<}_sCY(_8tXcws_?o5{ZAXU z{`o8dz}FG{M?bJduizW=q=jdJ|JZLxY6;wuOl7r_$z8Cgwe^s|7lAiPs%hQXXzh{U zC#i>Nuha~nECNKN>qQV#U?tF*taJM%1b+}ng*@Ojkmru|k7`Lu@^K9^m=^#l=bF|9 zvLPa?3E)aQA_cFsJ0^T0p@r?bDvzqZm=t#JaJ&z(A%K6r59l{q`-*x&e1x{W!AmI+ zC~!p|IvgMWQ6`R3cXt~ptoMdPOP;43Z`v5D8mR|etC+Q9EeHdto({lC@W;vNW^b(U zKqk6L08C(`XF6;c#@+r+Rdb+^iq;5F3Yt_tB(WX)9(($C|K8u@9Ao>c(hFDjR0bS= zAP5W3o{5l(??`HN6@Gl<>@!mLBrICK9sA*U8n_KX0H5PtN^!~HYf049q zI*yY{xNdKI)m{k1nX3)Z@V;70f!1zFe)pz*Yx(v9PwE)w`NFXQ_~)Er*Fz%6GYC2V zLnupFlDYXX*gujf2H`_esbm+e5vm}Oaz%&)owUi;Qbjoob{Y4%RqSKkFu{}a#l4Xg zQ%P+h{yoMF#8b_s&0%W`bMUaWp9%;hK)m~2ZJjeNk7WTkvz zHO9nONxWgb#rbC5XzInspQ<{kuQQINHN>PzRO}nbq2d6OWvb{wjF5Oagxsi)WxdUP z4&f*Oe_9_1=+R6h-?sH(R{R#y6UQCbV_!Y(5b!&-dPxP6?1+eHQshe&k;qz5zCgP? z`N>`&`DYOcAT|bnYrJ-vJq~d{vE?GW9pdz&?dtb$I|%^SGEa8DUTY-)oR#GNyyK5! z@5OgztyZ^BHqTsGyqCVkc~$=B2p3KMALkVX0OSGctHznrs%SlriwOV~{Ks!l>`@5- zQHSJnK7#-d8E)8(C@jf0?IcgyhARSeLlzk23G5?qU9=ySwTDvuCVR%FYd_=91DekQ z?nmr8_fyDpB8?*dCO%-(zc2FcKRy0u!_SE+J;hrno}Y=SOm(i?>1~NFFbQIGhLk)F)4$ zFvk-D0QLtGKokHnKaWZRVi5tLj$NDIa|i(3zA;1ei&Y2!*nW`;z&ru~et$^DudAcjD)>hyYplmOa*2dAn6e0DP|J5CJkyuZs}y`0*nVs2JDFp2Z%V z%=soKIxY4})lQ(zLi!m4?<7J!Y3N&<^uTM?fMOJmDI zz)lWED%&7F3nNtiU&V>I7T}XO72q|9uO2>l*vQryf8bFX2iRA|XR#~Y4^p8F&#lBO zAv+|5Jd5WK#EA2HodxipbGsw}%)3h$hzPI>2>_S0tRetf0^~K12!IEE=V}Mc@td&W z1G=hmOI1ygB2kal-kX#lFC;lB%dVboy}^x#SNI)O}0 zdXwy60)he!u<5!~Fy|DLd>~+msE~l9GQ3%3i7KEZlbwtX=qol{0wyJL!va%}P!UY@ zoQPZz;26h&v6O5b5@?6q2F8bpSXc1ix8M2R_c^9eW5Bj-^{{?rxO3;r;Sc}d4`hH0 z5bzuf3SryG+rV(;{F3y`eIrB8QnyGZ0?Rb0G}E4?g;E_~I8|j7S?fZW2~C;opOJv;TbmbuMxP;uM^$WAI#mjog81WOE?40{B@1L6KKM}8 z{&=SFk7`#gf&bOq#*hG31^%=4t#Y(gW&c;L{133T%sB-zdL7_@);;()2rxt{vYfoz z++ZRL^pui|`ocP6XChuI0+b*G2@e2p0GV7-RAK~5!TtyYQ7`F$s0lzx+_SAq%Oc6N zL0Vp|c9JV&qL6avNBm9+N`XUF4S?6l3UUQetzyYi=h%0oP!-HUT}eHq@ro`Dl1$=kX&uX-1O&aaYvuSXB)DV}U88{iHnu+aKup??h6QaY-D8 znuPi|!!M;O+s@Ti;ZH!>F5t4Wh-KK?VFr_M!?MO@tQyeVNJ+?u|7csR~$uJq_p35QC;~YXBh`P$u z|I6GaDT{KOs?JGe4DFDsWa@ff9Naff0?1mwj9-v#E*c2{=Y_RsmDe&PfDiyKTGhYS zER#tl7yUB8KX&mt!GEpmg_tx0h`=`T^TvehT2VDi{vX>XL4A?r|9Ksg>#PKTMh+?p z08;`0uZ=2y@;@~=igjz7Ag+m2og6FCwKzI9G%dE$kKU5RVX&nwKvaKfo=ABW**lS; zM5-moVRCCqLaGfAVL&$a`i<+%)nNNOUwokg6YMMMLbm_-J~m4JlYoY4{(=6B*J50& z?38RdK2IS}h^ntaCZE-uL)rjT-=@tmD~)ChbT7g%lR9Q{JRy;>YLh;aDBDP?StnTfu&aAtE>Bct~oMAyH#2 zqb^Egf{&Vb00>CnN;Y|<$&Oi+S!AW&&=UwVD zM1UkIrbGbtesra8`hLKH#KVh)1PeZ##{>a7FFCwPBr_3<>L$u_9bhs^liIX5`%;c}s1+oyNLY&o8?p-1PTYW!~ z$WiZDRljJzs_==^pM+XXMntkPebJOu*1oVHJ-B~Q)kB+`!{f(~hrMgpc)ZBvBREM# z-3K3jIQ;x?|CZmO@(pSL0gtg5o&42 z5OP&_###5w#16}FCJ8IBAqjB>Wk^(lI1)e$*O1Eo$b2$c29U>6|51qO;PLVBE8qPt zuLFH>@`AB>{OAeC8t41RKl@p$=HdC;U}FSBf?$QH2@y#cB%v*N&sKl0M7M)<%yry5 zwgF((p@K;z(N!%4CK`SNKm>DxL;$nnLIQ~M(1NgXybAu;vT|Yc5smFk$j)zci-Bx6 z0rmCVS>}jAz7hcptjj`$Z}#@~hX4M5_#a!*>tqMwo7t2)f`NE_UqShjI4av@?P`0O{BHbxEomE*1*Yq`%#%jGR*u!} z>gNLDbEi%R^Rvw)i;&L!x-j1w|@8xR0i1^=p}dxs2-upm!yV`4U&5Zc$jDwqC#DB;iIM6HHnzoZYJxyz%M0J8_;J30sxCR zPxwFx`e56!zJLe{o5<_8FPO0qD64xHnM%LRC}(IR3aER}9DY!{?1(DaE2-$))LcdjJ3+07*naRLAsj zQJJTz;SMk-36Xj7tzY^jol~luL#llCj6NkurfeN>a6o@S_p?_igmh3re{4e~DUS;i z)o#0mb5F%wB@^VC$(-v%3)%cS59&Dtl)rX$M`{BH2g8F$k4JNNq*i5;1dff*lkBhL zgV=WZ>gY}Egi3ysgnXWf+H*I4U`^WVn%9T57stc)_ExJV&%MXIsdMPh{`60sG*VS0 z=Ys(V0>U6WA0G0a#P7?PFu4ShvPrIa__7{H@;z}^lKUZ;;5|r20-`mc;2~1|i~gw8 zyCM}F00p1(-yoPe0n}6y+}5gr_-6Kzi0Wqm#{y}FvCr|q1QcRD_+m(;#m}$zpw1b# z?f}8n#GnA`N{A^z6;M2DR*v8ONBN+m^$va~l0&ZS4;e|)vy9uK#s_7q=wa>b0zSS$jn@b_urmt$3(T&3+Gi+cuQhZN&uaJ zutuTn{J#wW|;SYH~g{E6*2fRa!sdvnT-Q-$xC+ku0xOR%{#M zCr7a+YkTv%?H^P^UdVT}N${(nwq#`h+Df;2!YbCP*`0r6YbEFBu-?Y@#x7*-)LM+H zLlv>$bL3Aj_i%i)8svEtfGKSdi+!dL0I3*heZki*#5lQ0OVZGiv)oEubLBR{^gPe_H~f}cps-^kOk*> z{v?3aLFG#_!1$)U3<+RrpR&i~C+ZPqlL5TNOX7Kux#wD5-gByG15&h;k$j~R+}{=N6#r#-oG;|7n% z765Kx&GBr7s%~e%c5l51PU^t=E_pPPlS9-;rTg*m@bJ+io=Zp)v{?{6mn=Pe<>}Xe(ifceA{@gk?{BX>pgd8I7<38B8!G@K9NW1n!QjIS&e> zPeBiy+yq2Z2I6;r@Lx9t0uV3MC%ISB18~Q<Bl;e;Y9j}cFw`KBV6IV`=eRSEWB8L?Y<+-A#b^@YZG{{W1FDR_ zlAQu?`g+==_1yEcCl7mKwt@zkE1g-X>-*7f{bN2mBs!P?(dOJR3?F>_;qZ%3KWl44 z0%ryfr2?P^(iIG2a=`xU%AN!N41E;G7)N77|J0&zUa)>vcb$#{TS0Vt~G+a-N zrvLAM{EtiTXjSlkRp1{da^98y%T)dI*|ZYJyumpQ{7;2_{Vj<{RLGIMYCzFE_i4|Q zs(5TC$?0|a16-E?o|ynZA|Y&XN$N#99{a|+0`gkyW2CQZD*^UbcMsOsx!6NV_luZ- z>xA87#T2FI)fX+mU(Tz8P3r5KwoH`VUqg!{R8*raQ~HSaif57`27yf2H^`ikiWU7%HSZC?)^i>7BJ-z0T@RDz{HtgTsr+p2`Pw<&7rnXdR zk18y*VzB?iHI;-4D-l@L24H^zLtH!Fhj_|9@u>R~R{V28rvIIB2mvWP2wz(!d zpys@=^j?UhZ0#UNt4XbgfJcH!TJ0d&i+jWN1tM<7_p3={Z2wDt=kGLy2hL^3FcqkU ztgEEouM9_)0_SN^q3aoaq`azZt;PiMzVc7-YOMy+6StBc{Ta5S8Wl(ct|*u)58T+3 zWZ}_^mq@h%lq{4)RB2{NJl?;Ov zT5|;8>%R76PQV0#XOM(igQA=z<~GweTUq7#)%tlSa8lj6Tl za=^|2{O4GRL9*uD{qjo@bEC*+au3@rMDn>*fi^!5)f{PA<*E)6pA1IGmrKG5cS{xf z@|!9lK*WZSfN<}TP<#IDxrpnojHlmY5>tG}sy5IRuv|lvb_E!_ti4$8HJ6LTev(gK z3$rHXIqvrdstc)z=|tN+=Zu*cH>$cdpXYhSx`SsJ>L#hURWi)+@L^X{o7%~!<;AH# zYZ3sC$Nt)>MqR>-Sv9%8DhYtk)rx?_neIp^6jFxq_`e$qzWM6@;RVKtmwjng&&)k6hf!G7Ar!^Os&$C?yKJ9+!+Z`WM zLOCincfY*T@@rA%N<1C{UgVb(FE{CZ2gEI3=vJ2@EXIe+wfD9!DGmuJQ{<7GszEOh z2*{7?N$!*O$M?3ka#U_464D_6@P1gWvLGC&nqydn05EIao6gz# za7_sSqj~5J&zk^%!+ae{0J!e+Rs&eoPgqR}KudCSSrWk1PG!he zCIXDcdNHZv!F?3NoPF8DmRA92MCFh%#w1@*y+y;aAt#6CC|M4`z?=#PV_$h$C_K#S9i!rr|TtQq=?63CADn^n*v)VK>U*opbApd}b2cH}* zj70!=$TUV;sHuH8+B_?NQmg-?u#DEs!BrCfU?0gls3rAm#j4j;;XmuqKQG`v$GRi{ zyv&08x`_a1qz0fxY4Jk0hzL*(6&}v+{HqTt9&8*()p1J7Fl%T@tDU%(e3U1RwOjQp?A`Uz2$dycushcS^MGz0p&Q+2vPvb zVu8YfTjd?I7*QhI2?@&nlgX4`_F_iL2q z00Es46C3{b-~C@YF(MU2?iJQq(3(pGF?c*xoN!S!Ng$G^kqzz%$W&$P0ZjE&{w-t4 zbnB?nCrrDr(j;-Jdlt!l84*l&Hld+p_P@-qeY+JAaxXWrEB`c#^N_EUL&RrAjx3d|+} zWFC!%bLKu~6ALmnCy4?f6KF1+G?-H|K(;`|KSq-36T=!?W#DxQ{J)ITar$qTB>fkx1z3)@map;|WQ!Erb8*uO=H=gB;z_E+;22R{&aU znvQ1~Q&xX>A1+D5%nViis4Ywd0rBs&If{&U64FBx+MPaP?Q#KL)yPbCebYEdlG61w2Qu>j)xSz-TfWg3j1mNz3Z~r5b$?{xQzo z$0k5%!mB`MDEvr0skTW7AgKE<5V!)FvVRI%>BAkNf@^cwV8u543Z;4*>Cz-TNDZdy zxh6`AN<)04yxpwg=TS)nH|H2r_sV#{P($;kIPmSjVoBb@gx;{#R2 zC5a#Ma6npYkMa8X-~3G*>qb;?B}K+Xa{h-RzXV|P_(Z)b&ujylO9cgq21mFzk@dHt zh-HQ|UpV)yB!ctHwPCHoz08_{XQGiVKr-F1ikquXpw2@w68*wRB0FK?3ihY9sft0w|1^JH9cwAfrVfMkfS^rpogz{+=D(gT5P(EHlCl^{UKvAPgB7;imLTAhl5iqh z>73{11V{upCnW%k$$66iaEw)n0B;Kkpb`LH2KdL=%mV*c1^yWuoU!D;e2S}lY?5P& z&6=uEzN$xEtN*pGmze(z$^YX#W)T3U@#<6#UFR=#pC-fa0jj@UU+)#%&Gs!x0GQhL zN&uiw$*o;U3@OQ0%B;Qq)?IC%^-_CEip81#}QOf5Ixs^7>`Hi$f ziC>g$GsglFq%i2#ty?@ket&O&pXW&eX;ClLrHmCcM}B~Fc=ep5G$S>~5Dzsb0s=F> z@oDmx{-EQ4mdB!kl}XU_M5%uUd4bH6%!Z z!VS~%Aa@+N$(wwgH}IcpyCeX-%3WRpOrN*=l@$SABN1Rq0>E`tMF3Vdfr)D$jJ?Q9 zugN55@N~mDk3@+oMbowhsaiI00H#pAUxu0VeRVMq~a~C9m^xVS20bo6q7_1<-vz=b+AQbdIuUh0% z0X|Jc;us(nK#rZ{09ONnQI%f2alW~bJ$oj(R<|HfQd;c@)O%9*=HA_Xk{^_?^aAb# z))oPYLykQN16W8SjfQJQFBk0hcYgZM8xYOF3d}6GS732?>E&8wqjbNdK!8P8fsz9+ z&)X!Pd4J5d>N0cgWy6YhCCvhkBxohL>Ss=dKQg=OSHpG%Od_M-rK$|G@M|AR(BrQH zRwe3l-UuGCeMk@;d{r_4NlnNtR$w>1-ml-d!TFdT%OGPA5VLwg<^$9K7`oVbP{E&q ztq@|cEff2c4pQ37y_wEeQhhbzvQZpMKYpye)|zl0gzj`K|WV6AfKnsgF~R*O~kk zRL{Tr-`s^h5^>Z{F%g=-2C_~A?CUmljHjPhvzO!LvkyM}fIm%T9oBK;=RSQ{NZ6nw>TflQ{X0<=~H$hvI26%p~_|cjZGFhrt11M?r)iF{X&GQ5R z=-#aGv#?)0!|+ouhp1#=hPrG`54yy{t^|axXhWdgN(BPlOtv($T%-jhS3%U{SdvJn zL^j(@*}s6VgKNZl91kEE&KnGLkR~%Gkv`8luIp4Kego`|(Kg_4fPVx(r&f$*jwHaY zGV4heie#XKFz%vS5yi zTLm6vKO%>Re}fPJzc~Iz#-(P$kog&jmRcXwBRFKD-ow6< zR=Li)eOe>#MuOkKb`n8(j)k;K#nL?gB{ctrISSBzTC zBeMUk6@h)4apFq8N7m@5c;I-58A(C{DcY5}S??;Toxd$gA!@OuaZfw5%vH))19T_J zM^e;L_8^#(wk!76DSvGnkY`t>Nn~`qqAU|dkUDQ9pPk;(vL#q|^}I^S1m{YSr@ca^ zlA=krt;z}KK?2a>XD~)*xIe3s05VRicv7n-?=Kn&0M|MN>q7u|8SwwCs{VPG-(v6| z=fA4_KYkPct{E=|8un} zL0|>{@m(bV)Ul}w09qPALX*wL`lG@NDR$zeHCOh!o_h#PIWGL74(UVmIo)0s9V02&+A2z$NweuadtLII6-UG}gR+@7E-L?_3i zXgbJ%9^@dAuW2?aJYfLQl6-C4(_HVN1^hir*7Lh4j z0xjPa-|!ps-V7TSxAgwXTjq{4CNL}^@!rgfqh1d%>faAC{?VRLgMU!WJ-Kwb`GqTm z?E3mIC0%O-d8{*bR5Cp_tVj$@=VpCV}9_z+c6K?VFu7W0s`23v+=MwaM}aE?nyKDvO)=0N^gC+02{Gk>D*r)p-Ss-2=ixgoC-D1 zOs#(ZL%?HEq$CTg6~Its{uVx}ub?tGT4hN4t1~0P^W-^)ru=MXe=3*CFUY*QhwcMD zCLJd5x~FTuXm4{O=u$|wX`-BjrMe4 zsgI-bjfC5*!Pe>ttD^uGQ@HlVt>AI|Q`_}{B#Y`e4Ha%OtrQ{awyj;d?v8*cuk*{C zpWtK1jQ!vvQ=x{dlB?TBEVcucnCH&o=~Tx(2V?>k(fhfVc%kQ}9tND6rbWEZ;jhUh zk=QqbOv6(Ko3x1l>t#c&*)Es}=B{VaAl)N*Ki;}UUt7Yc@JmtxtNZHh2o2^*@|pD> zoI1tTQSTKOf=0`pn`Xxf{#DDQ&~w+Pl}n*pTt0-KLJMTV&*B3Kg5?BZ9LkprxM9MR zl>)KgnhzecbsVsmi9j8d1EXn4y|*>0CG!~bx6M~o3GYDSDm3rvh8Anz*)*0b9I6H~ z@qQFCD+#dccNx4^d6N_*k}_CJB@O-*b_eB8e?Knp`{r|opo~N-mZ}?xG#A`x7BP=^ zuax+gg-$QlEcKZ1@{Mz%8KqMKduj(&z@a5{PZplxG4BA{nC2R>q-V2+I^X?L?~9#z$5NfTr`h100hajexi zRrmU70EUku{aNDC%a#C;3vuBz_m5*me>_IY1y;QZO5dgme5%{GX4BT&rpbXidF`i4D7 zzDimm=rOySf0u5!_q4ry(iVZ<{V8}+yyN^RwaiW5zXn5`=BrRSew4q+c?8$Untt_c zRL|W(k4srW75yGnBR6VjUT_NK#*n@BXO%8ZijUBX^v+}kqCl!V+o?i@`@1xwY5paZ zdR4FDG?RXcv8G!wl^}=u*fN<&etZWr^_MmJETZS@hDuHoy z8RYu%`fRu_1;p4RVzg6@c=>YZ@2rol*YsZS7_*D@VP^|@a?OvLs_jH+iI}u=hGnAhf zc7;Dxc3DbgcNnCcsBLU_1q~Kn$=O4v%kd%Pm9z=6)~TxRX^=%)M~?a-F!qt%d>;OZGC56sDY;@84WKXRuzT-Hei_2dj2<6z1~Ba)j}nIdJ(gkbbwh-?7F5p z`s^(Mo{SyU(EB3=oFK&NQxt!*->>RfHsDz-tqtsn{rWdKb9Cz2A2Xe#eeaQ{iO=2* zM7ORN*F}$0p@OuakOd@k=C-3ed}9H{(?A{&kEuL2-@W=Q4?t?&-As2HI3m{dz)r6y zVNi}Vx2UimzDPnNL&x6TRK<}id%+nccu(cL^?x?abQ!+LgEnUj@$9dlK|XrnIT|5JBU>*GdL7 zH^34Ic-Sg>Dj{sE-T&9{_Osa9<33&pPtZl)8cm^O@b{*{rggf_=Xx#8f=YK1FC&fTJQD(n!0a!`275+%TW4Y(+S#y3c8sGC6 zt==amqVH(qJg}U!UJ2=fB-159)Pu-*dbE!=mno>Kkpzd~0srR(5Iw$XK>QWT0FbT3 z`=1tFdeI;MZYAF(=&yHC>Y z;qa}%d(l;O6`%%;$ZzMkPBz!S4xRalaA(>I*Uo1N-6$#~xlLXf2{o}neM9K2Tl{rV zRKk$Kl8H4fbh@vM?JsSwk%X2$Ny6IqtnX-0kaF+Twy=07gQCeZx&s%L>(^&H0e=Ok z0KN3cugz3JFVNKAXzSh$>nybsy}M!*2>{psi(NHAscJPcE}ipz4^kk*0X9`Y<+=V zG&EetONtuq_xV7gG51OYMz z)A&3rjCczd9n~GZ4s`s&G)^lK@;#fOo49P1$+u>f{HkyWp5_*Q*Y;J?Y-Qooi5x{x zvpMVeUgl+VaEQyb#DudoMw9090ZMqyiebF^%ojZA`Uimi^|r;76o31B{3uV+TWt*b zbE&ei5&>hl^o?Z_i6#AOh+Pbtyc&U8KW#9LN8@fVyQVy(*OQts97CL;`qR6YR(x>P zMAeXv$J5f)Z9&jKQ#OPVlqx}qSmnCj-0^~ZuR(s{d3k0z-zQ-xuZ{Jy1e96S`>9n| z6FYhrQrKebH~MIK2BHJf5H%5HLa9z>|04$JAJ;hF1nVfsPc#lObKlzYn_1i!{TLYNO_uG_gjN>8mVOxT`bWW)^0faH|wch4hKQ=D&iKasq{KE}tL4a(C@e zi_cHuWx>UG{w?WBAI|a&)Q=l-hb{Gya=RHeT2_112PTlbw_A>lZC*U*U9x9T`g)I( zr)F$7Cum*22H{RarVsB~g8r(U+D24(dZ+@Gwqek}0&w#g2>er!z{2d?n#}z#f6#qj z$DE^GN2p7dJ-fWQEUDYfv0-k7_1xVg=CwLtyX8MUbwJmd%%U~rmW1D$&mR^q0l$6O zrF|YVa~ooQIc@Wj=8|`QjnIxIX!_NR2bdH}q^o9=cx6*^Ay;zQE>r0b$XlHBTt)cF zC^E*C@^Psf3nYC!3#IrB21#Fd1U(`(sT}kxumuYU7?RK=gk2;2NOXS>hmFGj+QkCM zA<<28uMUkzA8a(^YUDGfv2=W(h~|e3C-3#;5P;gizdEUrRV!{(_3s|^#yRGYU+me! z+$|MQ#pixuKm( z|ELC%y4*7F_*rK%dB;ThvUDQt)twXEar)!wQJGINAJc%)0f!c6y~YaSO{}6r_UQii zxVX`It*#TDh>E+gQOPa-5$ByDSMcLrK@Sw*48%5^KlUa7?Ls?0FoE?5VN{h&cXT7H zKOLvm+wPsW=Sfo!%W1yotTt`cj<9~+6+LK{Ct_ON6^3Bzwu3y<% zkIPs>7#oVjEQzup{VRJ^YkP}E1R48Zz9x=em$_2@D9O|Y{nSBMu56N@E+ldBVyr(|Pm~@M_aqU3p_psy%)Ugi z7h&~c{XLE!vvlZe=uXF)W2}7`kNGuMHHwqt#@=oho}?8Y0R*6;?Q)lu*JP49DY4su zuiwCby=oM~+{(J;4#THj1FPEPr%~ZKBy#lL9UmR@so?&Iy#Q-1?ds>q{($`hwo@UomLl~@mwj^gegttXW`v-xRm_SW9 z0{I(htHwrwbLZA}qmn!p8D1s-+S7-#%=h|K$xqm0UV;~~UaB?hEK=61nOYwb)K-0) zakf-dz;)6)S!46}u4T+<^DXB9Q`O>O!m%PN@0g9|<~N6>^JbO95+SKrl{xZkOF$c* zKuy|0gt_!!|H0cJCp*ld-?Q`;vU5-Lg zH67q+davib7sqs!A}!{Nco&Dx1%L-5OGOYouAO1SI?(?E&fYcFBWICbr1 zLJEEPj(IyM%XPg4wU2LuV9&q1KKdF`9o~YAq%>p#hVGdayfQOu5PB`x^Se`bqDNEe zsrg~@Oae;VA zS-p^|^|Ql`mUmqJj~cYfDIXUEUvTMcu0=Wh_)2_UuAjNqkWKCaoI8+?ePwMZ}5CLgq2dyKg z9{;%)rH?(2j;U9MNFdbpQI4eyyy)x7nV;)uWs|6LS8>sy>V3k#I4bO)S>2L>!jLfp z#>)DJE7?5y*>_+1Z@d$>6i?gRvei5MRFR|Vm!PbDX3V(bs{AYwo@GNpA+$>{>2IH4 zKerQ_r!FU2zSq}k(koVq*QO-W6-}WiX`h*MUoPm`P>IQ-Vmv@%3Fcr~Nh1%o=7gB7 zh68_4*#0deEqZspPj^PhVF!88-jaY}%qtFf{9$Re9sD{|Q>5fb1ESly0z2>p1GruB zZw3uZ2bm)+4sfJq)({WTQi+Q1?NkWq8%1VP=utX3F{OR>Yl%T#(KHf%^Ddb!=eHKN zi0!lv6L+5X+vP2*zD$yL3*Q-TPg-8judHnK{02+I1ClZ6ypsjUACyBd56m;B+nmp@ z2g6MsZ2O4~eWM)bpig)VKoSZVe-USWEe=m^_QQAVm}~7GmB*i3d7QsMjj6DsF7E@u zn@Dg1K2Wxcp81yGipX-q?4xk8-@kUf3H%OYUUeT`5v;toN<--wCLbJr^6w& z#jdX!`oLB}LHTpwx-)^Hw^|;Cr7`q7UtdPP8}EUE)FUj+^My;dm-u^P?K2Jb-Yj&o zP)8ltRW1x^8kRgv7cs=+3eF`bwl8TSr%_v?J12_jmv8O*Z&U_9#5a=}ym*QB$JqE) zEWwrQ*jWo66MMy6)>^A-9>d(vBefh?sL3fswG&-@{CmP_^mm^P=UVI8pR37#Yg2Xx zs}7jjWmTc)5r$C6LCVv@^`*9yio!*u3N<_+o?zqYM2SH%&f$Pn@}V76UC z4W#We!J|K_td$AHQo9nMX44otzp1ZKI`OQu(o4N1H&#EMOI;}9MzN2(byqd^QHCG8 z+_*hZ>yHk^7AXN%lcO~KN_sJsigF{$TO?V=&TIDFel$PaTDyHTX01&VB#igp+|WBD z$hbsxj+F}dzDP3P7mHZX_%IRLT z!ArxaW;2Qt!PFD}xbps&N@@!Za8aW|FuZ-m82qKd*zqkB)%JtlqfN*bexM7cC+6eC z7sZAXu@qpO^3jsyc4(%^bO+%GLD;K6hrSM5?3bXlMOl@N_P=enXLq)Lh|X68aaKO};oW1yMF{dB#~K9QJty>yyq zV7}iyYyPAZ>;#%5fY@{}g<1W>Y@j2ACp{(t=2f;)2xP6tlfg59H43VZ8cQd6ju)_MuApK95yjAtJaTRXLTEqi4EpII3t2AqxH%K{sesyudrPqc1NKUzL zQNqAsU)r;^{ak|RrG58r$u#1U_Gl<;eH9VfV2+X5UdKrn%T*m10|-KGBb>~Zk&21o zPQv^w+L2 z-}j1wX9;KhllbtAM5J?Mm>>bn#SgnC12YD){aH;bnjAG*wM`8rXU96%wv=o*LXKxENCD#h$Z-cKmT3p$BV#Z3?DHbql@dCIBQ>z_VuQZFAS?I4Q z2P|!@O-!OH&zUis%$BAZ??lr89<&;REAy9xy`T4_uy5z`Ur2oY;H9gX{-o4-$KEh! zeplpat`Dc}Ip9Lg(s0VB&IybL{X zZ!Ok-Es5~p=NZH@sV!U2C;2esG!yw;8>oc961bk+Q%qJ&_#9b1mBxqkBVoWni@EAx z^Uh<&q2o--T)icuJIRoe`?FouIu{%aZaYl^+;-*;eN~eI`9!)sWjpnBTe)oKYA&r) zUUx^wz-av|wggNNouoW6kXyfX$6Ex@*<0iEPA~#i7p-;Adc{!zvk3(#u-^GX1sF9= zyI=-MFJvbF#1Xf*D0I2wFbWw}kO%4?kYu38LSzFt5D- zBmp19v3a4;IM*4C^J^@V;D}QTf7Ip(Pw6*->Osu?`*I{ER#=vZa`hgRQtA3Us}J-1V^k&*qlSLgbq>=LkmFgAl@9Fhu1`1?f*#3?A@ru-Xa}$3Kh` zFezf!=_RT)lzyFa{>;&Rb5_2Bvfb}=(QJQ%C(Bh)1_hibL7|JjOU$m=ja)j2f3fU* z7OflfK^w~|q5uUDCx&w``j<bh|Z;pO=|H;lQ8ST}1~Qba`COXp z20Zk>tD!&DI9V&rNadAZ+Rq!$_}F>#h05GU9{$j$pN*(eV~|xvcpmvDWZJp1rMj1V zuXBS){*UF{Mfe5AAH*w~dBrab-$y{TjJ2%78QkcR<>EphRo*Sx$w>2eU)yotKUKk= z(4h@pDLtuz`I8?k8Id`HwJz|5Q}k_mQ}uhf0h-Snz?K4T7M6lEmc)S$<9CS(&uB;4 zaMTd$5bUBH_UBoGdWf5=jgj=BN3JAFTGKy040MjKaG3KBwfh44Sx=LBeY0U~5S>Cs z3~>+#mDt-l(e-bWy`F0oV-3xO%6Vb6WVi6^juYjOoS&p(N0P_zK00`cza{ z^OL9Xsu^*crQ|HWVTpQJ}Y6s+;EqM!rr6|rc}0`{sPjX0q7Qp2aMLUYJzsOTQ|4#NIM ztHE*I7$0E2O%CKiD*xM}v%ggV2a@$+iKe4Oea<5m?>|P|7Qdgf6;-jD4I~q%8r+qv zAlse0y37|vZgVpVds zS^!S^J`G1)c^4w@gX2t?R)rOO@MCcmfF77;oE31J{nGlF)AN{RX~)-#Tz6eA7bP+P zdheS~q4ue5bi8KPUcX|km?Y+wFGk}k-H@5m;7X@S!by3 z*O}n-mCYWmo4kqCGSxKtw3<}YAOGG9knlkEbf{g>Z0j060kJ0fatMIzX$aYk5x-i3v~KT=>jK zx){ykPT1Y6zjIDw*hz@7F=B(+A;bTth$B&z0d7BOQfOJ5$ZW8R+V?d75xgIu!Q%O%sAAE9bm6jh6mpa4t`>P z)q%`(1!pM36(Wn({`mMyF7w@f#Y*C$o>%_JV9qn*tPp*RdTB#Yc5+O*lgoNH?5ndhD`KQOD1lf!uF~$(=p{#;uM=!fxId=I;$yj7wnPSVQYv{hlKn#0q3_80`)o0mZY7e z1i*_v#2tzs8^Tqswd^r;mS&;G;&<}R#Wte-i46;=&_`?uwbZH3E-h=byZPiW69UST zb`Ovp*dL!bk!R^k>m0nk_6kaD)>+qPX!}hXrHQ|8rFj&0Yo z`QILFFWy+WMEn#S3L1Ys#14YZg`5T6MHk5o+Ou**!vph@>@k8ju zDCP04Q%9lDh{yJf*a_;wbZvu!AysjobFv_I(y2xXSkhjj3ck+$fJsLa#58k$(#gmt zU=96RTw;1S0Tbw#A)8nV%=Y0j- zJyvS=1gvFFpL$xn>pvRd$(~a*^~9cCEwj^V(*EGOIHfRoI}uQDUE6Tp+0Ay^Lwc4t zTZIHBu(zHhd^H!9J{~fy;_A)+*=835qyl-&&n{2P?ib@6nMRo}%}CtxhOP(>{z@-q2NQ~YK11xe zL}V=0>*T1DXH$CB@B@)oHwD4}avut^3w`rZE8nhn=!|iPm6aGR-op06TG&IST zpL*61gpljc^R9Wf(=#hVu+;WOi-cL?*VPz$e)R(btJix;+v>|fJ5-Eh+8zCAV{yQx z8gLnrU$oF~!q)oWMLCYwjam~KWI=~s>>)XqDF|pE_wA|v{n@kM^zZ+?07H&(Jk1BD zALA^qeLWv&2nl4fo6RIpbRu$P7TpR?U&|zXgQUDy5->zeuQO`>{h*e^0c z09(2eB^Gx;C0{*L*uGiTi%8l*$pIQ?YgL7tWH+i^f(uBIZUY7-4}(b_zlVnOyeqj4 zM67Ughx3dW;LmHS3xeKDnI?;=QhcfC&_ipKa+xCseXP(5iHl`qkon75!%bT(-TN;) zGUljIGDO^Z@2oTU8GTvQE&f&c?Qj3tmQS_qMIDRAO_AxQgt4}aJ=hnhu_`|qX=^@| z?3Ne44kw6oLQb{b=$VRoO{;10NuG-OKj}#oeb%b2RLkf^n5;F3g>Davslzf~-g;$_ zQg#|}Pzz_!7suNdUf6m@VDctN6z+-nc00`BZn9g0T1d4?LT4={Xte~i6@q822;bvQ zzLVW%9?XCW#lMUUo(WDVv!#HuRy6O8PSDL^w!VukMgQ=?s^C{JaQlu+--#HUN{sUj zOYx>|i&ibs>e1{V_pf8#%ZMxHi^ltzoCcMoorTl_?PUYYcxAvi@bo4~1u%9c6;t>R z8E5D>`wqCk06wfEHbuM%b`b8f4j`C-`#%5f6X&|_M0Jcs%`n1qC0_=}M$Mn4S}@i_ zY|SHI$b6a7!ehfz_bZ1GC?@WAv`Mp!OMgpNY-VIQtivw*wTqA_b!cHBvy^EUs~X=? z12*we20xu3JMW9_7iXDA($xKJIVZCPszO?EM+lJkBUL}@-sIO22VEBoz+Wr>mG>V_ z;PJP(X(Z5Fq)GebLJuVD-sr%8m5z*J_PQ74pRhxKN4PT!X#F|Z=Y<7t%YXvXHM=~n z^UUf$D%_j`9SWx$Wc~R~Rx_qi6a>~%FtJf@B9MO_K*0cPj=|=PP36dIZUO}-*E|RN z1WKtoT7By_uxLZKD4QkdvP&vuteUNbgT}M_&xo7ItmPe^MOmYf)bVL}g+~?2^*@$MtF?+(^O(v)sj1A zZztFNLBrpZq3nFUBVD8OXZOxzezw;ckk9`Rtk{hqk6y{R+~pZPWLOK$j3iD%v+2EN z^H8Z7$eMbcUm)HCUg zShvrEpPW1l8EMHz)>L3%7BlsC0_t|Z(}wpo(g{mc9tk;pX;TciETw-yb*H$$s(C4Y z|IFlbSSGM1Mxx}NZ(g2vvINl-h&M1l zaRa5@S05Wpf%fvFmha8`X+ZHiwc>TUrwyLM)a+Mp#J4dlC^_n;8`2S;gq>f;W~1_i zT=_5qLJ_NtzE987_m-2OxQ4ec{mHn>_}Eu1DRjYS^~Z)g$?TM=LGOPQY*nwoz*rC; zm6wF4zHV_R3^TiYlxhQQC$%X2%pLW$7ePO2x5Pceb!LQBtUcXwmQf~U{DsswY{Jl4 zOW5-Zx2Y-I4BHI$bE3C>DN_(P4SFKXbR{{$=qQVw`@T>G-h49di#j#zrmc2Zk zB@Kkk7^-J;$gGx!P*xV>*ng8wbA4=0q_OXV&pO8*6OmU_s!fD6H*b|4a2NKt2kQI+i%mk8vA{oG;pJLP_V@snKi{? zWj_byd7s2A1BEv*)9lsRN0~apLGoS%VQ& zi}h#&88^KS{r3|Qj|&&VR~EE<4~#?^0%SIEEsCH7rzYsC&e2<7QDVhv>W`2l2%E!k zx=n!2WX0Vd+QA&jr{Cp4MY2KZKP2JGH5d!~EQ6R(MyoTrWFt$~pl zl#x~?(IlB7(+l9VQl|#TR_&)&SRL@Kc4a@dZmaYi755`0=rin&><1%0=8Rz(!EYn~f-3fZFGW$r9iU&#fsZrh~D=l`%xdjgv<)#kJs1#Iz%{944hH+mL z{jsgiW_(LaNn}c>fO;tP9uLy;*%5p}*u43C-4%7aUn=c!=o)0S36&N( zO+GJ$;@j!$8xrY3|G#%+Dlr#Ry+Vae`0k>{#uH+XGZu-Zj?>H9cCFTg58_NHT2BSQ zuR|4D1^i^SU9F^ncZ#hzjWu(6=xL1`{E!?4DSITW-i+%!JQhlY(!IaebDPjAhFPfB zdbUb8&`c%oUQ^240?{Rn@D6 zN*}!PJQ}>6DO^)t{3(<^n^i6tc!$zHo6>OmiZUaXTP-{?7WIzvKzX)uEHUAOQv$|h zlgQOV2NaZGz|d{1ryY7u#$xx`-dR^l3>mDby^!EoFFJV7G;?sLgzEI$`^7z6eFVPO z$&Qp6&Y{F?*uJ>Gfdzhq8G9vR-@D2$arMBc_FZt z@8eZ4@N!=08nbH4fLL$%^$5qn8(YfSJ34}1(x$X#q%18ttgm05yxZ^)#l-+PtR`LP zd~E0A=#aWvGN1$2{Tys`EgLeCt$b1;R-`SU>&ugdT9*OAUNHShEEXZ2miNqq~JfM1!_qRYGpI03F9}?WEn1C0SjU6Y%PL4{j zTt}N&1j}yjsIjA-EKSW7G^f10f?J2#8E_g{6#^oG{|Ln=dW$-4GsAFCs7T5g~G z36ZX;Uu4MgEF3+p4aPcHsRm z7pL|+oNSURc4Kube`eR>(F;=}yCW?U6vZ(Ou4L|`mX_%u`a#i$4c3GqkY?X!c*iSq zZ%8>H=_csw%p&xD{o$SH8hhl#+JDFJy8Er@bNgVFyGHQdEkiTOq28qpI2O%%2 zQS-p>d*sj6^}YDoK=KR)3$bX1!=-YkI5w*5>;I+%TQkfkmGJ#;3Qj^M#u|A>iFq_4 zB!Xs%A;Lr04&s=vd~U8ant{rmnfFF@sL1*r>C6pmP_aHaGyT53s+E$a*MUFhh-Zy_ zS=>u4A!-_CNov2`$#i?xAJPM13@b~qQ~|(JuyP;_1c9x+%d|6oSi09qkjWfT$A-Na zs#Xm(Tdm!%(CZx-$$inIB0lG-XEmYO*?eiEhr>AGXCA;_X$gAb)P52Tw1Xp^2jLGQ z<6g9OF^d8Gu9Q@J5qPMNA4^FQ%HT638ACMJb>ac(9Qpt4LJ1lllr3Cp$FUzR70+qy zjqDJ6`cD^&hegt|xf6O-qIEs$#lMF`Em*#+V*33v76yG|sEBON5@-Nd-M03gLDxmK z>4r*!u~O6lsq^3Gbtd7T+0eY+e&d8=7Jhdw?fSY#7D}(G0JO4M4uyE{lSzU@e-Et) zB1^mT-g{cDxuZ2ttZV{bmEwJz*bgh%gOXWORr7kvsOAk35xP zeCd`~_Jm7PDzY#2eG9Qw${O!W4}~YJV1>1<2iG4(;B;KMMvSyeST<&2CG1RVAJ&^| zhR<-kCRIl8sTgBZme-)-&1l0D`m%CxlVLh4B16VKm0u1MUVM%gIJLkcMXc%%d zxC$-2`-egvcqY1yXz{rbL=m`gmu>G(+1lLOT`mE%FoAzHoR-JM1h!3Yu;^06rRKtZ zaqUhv!a=?7<@rO>Lq-@SUOhh{GlBJ ztgh>>ZHOQrolXU$l7PgDFuBrVMjvP;ZhJo?~iCaMX!rO6pi?y zBt!QcyRqL}B3#BJl)m0h^Xc0rE-T*@EQzks&ab_>DhPW;dwp4@T-XJ}yF56vuHWcf zXP!)KD(EdCNkMb2W_#UD)FuF3h)g&3`+yc~d>L{Dk`Z$NQ0^l$fajH#evdll2K~j*I;0fbWSj&$2I?E*e`4}`H<1*tdgAOm9S+_bn;7D z%s3Y{GCl`g{AtoN_sCV{IdkeNhh7Hc*IkMlPhArG9-30r+;&_&5Ld;SFG@%~uctr> z3w<15NQ5(6@jBMEd=HZ`F)wLy2Uq;cZ(GV>kqiRV#*lh^#?0lneL zr=z6`Vx=UDlaW%7Udg zaqr`xcL@Vt12S=5A`r|WSP6w)p#8_C;DuSDp7wz6a){{xD0#dTgXOa$Pn@5~%#i#~ zz3lipPAQI=r_=)6#&m!kR|l2wOV7MJFg34P*3i*Y9Leoy5>qHDIPF_ZRoshNG_x;Q zE6~)lB({{n7`@WZy9l34v5i*m-VE`@LPGo?`1+B&CX_MMc$ARu8!e83^_>Crt6p@t z$V*U@1%U=5iUn6lEyQXK+)a=+q{rnJDnbB=o~4nrM#|%x$}xX?$R9dJr?bNgK>2(o zV}@-<-LCi)dgU z%)sqi@XZDun=t|9@B6PEV0KlrcfOFTD&?D+fP%i8n6H1@!q06a?(8ab-f}Yxs2uFq zjpA-FmU;s*ApSFd*0=r;fR39WKW9Xw=LB~oTYR;|jFj^2|HV4QN6{ISFC?q19+Lsg!}kuLokQt$|8 z-xxW{{cfZz=t5-01c3K7Oj75!*=a!+?=YF+LcM3T?6*Dw6f5m&yS{Z~F@69S*^zT^_sY@2Pzd_rFG<^Cp) zWoc`RNl4P9{0KAu{v3yaZMb4Ysn6j1r#_+ZXXW4Y=z;b8B8kvhq#NkL7LmmWc)3aA3Z;)vtKXPpnWuz|10z#&~7U_IqiFk#lb$3`IC+XL?Fx7CInkRY_121E&{6cAZ; zItfZTf*5v5jwy@)4I}u9r}F{+fHsy~WlJhnmGzo|h$kwZ{Yz7ZcG93dmey5l@ zHyQ>)D5Bevy7xV@Kn?l=2BX4x0DOk2* zniYr5FvS8DNdNH}tvEhwz9H44xL#GY^7mM@Q7chN#(1RHFa1I-nNXs{1iFB?NDz9YC+SD|lU8TuZI`2NN^h3D8}a}}}_=@4fSk3Il^tgzr0x#BGP<=kM^ z{KQ?e+W_5EVssxbuBv-gQ#`d|148t2Q(kT*RS;<6iy+PqWG`r5-Hn$L@nH(|*7Ljr z^qkuQ=YKAt0q*Y8P9chskq79RE=k_Sev%w{I19(U9P#Ahj)-pfTZuuN&%K=C(xhps z^;JbPPh*RUj&BUnh3`y*J$|0Ae&T_jAsHp7m<%JM`b1Ux?GX4<8Y1&n2?HQ|h78B9 z7foP*i~hWMv#K6+^%Jo$6W7$L3`NV(p$$+;8yH82;IX-xiL3=CqIY5u(0#SYJir?M zq<;h2JQYfNbGFooTPjOqL(+q>SBm9ft_v1lG)K!=35ipN#o5m9v=}7fSi*Wm!c`2l z2^>&hF$O4=|Bt7$e2D6MyZ)J>r9rxp?hw8-1Jd20lys+b4Jpzf-BQviNHYl10wUd# zDxCuiF!%hP7tjB2&b6<-_FA7+_jTwsRMn`ObS``$Xz)9x`ZJ4?ACJKZji&7$h($(v zVtIRT>e{@c3Z%^$bZq97`8<`h@8i;ylRpa?rs3sbE0Fni3oEtkK1tQ1Gn~oX!1C1r z`-P2uO4H^XqG_W2WqK*jySJZ}ZzQ434_<PeQP(WbDBQ+7O8b#NSqtEJq&D~Vdes)&x!cigY4EH1-Z$+q(kbk-fU z5R_x=V<;Ww2W91as@AMvoGZ$>u5BRV4n$uzaLB~WRQ1JGE_Wm;8QxZvo3W_OzUB!f z6WjndjsRi%n)|N-+qSaQ@^V*+>ZxN>iU=ju94+vy$XkN*z-cqj?=eL&M8(qn>Z^jZ z>?}JcX#U0QTvT_-(wvJ0w&GHbyJoZ$urS+mk?AYEL0JzqkYn#a-_;7an~cx~@J4KU zp%E`tYf?Dcob?GZsf>YcFxBKxUUW_bRa7~b;@8I?6C}Y35D+(TdO>FQA6M|z-*0W) zE?wAq7w{^Dtvkc9S=x!J+D_*8EF_j5`=5$zIKPzdDRVii*n{7G7h~iY0WPT8s`~B5yAQ%2kq%zE zmi(1guTi$3TgGQVCP3u0zh2utxc(?PDLBCPws^WorfeF!gyAvm_g8r>adaS&)m7&? zu+nPyoZx&JRhM0-=+Q+orALzsUf@P8Mj>PY{^8Eh3~I>fN8mzjO)kYAN9wWGrC2JyQ6?r_ zPnO@+utU1%U!v6^LfbVe=tf62SaN2h<{Cm=Yf^S3J8)C>f(w8;KJKBKH!^~q5Ok8L z^ePbxsf)B-*jV`)QCZnh0yF-u6D0l>E)de+-@l1E21G{-cQeh%8*&B9cl5{&JHF@6 zp}kDbD~r!>_89u0(-Qlrm=H@;N{V*dte4py;m>CB;+LCD{I8VzFR(> zelFen=b>)|64kYN@GxBnc&rs z%iGLd^r=s9Spx~>4+_Rutba{NB2<9SmQLyFnJ{ z4Jmf1T*vYam1o&8uST6V8|mqg*#)$1SfvGfr1xp1CMeF-Y>JaVC1MV!zKeV`pDJOk zHvRFdCOv5Q8G~-vLL&Ed)G@>|^E)9Clx~a>XC_0R&2*gRKaUm+Xw8v@&J+*eL>~O0 zS&>Gf_pdO$AKN{{QQwl%s8^7QqcpOi7Z}%4u)|BA)X)>T=wwL~Q;mI0^V&!MN>Zqn zVTfs*Zf@)Q5ihd507lM2E0}Fk=-{mun&J6?{3i(@=VeVtW^y>G>JT&gUy5^4p4rH| zdO8Rb2&HOGDhI}p|Ib3Ik3}27i|6y^=yDCg&z)4Tm3&@@&M?`(;*4ffK8`FZ(W+pi zqobKoBH{=&_+D~E=I%?slhgmSQ~ZU+lg@^1_IQhhqwWIPA<6-S++P;w9|;eGo#!FL zpb;(E-ASh2MX4$myfD%WAhtf;-W#9nOJngo`gxt(;oT(o^m7T42c@HiPOk7JgH<2_ z6|&nXE`51KsQQ11e&irSa?l#t%2I_* zo-0OmmLf`QC0)B^NA=>Meq*zxe%=V)#u`1s{CNY)Xh^RvLlZiriz2tYuGz<~OPQ33 z(lDAsEBNJ+Pqz=4_LeZ&ruV*IcX8G^85^##$4bWLN%PDmff?zOK^aO*h#voJmDQ;? zoUHrjNg;o+r_4+Gx`hT@{rNP8{bf?>MPkK$p?@3tE#VictcjF+!V|^km>mm^>bi_v z0!#@;5Gf!8*W$ljc=?5>Lf38m*(=FU+?ksfziW7zp{n!D(A-{L2n%fQ(ASdafDNNU zlZ*Ff@dX_Js#fpm#=NV%GbnYU?}M*)aX%D+Q!WXnhUktZDS2;&_|1N43zwj8I58(X z7mn9rsTW;ruW;-plzOEH^Y?@QoAR`Ca|^gNF}y1Z``lp14C-(mwC$);`mL;@HQB!PV}ATA=3i&5atl#Jcd>a+Dg^J;>Qsv* z<6)CZv(mUu-!W<reyeKXxod?4Jhm{a5M>Ql?zYQv0Mht##A+%&{l&xQ_7f-!bryRAMv6RP;k( zuh~lyUu^3t&W+UI`a+ zF+_yuX{1hro_2hxK~`C%1nnL%3>c$@kyWS+m?h2~QXC!nS3-mpFet|R-)?n@3=hUPzh? z5a+Yv1Dl?X0-%q4)!?%(Y{0DB(uM|_cz4JM+A`63Z?@;Fi%Oft+Pwky5P%`W@92r4 zDSvxviVWQ+3*0tEgvc-nk%1MMwb(AQx_>4{PS@4X#I2e zI|}h4Mw%>-{K7b+w%&SXY{6Mu)bLw(C_?m-M2u~9hn9{2;SV?GC|T2Rb#KbFif?9W z3T2k&-q556`=wwM3<|)e6*bT@(Uli9jt{42QH`SD)sLIeORi zCR@RU-h^#P7bD6xyD{d2l++PHL(5s*_wpxBG54DO4nVWUDMKKIN44g|54?266I_F2 z$%Cgaf!5F3)Md3cWa~sW$j!SG_^OoVHiOOL2Yl1kog$zu*@vIg_8z}$?w}Cg7t*-QIa?yWeYGs~B&k8yMB?FwV6RuFtMU?!=D2K6dT5(dAgK%NB}>cs*=j)!dE< zM;dc^qDr;w);qrjccXl59^ALG$I23?$rUI{Ah5%7E2|Zhw8&ENmqep&K{ac-(v53~ zv!(vH-?M@bXNcB~N13p$A9)C=g&$w}MW;5X9eut`i( zhNppn)&tuympT@9ir~sHKd=t?%1*;}Q1L{K@ErJVxKiK;cD+m`?~y&y9m1(5Y%{`Z ze=iD0ckr7`1nZG8}r_zu2(Stik029KOR0N&~=D*LkRWKs3Ietv>B zJpYfgb^OzRa9MPKRJ%#`zD~cmVsct{c0AUIF(|FcKjv<}S3Fbq^Ffa|L2$P*4XA{5 zppY^*Q-DzH8#!^9nA2flBAbBGcF{?SBedxlIla;CXWU{pAHl>~oGzq)*RcH-*0buq znsjKi{!L^}6u(S%i2)Du*{$&U@sp&xe>W7|#c4+Pj3W_&=1$p>*p1cby*}=*b~p2) zg5GCJ1a3hbFUBs<$yt$q@H{)?-FCCh$c9T}@4lIj_?y1l;0((-sk7_99x?Cw)D;=U zUNO{H>2p|>`JjU*HdU9MtKFLq{J#^_S&&m9ep@<_@npwYZK3%d3@Vvy3#_#<;@4tn zrW(Rt1*2ivuZf&t9X|0mzs^H-q>&l;kW5F3>u0i+Ygk(oyNF;8nXBwdBgd$>GWphv?ngl^Ab7%0s;+l4O zyCe=ez0MXcFZ;-@5bm@Xw-ilGD^GXJp%)Au0$G=w<1zs$oO;H*aCvVmSHs)O_WF6* z`Kn<-`eORk`g3~3c&ie4E6>x5dM4B&6A)_;g0`CWjp?cY=3tmE3@Nk4aQsDRsZKQI z@ubf7sk;~V4tXY`WRF~Jg!SvUAOjz8CXg--hB;EF2k%>ud)zC@wfq+$F<=P8|F{&l zeYD(KOxj)Q46D&XruC_AWxp>kXCQUx$JZnMmlx25dHoRT~-{|LIU@Z+hz zFy};@WCp$4*~krv@fS$J24>YaKGGmOc~*Q6=vJ?TeIHoaHE$_L3>Fp^5+WCehc#Ip zX^%ecx~{1%B?C^k_eND-oRCv0+7Uj4#>sc|jmNLf$9z`*Pq3vxEy&vnSteRmVQ%c!Z1c{g;kyMFLPus}n<)<;+bl zDQ~f7Mt^31R>^XigS-<>6&@1!Es*<`hogd6&gB8OQldrcEz#%{POgTQfJ!MNE>}yF z89A^B+y59VYWtKcPCj6QrAK?q3#mtAAjWHDYHQ{ifC1+&L_PM)6fQ(CdhY#IS+T{A^BisLWY^8|9n(ML^-Dg_hG)=C4RM zaTZda05kLn_3$i+t0CTK>>R=AG;+4lAn=ItKNjGft+Q7{ROKB#2k308469;;yYEoK z!cXC$kPc0@IO>l`g1SG4+<9u)yyfZ;VBU&9>;D08_i)j+xFg)NaM#YZ5;&wkmNAqB z9(FFB5AA;O{P)Az)s-9;eo_zLIS6EdR>Ne2j!}PCvG1AXf?ms!860eDuwNw*>soI>DM0^EsEUH zuPB_0zqrgfbcb3^%{X8N+X9j_$rWKn<@8%^)cMvT7trN?@EANF)yPSv$kr%4HPo&k zy8aXIN7Ycc<~btn91zmZDKX)jm68C|9Ka|3G0Aeri4FkK#DWX3R2?X-?&^F%vtJH{?&JvX&*TXz60X z?DzPX;P#5+oD$M?%B_R3qaq_bKlttBQxeou3Z%A2(DRw zvSl7sjZ-ia$9;L5KlmF@ufIQ^3l zC8Nnx1Pg!|zrK~j>=62wSs+Ta<)#7zl<*P5oI3+Hhi7Q@b$Jx_;78MvqSi5XSufNP zq}k`+dRe^s=gj)NGm#rzzNoED-j^mU22N;1DX`_v6G3(Caf5x5KucQ#Fq(`Q<$1lY zu;c0h3lEB;#0EjXi`$=r@|X^K9BThzX{CLbW%PG@^%whDd^X=jE@St!$jn$(^T?at zptgYmxi>${eEjbnC<5i;f3eA~5=2eH^du38AGj=$ zCGU1m+%F%NTlHpVLnD2*YMI(!;A#HDzcp><<9s7&ubZy(?5(jX530X5SMuZ&&!6e9 zPx~HuZH!!#(q7x35&Q?lje00L^iw-;9EfytMU^frQ31-lm>UP+MMuBmbz#B8u7#qr zC9}1G{_$x4DTxst7EpZ~EdbK}8U-BY=b2i_nMF81E1BmBj{MB2V?RO!w>`_cX!f2t zKMxHpLStj3n6XltnLzIE__Qm%okcTChM8n>G`}sC!{t<4EQ|&zS$QlI;>#t#FTC&1-X93lGOs`ZF~to-E@(;zfpepI3ea3_Kc_671quLO^U$7}uX{AvmQZ;?G5j@OuV>~%-K?>i&lEKcT-|})Wx_~EbXF(anVxc0C zgF>icJpGg`vqfG;Q!ZEN4aErpW|Kv%s zyprMfm03N#pq20i!)G-E8rsHjsg}9E1~iKsuf&1{jk7#Wmp2^wrmZoTk0EaLy)Dyh zI7?I8A`6rEXGx`Ir1Qm*=v#^AoI)as_cTvf54;>%j%5MOf%jJ*gc{03MHeel8!ls~ zLgjSmpi=*ZWo;Pcf;_A=t$gUD(_R=x4lvxmzdGKQxS>NU$?yO(VEazG?7M#&$KWKE z$-b{#xH{ol%29|wP%*Y`TK5l4e}>M zcuKZ3?>0M?F27(#E3nz9f&6sBcp#iht_e_eNF*GrvB^YC9^qS^;C~4j5MK zTHtWHD=2iRZZFeZAy!qk>*Z1%t)P3!rm!KRTB0@`?21@lU`$vwAXAbW5wnP#D|ysk zUu0AnMs)6nW;nbG@0?TeKOKIwPgPTW7N3_@@Pfif#o(&%;ywxg-m@uz1sDh`S))*S zm6e5eFc(3;!j1l~6lvI{aPGpf(7)4A9vQzX~u?hCYM!HEGbu&$CG53hSO= zx{tGu;n1>>oXYAM4s-~Ka*h)gd;s3$a|!t%E z3f$gO9*L(e#qYSU_n9{p984E0298A6n{}C3V8P8)#?4;a<1jatt)*bnm$e8{fc?{h z&WDFFLkF*27+dLHP8WN$8(`K2y$=oX_ei+L5T%C?_9ZIpJL+z@01n_kNr(s*sOAF7 zw-YV>o&HC(1My9p-rVfFut_w#3$%jI&ZR})4@yrV&JbDPoj)zwu4mR19&^+f0`s94 z)2eZNiR6)P$hMRffyF|^NWcY-CAGZCKSWzbnlt=)6Mnf!i^~prDt>-;YEi5JP`0q+ zTEhfQR?5t*(TN#rL0jagQOO1hu-Rpd&L6_7wrhq`Hu=V?W~_htEu4={(2d5CQ$?U6 z5n%VhV6=!)XIB+x8HH0iu+rQAK7u)JN)wXBTuhn#W;7i}xx_(HJ@khgtN92bDaNO& zK}q7!%DMEtUwo;M922W=y@7V_)vCSQxKDfW!$uxX+@&{T4S<=phYCxVn=pQiyucF~ zZNO_Kvzr~UK9DGFYh>|Fuz`S~mvO<=0&~Hy+$`pUjfXXxDhhs&FfxKSg-RQOT?E?D zb6%YB?qRC0aha$p;_y^kT7vAzeO5?O3|2^(9%qxAeDLXd|01w8d|fcc zFE!W}USRjPg=~IFg7U=YxXCH;Pe_W$s&o?8B3I2W$cCEg)&uRa%LDGw8piONTu5*L zRV!^|E8Z8_3OuE>6on;D|9t@}czG-P?DkYEF70%SCknZ)*~(DuTA){+*mBAAo%fre zm?3dNn={E&n^`}^BVxY2f1MGsQBIa_J$KBqL}%yUA&OCTh-d0>&=va{z9Pm)3fWuC zF&)delmhF2@OjSly``A^Z^AMf zE#kAAfKk88W849*s^@Aj<`Mk*>G`D2=4*4k9?AWSEg*IDhwh`EXAL*R2QR~0n1K-- z>`r1BQ<^~0h~0aQ zL8Fg4U4EM+_cCcHa)=Gu{7EfpnZ6zJ5A`k|nUgsR#X$bVRYr;8fur#W+7w3x6@VvY zNIm+^gHhL3zu8Vt`t_&w%s(;;sL0dPD%?vlwxt|_4P3&)%`WT4k-xB9SxM&n(+9#E zWiOuto@VM8CBoc@h@NvUAk-sFj|%$gPY5f=f}C^_0Ac97edzi|2?j=1b=K~qCxA&k zz^Z$S69l-)*0KP}AN91{p7gHyGJ)~FGLMFsd%XBARf^e!oIO=w-<}M_TmsyW3^N zD7EZQ5n4jnbeojz(OB700eoxez@jfC#_I!$ujhH168z~ng+clma|ASiEmx?yxu(Wz zgtFtA4IYbVBX*SPCFMD3-Ld20{k;fV6gY9jm$>om<^eQ-qa~n!%y%9!taI@Tp?fsy zyk%xgK%i3KSqi8f0%kYVXIOaNYP1BRegpRR1yi{uDwD*+0*=NhiAC4YNo;Jqv!rEV4J!SE}UVvVJ*feVsZnu7yO3_9Vk=Sm__G4Ht>kWFjzP&0FSm6U2 zFM+sC!?A5Qf8lvb@I2JI`>BIMfJ!^lOs8Ev!#mD@45RM)cKeP3oost}{_XqIIWt#57M7t7kH zq3h+9Tc!W11$S81eYRM(v}`Sy{{&X3`SJ=qrP$d$E}509qYPeK$md%O{L|Mf!#yf! zaOEEl4B)4Up0>Q7>Er9W8pone1c2U;DSq_s)bVME9%ig}QwOfl>vN8%c-z+_m18vg zV;A{mB|J#IUozvM0R2NAn~0BR>t@qk_LJLTH-&f^zf#op-kv=s< zbz9QmCYZ;-J9@wb0|W1jVsoKwUNTGpQxk_I)~svvV|p!I>>_9mykv9cRRF{hSmQkQ zcVr)4i$}hhr(-E@P!t0t(Nb4rX{PO^ByALnIKS6m|* zR5*T5=av)cox8<+I#V6oW(sQwgN6}u=t0kq^p2IeC#6FlI*9Bk zrPTL`FK&lID^gLRN}U@k7}qFaJB=9msTw5nMscHYuevIHGBCiw~K*X5bPcpUA!0LfJt4KMjEnY3NWzZ*Fn+LwyVKA(7k>*4?-oJeg3MwNT>)oil< z`)yH=R{$*3vNvEkFAMct8MxlSp2QBEiAyS3k$@l*T8LjLr5OXb_Q~(?-oOR|Voh0~ zC>6ROoO}YfttcYL0pPEe>p6=#t?r!C0Wr3$?EHQtsqD{?OWDWe-^#C3K?K*TmIXF- zjlO#0fQ>5fo&8i741KgO$U`)#a9NSqa+GCW#LXuMSV9l;%8#wu=hJ(&yZw$|56m=p zxHefv_;92NKd&jnd+~8PN9DIk{0#%@6X2yOYq2)Jp=#XJc?^0;csy%m*Z!iM+%|-; zJ7v;H_Dh5=8M3%ubdIO=;7tY2wS3wFW+=$gO7 zQhLIILjoJ8{66ulCDG{pd1Jx$8wVaC8!2NTS+T+vQpL45=0RMP`jIgL<9FcNXBdxS z{7mx=)mca=1FE~gP6nkGIf0O2MWn0%9xoAU)6J;x`PS?c2bhZhTG;ks?_@H3u~fof zK`(${pLShQH7iA*Nam_u?@yzT1-($oMYp@XBqSkiSbSKE2~b*PXF>`rr%{? zg93m3KHNWC-dchkY!ybCiRxfS-Xlf76-FF@Fx~Tb3JD!>g+x_x?nW zYw!YF9#q)e(T*TH#dG^KiL1gEY+{uG!rH-yzBip_N?KkYvJpgV2^W8OE&MulX}^lJ z#;O`Te7k$uogdQz@h#u=+>j!H@ql6fg`L7<+3y62fQwRN_c{C%^K~gae zl76F=stA9qF>Z8=R^U6IEq^POEKh;GQAR#73dVJ-T}TeAt(ff?NHK>fM8|D51ZscMY-sqwN8z z3UUU%Z573J0oZx(3u` zXNkRO@+9HGHt||F=dcCgE=&e&9Elk7S-!pLmlJF>ZnW%k_QRe_*fPP{qtY-|<;sp4 zKW@?9PBcaPC85-wdGy3sV_2*Pzi3@>XxOsT6@|E6nA-{u%2qEU!eSr#)=rnPuHYvW zq?k)t%*yQF*%3A&4Wo7KM^dQ52MZ!=eCG5a8ZP`BenB9U%yKM2&NQJe)O^~-qSn0G z!xIPlPS4kT`gBRQwUE&;fLQ(M{o=mgHOt*5}#RF3^GrzD4{axtir&=jG-7 zDVrjffPO1Nv$T?@&rO5t+9;Iz*#GEM;+7@Q@oq9Ggmp= zD{fug909~>`nO*bsyxt`(KFWN^yo;Gzg?931MA#u35o2si6xpB%3N^T2} zi>F^UeWxCFGD8S{H=2lwgM*x}qRzK)2eD}hcqkL7DO>`w(j!x-2+olQ0yYQ2uP)`E z`jgw6FOU|4pU06qJu(CM7}Rz*XjGjvi(SztUn-AwDrMV+0tS-nTM>{@_1s zEcQv<8$Jwumht_wbSaN1=Bj_s5S*ng)>RfnAf;{#t!4pOr1tfM1xDgtz)T%-1@Cve zc}dtvI67qn<;t?OqLBZ*7l#XbWUVi@E7T{6-t#9Z@RAI{38`7cb}1t^NrjJIB`vGc zYkjHf>sMpXJ92F*y!|oj?elo=dm`(x(e?dt@8gJe$0n9NmQ=&qqTMKS7_7G;lWFIm zboPi*gBrI(W}5+Jcbum``xdjWIyMQ5eR6p~<3%!Qj6_LdPyyUzY@H z+)APGEfcKYiDT1ek41i=5wsSBVt5jNLAN^8CSVgp<5gYV&H>vCL$-r=XcXmXJ=-Fl z%R$oXr^Nit1J))Y+%aNZQcGz}UfSTqDtV*6B)Q|23gT%H%a@UeOE3}o)=7!v8+w9z zVc>Dn@#`odxJyxj2o|4WtMR;~W*41@hvJUFAcfrYKVMz%O8S-gXWP-*#{g-CH9-@l zTZ;u=xi#e%Tt*{1;F|_I(Z9s!4$_~JXpL_c-3&=Q^D1s!W+)S!49#_*q0px?frAcp&@RfdsuCc=?L&eL?@AHFl`5(4jSST(DLlt3#tAv)$!`fG)?%(zLG1XV%Pfd@Lz(z z`x`y{eTz5Coe+wL>6Y48@PFyE1u-u96ZqSTM6^uR?eYjE@!$m(3ez7z-hW&|-ny8a z&kbBDT6=k6b`QE?M(ZYC$Li(1b@2*%=9CS11bIUaG|rN4vXciY>6+!TwNk#vjL!=f z78jimpKSG1@)20Jemi-S9K*vsAvGy47%Hzd^ymQPtL8G=$k0gI=$gZK zx1EKaVttlxEcs_EV;<9#A}YvSWLKN_{_(&hTCnDn1JNtafWWnWHVRJNMSVb)w)JOde^VXyAq@xj)C;KGz+aqDj{SQr{#8XGsx(wC5z zxwyN#%N&G_9Ji$#^R63xm}vTZmC~6)9I*nG86Av~Dr9+-mhU;JQUhIZ_gdC+;ck46 z`Hq9+gFEHgeCjd^RS8VT%WKO}CRrk}YZiMi0aeM?NL?)U*914=)3rX`=lo@XI`25F zJGlD2c2lnJmuP=fAuIo<0z&_-d=jGH=L8&e zXoYOPI~11zuwUH{a3VkqGuC=eA2oX!Db@ppP@ojQ!W|*tb2gcrjAHx-)`I$p#yJBxYXzRe{s&0W#s=)WgZ*ny!p~$>MrHC>=eI z7m>@u`(N$hA~02TWJ>gOQvO0#M%o9s;^FYlKv;p z$>eRH%20zh^xN(lb$EPE;L=h8-&-m#KK9f7Tg)36S*?`gg3)3gw{hcz#UF~OCvAFJ z>ku6He0M$02SrUrm49c_v}ogh!FnkRGL)M;_bM_N^b3ztVOIi=sxG&>tw?RsTex@b zPMW&q!}#Lsi9ZHT*>{z{k5f#D(2|$lqiGra@T+ayP@1J;d$tvWJ~r;1_SfhGbR839 zVCF!Pd!JVL9nUKrobj`gF$wI{(5!_M4lLlgD+4S-f>1U?M8Qht0-YTOxxpeoo$|UgTA5@z zIAQto20KMU(f$yG{eIoy@MHFT7PS3_Z->F7F=RtV?TSH! zn?nR*{W9TeZKbi;XvvNPH4RMz?P@Z5bj*3`T9>3zDKo2x>8sJOIm}x9>K%;H^Hq)t zAWq0|>3dTcfu3e!HRS&5TY{@YBCDD5aNv790oAELcN5l2FMkjsM^n6i+xYwn{)e0R zgBf(?7EiTxstcNVR4$*}{TqUZ4v3LF1<*6F-=4}$3Uxf?N9|+Or2yi4!KF94;!07O znvb294^o@0$N0$Oxu>!8adX@_xcA}I@&4bP&(!awsov%OnQK#a?mtLA;dXGyibjj>zigC|LdzVAe2-TrAaeG=7#UmdTE$=-_Zc1!3evNkv&?Yv#EdI0_zshGchkpc>!LZPE6eu$a({Xn)=u|&b;VhX z7qTH2y`3;l$hGV$ZRfMgZ}iRToSlFmZ+?D$|9)7rZ_pzgw<2`5#~V`~d?lO?N}Va-_#W(^2ZG1nuWu``hpq36i1Dxru;+sw%g!i z$qXdF6adEzgplf}C~1uY=IN;;{x?2uxKad~$tV-vOUeWM2cI@FA8b>S4fyTphJV}| zZ_}oYWT$@xZ5$AAj3NAU)b#$g8*b9qKM+bp8%m%CGO6BK{^g*m3-Q7AF^7h;F5hGa{s^+M__`2!> zdEurztW(@$&$Vnj%+4V7ipnM!L1yFp^zPt<2vmam6ij#R8;cFJ^MBR^#5^vLUk=dF zfsp?y@F3i=Mw{+t z)2P$v-<+)sZUdo5-2DN~-}_}lFTMl^(kiFRcc=-EBn3!k zi@+#@o7=uqM!A|Bb{^hSYHe4IF;LtUdAhMG;Px|PQpAVA{Ab$h@{)(T6Weyb`=Gi{ zUP6&aK?Ip!B~UMAc~>a?K+H!h%UATodE}h|Au&v;D-|RF;?(6BPH&CR1+? zgOg~4pkWalP9boX#pKNBjI* z1NSM!(YiV`UE=yP`mY2Y$H$W;R614x_`{@}9rI&kBGNAtaYj@(KHmzQBXKG78YEgl1B!2tKT1;|4FPA zYnTYAj6{|}!@nHk*+0QCChxlh9iCFg?hguNGc;#0jhvL3UoGcr-&E9g>+5pZWBd=M?%?43StN6o8fYNYn(-&iVx6Z|F;U;gM~v0C zcedT=&+6^%Hh*sQ6~D46RipaUd$Ut>ycnzBZvIa@;3<#wGdxH3UpTSLPvx`k4}I&O zLu6`P?ye0?yW~kw?h=z}JOZ|@t_-vi+06#JX^}N(2imCaW^XO!+y1oaP)F;zN&mZw zzd5_EoeUlAihnEOkqoGdz{W>y3X$8HO(5LshjF7t8sy&{*4WVQyDz)%YDBg1jv{Bj z7824Mmp>%!=BF|$vcgmL<7kzq4N1|?PE4pdi&h5$%w!Q-1!d+ZTR`}|a-2osu1G~CC?OK@!U&}un>HT>spDi5jQ zNGV*vt*x$%3v?E$0Q==KfK5?a&-UMTbTunTOAQCmEL1}mJ7j^PfHc3x@0I(De9su% z%tn!mWA|RE$OCUm#I0*%_lXfI=~y+>aqC>(CHpz zC@ceea-6)=dj@#35lBy?x+4li6VL@x0O;j(5EanB)v5u8(0m5A+2z2u#mL3*?+y3g z`X9ex^H+wBM&b$dPsGLn`VUQITxjo9fhF19o25dm8G?MA$!B5h!0*@XcrG|cin{x+ zoPZ%QKfe!+Vm{`uN5$h~|8nnRmiKLKE@q!0S&=n`aGB|1X|hGyw`PwY;*z_0P#nQa?~)n<~u}>Vr2#lZ^sIo0P;Y zz|@J}oA$R)*%}mF;!V%-=z<`K={)qhr))jY4MZ%v!dGq5BG}4|VOsZ|ZJWt)aiz_d zn1Pv(Pciy&|GL(=!i?@l$EaYae@VN9j_aoQ zAbuc~_!bup+C_zD?k%(voCjQ0=v*<@$RrFp0(H|=oUrz$jPlN_G^P8Djoc&e?q4_Lh!(*v-j+1jw|ACLWMJKz-(`VPdpmgZtNtGU zY12#dwY^@2kC(~cL=4=VJ-EJDQGnJwE4kZp)i$3Pxrsn{S6S!yTR_xaABAc}G2N07 zfVILOFDjsY_8$_}L&#ys4BZwnzbY*IG++vaATzvRn3gcSLB1S7@=+Gle~g&Gd-C=n z7y0HCT&h4aNeQ|decr|}uqU!;LU?z2B7!Fncxenee)gJrMwBDl5a?;J&kc%*Z!1p+ zy+UY!R~dg|dc)|EF>XGZQeO&L*ky)51JbhnAiet<&^Pj|fQ(4p`W{^7%I0J-=T+l9 zFg%yfG9vKKF;f6j^0@A;@OUAQ&}N=Z*NJ zqB~2H&J1DFVPy0=G{R}ON_jgg7~FKRhb7?pBm(U zuE~OvynNd`RrZhF^I7QwPAjiDy1Osc_*^GV_QXpMo1QrOJP<>JO-_9L zMJK}!ePF{LB0$4_b8)8-RKP*DrE&Kx&X}xO=qm|T2?@@>hcTL2B3Sb)opP_)HJTT;-M;H^*5@B2S(C>C`a2H;1U}7Ccio$h=(uZzn z%*xhjSi-{ZEPYQLz_3-6Lc5}mT1cPFvp|$9zcQZ0-N1lk)4?8oCg=|nBOa>B2OFU7 zKSpRX0abU$m(#c)7=laY)m6lK-h^(8y<~=FSLn;(#y^twT=ef&SfI$imXG|Pvv^ed zx-K?ww>*tTWySF%a8-10m#9B7(#`n4poPIj-!>L+J%--EXIXGOF&ia6w~_Cz@! z1o_YwRxBMYPkNWHX=v6Ctjs&Y9=pttQE1?cTjOBXW78&Wg-x39NG{PQi_9%9rhFOi z4CpX@T<+Bx_hD{>$C@L-#?gOYPuG6;k(KmJpx^ef>Siu6obhpDZ^@owJf55#+1;tA zxrmV~xBHs;E#2MSA|MhXCEcY6 z5*uKEbc1wBNT>8r8U#eTrI8o{l4E=Kf6x1V+&Me@^qhP5bKTeVyJEf>6;K93LgRw$ z`WH@Lui#!eRX-$m@r_gV0;~L!9&|((Ku*_b#^|taLy$jx{$v1Iat$963OYy`=fhmA zU5xcu-#o;oCJoXgC9dXz)x21riP0W3bZmYS9v1R}Vy5M>i2cTMqpCED3-YM!;TQg_ zq>Z36Ii3$u+tDm4*HSE=$`R>l!MR)>&=pd&7drpVl7R&}a@b(m6R^wW zEWEOz@_gEvt4M;i0(fe^m~gbT*$&=AcJ$nX9#&-pnm5ww#G0MyBecn`dVM8nl#dzm8wwv~nE>6(%kAbJG;f3WOsM!$n=)oH*LP z_dJNnq+z9NdlH>7u8?4&3Em#)n)D1#!T-(Q2aTo4D*N7Uc9uoRmqP_Bo2}iK9+VL= zs=CTBW$Le(;dmWYZJD7=ash!Y%ey7(D7=5ei5y!R+|$*g^1BCrE61iFcvkT{A%r$) z@b~EWTnG#ikAe1GF3-=+FTCE*F&8c(W|M{T8^MC0+_=ad(o~!m9EcmUh4Uhao zn^8;>S&uKWBUj{}?v+$925%Q*Cbm*Tl!)PZZ)ERn@5LV7izN_cbW%Hv)@E9h{p>$( zoc?fsV=UKgF5zdaENsJtK(s1C?!&kh-9LS8QagFF= zLsAImqOMbcJ9LS<&F$}zd|2$&-hJx26SGH8pjjr5&qMF+t#XLl9#aTCCs1SiYEsVm zKF<(5r6-CAn8W1TLPYECubDYvN|=kcE~@0g9@{y~vBKCHx>4KmQJrG=2TV?4Z7qks za1L3uM?8XFwzU{Wx6SYO96>K;gV}-lZbjIgD;S0|#CHB9g?X0;puCc|wI=`-?x8UA zxDj=HBmNGvuci9Q}qz44;RxV7sB>~~Lmmz009yg-HJGL&7`&yi@BDY~d6jzTU+WaPe_%DSNeG*(5hi-+{ zE4%oAu2&6(A^Hr-4SIcxbj}?RKOj;(S0D$1MQCP|c)O~U?95vS;YnH*;AEeFOLgh> z8*3|f@3pRxt-_^^`-8De;ZJ#a)+xd&V!j6&&9-lej!A0F^xgrS*ob3-Yi%|0t1>?O z6LNslthzdlbD#<+lyu(O)iMs<&%qtSN0QjfKT$=mOi*wDM0D>eW4}{w`Oi44YrlXU z!uwq9!MzJh+usD~NJYIwB81C39MiJn#wk+(A#3+Q8z25VE=mxR_~`AoDV=Xm;@ENZ z^qqBvSH^g%@;k)`=~z{z@ZrC$D~N|hUun^Wn{l^C-bzf7y(~itU^%mu9~3^Syju-S zvwo~;B06ekPY1Ks>3(i-1yePeTK4ZE+QzY{1KQnJ?}CX`ayVJHYFJwxzGkg(Dzhdr z(%lVYX@53h_+#n?kt#D7G>gE8dVOGj?vLBz zcQaG5uwOB#U4x2RMM1+%mNC%a_(jeCdjUq^&)-uQANitI_Mp1w67I+i7m;fnf8Y4$ zI*0EKYIaJjV$A>$E1+<_uligVmP8pRStz`xLwC=-7s%)9Z+_X!Fg5#i6D_P_#?4Xb zr54Nxx$5-myo<*AI@o=86%?(K@VUL?O*&c#hCbQ1LWbumPH}<$TY$PfPN5&^Ra+y@ zrIt+V8~i||^n42MbZE`EmdW+?UCz>^qdL;&Y;HJ0u(MMlfteuAzT+kLwXRJ@ltC~m ziDHt~mn}D)-M=f4kSF#5Q{NX(c|?2_0{aEqoTMlGD?af?I=Lq|=vyX!iRCSCG6>mf z@rj3Qgg}Mfa=;AiyI3-}M8P=-UQs7z2*;O3-SJ^iz1mdE=yblQ@Z?U`|V;ry%(bRjltx#u=WY-&XT zPAmPI%)^<1WN2h0<^70>*r-$R_VS1@#n>A8NjB}5v15u0Cn@zNjaPWrE1CyIq>&D} zgPoDeRe*Yh3hN=tt~VHYT4d&$%Kk=I*VvuiRD$+`&m-J&K+=?Aq#^Fy$S&yzo^CjW zj7)}Ry)lC+bF8xVNQ)Yf(nJnfzm}baUIoy`O**NL=JM=dnNGkty^{EE#kzI0Ml6r* zaX-r8h_kD`lp~y=}ZtKZPsikZ(3~>vt;Xjo7Nkl)r>{Q z+68TzQGgP^Ya|HuD*$ZLVA6Yot>OjnyLiF*2A_!9}TbJ;r_A}<5gxrp`?29c9)oyHb}e9rXrzP`4=T{k-7iP;wFU2!FF+f!^-u0wluu?84+)JNJpKg)^ za$)E{!rnKYh)sng(C)y)TRDd~64_RY$FW41kgkaEk^bKm_{$`=o~HYb;QKdLoSOhF zMzetuwn?iaXS4!wv`wc^{j=Cu`o{qgb)Qbb^EFeO`>sc?ZF7Nvfq{$6jKEp%`S%0E z3<=b4$YOC1Ep6%*=$08DqSyRyy&)amz47`i*xc;v!=b;4%u22ndeV5n;EHd;Re;HJ zvluT#`i4tV7K<+7S8kPnW#bhF6=@Y{8jg8oQy8D@tsM8MxN+1rh)0f3KcS&IdW(lH z_yb}H0r4QtA9@R>0AR-K;cq4X-kk5n`M4QqW=Fya(rM`s{;w0iavc?2db68Fhq8VH zCkV&HaFRafp)K5Ux8cC3>O&wT33tFHS16G|M{odg1|Lu#v{xmfb&*PJN(17EBeOH4 z2i``CV)5goj;g+(eXE~YCxK}LlzIRvMcF@3!)MPlRgs0g(d}c{C?V1r?skY|x6+ne zP5$@5k_3CG@d&3@TQ)U~3ftiaJ%7fTtqno8xo!*xkA^O3%_T@H_TVidFJcRxNc(8? zy>Oq8PQyuicxTt!IbqB&z6~vtqlB+jq^t4rY+>mLWkODS!AIkG z)?%!;YaB+j3zoL3!#vY>Y=lSgCGq)KM#1WC+BOJ~LF>Y^!fh<4J9Es%5+OyxqF^UN zJziO}m&3>)P&757C3c{CCOCQ|BsQR`!_&e?qOwro4iE+T|6DC62l7emU@FUDv(Bng zwEAkz9*54S>-Q$6Z0t#L-p(zFa!OpVMNU{77f^4YJ-kmOM2m@`l%JRkhR;w5S;n?Y z5@e&tCZRo~3Odv=q8pxuysFJ(Ajcu=JH?TK7x@^^LV56oO5eRubiumwgRVAxOoVf$ z_d$GW5mBA@duUdE$_)Z>?w1>-|0rN@P0{cm(@OXNsI85W?7_q)#H?uc430q*z-KV} zYocYdI3gHF9Nm;V--UX^a0<=;^(Z904{he)nOfhV|F$H_d9Q_|v)wzN6XCVP<;O(P z&KgHNA<61J;_n^3g-RCBdsfm~SaZpy#~XS2)AK4_m#DXHwAp3Zs}PUDMP$=*qJpe} zge7=n|9PAz_y4I@|w7Hv#9k11$W)P^@chZ**MH_>C2N+Q5B zjRc+&3D`5g5?uBELKq~DFtxvv#J=GC&OBLGsD6xf)k*mUlDmlh+4)mjdHHHb-c1;W ztO4e+;g`0Dea8(sh$4qjl7hc6kHa$?S!o&j+Eh95CGl{`Xhn<$mBZT}=f(s}QiN4T z6q8-j>}!kO8|ROQr=>vz()Y`YS;qXqf5fp(N=@H~@Mp12pS7WG>t;QEK3)ygzxq

hT$TUqglv#T8n=(gHO`Q;)EQ;5|@ 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≥X$?4+Knclni?N27jnrYq**VLufx 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%0ArBdpt+RfArLKPd^95Zu87*ME|3VsR97@ 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 DRgDi*bRFQlHE~tKA`|>BJ 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 iQlE_LMNuan>)01FBcAkOJV(^ccg6D$?0QRF> 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 Du#Cjmb> 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�_mCpe5UC30x|~?TkkcC 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ⅅY$4Qd{%6F;6l zce{R;t$uMeJ&~vgWQ~5{%Di6<=HmUeULyb6!j*FCIYdrQ+R^92M^@bSCxBfcDMglY zhkfZw@FT6mVNHRV;KhK_E4uN${`vO$=7G)b?jTQhpXG|mN>Z;yc_}BK zhh}lkpP8%GHnPjsM2R1ZXsSLGi5^e|lLecZa1UDj%tFpec{tBgGvQ>dVMPk^UQ<(Z&otViuuHxNow?c55E{ieo%-K_6 z;IJa7kbe)>pRLA_%3>SK*xS{vL>=6&l5wuR;@Au*KTXUiswB@8NgegH2H~<;F3>g) zs@TglGuEhrP#Vn>@ezo<7H(81tLSrWKw$+^D{6mUUkxECYVQW_E0F7l&$kSN#*t)B zk206tf2FSH=103ZuW&hr)q-fdHxM^e1F|2dZ^6WPG&0 zhevPinQG_h0=>GcS2bPkX;$Sv;laAQVfrBoF%&v<3N7ek2e5`HJ^!Bt_zwc7{WttO zwf&G%A#~sgapZ$@!K(Ay_#XceqVK647}z3eOuwf5 z6qH+$(%n1tC1?8O&(Cz%*azAd%KdCR=dufr^Xhpi7$?wD2YtU?_>NDFTsivbSJoO= z4wW_M+ZldmG0Ur}dxln@mxu?Y%~eTJSUsA}`(%Mr_%i^!xnMK(C57Y>(7^qXlpG%L z)uoNm?f%(=lVx3aaj6!jIj|)%C*P@-w=!W%yjFS9QW zuxB&k`p49dyB;~b;Tj983wugQQ-+_S7$U&#GAh1Hr22hr%Uzu55_{j)U0%-}l0`N-C!}S|Xe{{Y5`})-3s>wUVgX`StA>!K^!Ov_VRat5 zk+)28oR!a+bIbEPH7o=9WdC875-H1D-!wi}xJ@&{0knU&-_RjZFWJK|Kb05< z42`#zbTK=d-wk-S*WZO#O z5dM0d<SDp z)9u>B~- zN$-lQDUHOhGrs`ad~^3Sf#ct;pMvYuDK|{VCb$D3v57zsWA(3WoGsegUJFWWt3FHcKJwKL(61Ebyc1A5q*$&P{`S( zd-6d=8`1mN_4zD89KGK53kmBhWrmLktbf5+nSh@5kzXM?T^%P&-on}0JG_x`$9!j( zh3nIm5)Z)Sqi#E?(3y&*GPiMf>hH4ix;Y&X!a19m;Kv3?j`4FGKe>P|@Rw<5>}wi{ z0kQlw>hX!s4HsYsUs`aVKn7lN^s|LKHS~Y ztd=B2P%~`157IIt{3*UI^KqrS8#7(+DU|}3bSeACN)5A}|Ab4L4aq<^h88|c+TL4< zf1dx+n+F?<;lI(}is};5Z}}It;;B^SYY7yvnN#oAB!dRBgi1mq zj_lb1&71X=%Ow=ts>LAPTZty&`4G#2uX`6M@cfpw|GnmQdVaw`;x;TI&L~ET1FP3~ zn=vtU&cse6H4CS(Y}n>5=EusJ{-G(}841GWFOBE}d>N%l66}$86Zer4ZFp3UlOtu0 zG_8N;KkU^%a{=3{w(P(JuG~^^7nzxfjl7^Tyi&Mi&-&h?qWZP(WL5x#;=4OCdH#frO3k(Bsn_!B4 zPu)=ap`C#Y$39fwthk)UO1rXOi@_+ND;9^Vk7*$ncgRoqY^#d&4?EeMpAi5~KJY|rZC{d9{CP($+)031i9xtAVQ;B&xKP6P$`G&HLp<;Q4 zA8P2$94jFka}Q$}ueTL+i;_}J3l&MEK4$5`t5ESm5Smph^h|+foL<5Vt0XL%C_Okl z^nTC?VE_-baU{f=^GvEZuoF)zWUqd&@|s`~4Z85Q8yC{+e8qXxaV67em^3lgMS0ko zG0F&SPXr%e#zmtT zcO?GnTq&lc#-83@q5tU4Xu2|MX(Y|P(h*yzGA;V3I$@x|f$|(!L-1p0ekl} zGslo{eh3=zn}?`kRt|79aNw9@JL%U_*g&ktwDI3K5qfMFmEwWdNf@N(J9L?T#)B~^O(HgTV%uN#35?q?Y05?)wc@F39 z+nyelLQ~$IY)Fw`_WSCbvzTD%m69TsSp7lDFWn{K8{=jt?J0-V0w81&HyP`eM#dZH zrYA0dRsNxzxW6Eid!Dc9tJ}{KF_d@7E6}@C_cZJ+ehVYRA5Q8ccg-{=-zHvDZ#4GM zaQ1q81TUC_ku{_D+#t(eF3WA954iX8!&I+%w~+7_tr!}2KBbTxR&4edz!-?9+v>eZ zX&iYn_NEUTnpkP*q3dOg`zF) zT!=ljmr0Df?zg#o7<{*B&|5*YQ9~|1SWZ;orqx z8f!sP5e?490bW^(*3JsBl51Epwxnf^07+7G?7EA39I(y0XBS`9Lh2rAHn?kBdbLvU z-|8m_@q%9t3+QwY3O+i00Gbj%=L)n9S9pcxmXhK`5_b8HKkP;$;AjieBbwequpVq6dUEqYm-bK-gtG6v zJ#9ZJufY7k(=i}L1t$SF;2n$?ld1@1ig-O4JVDRgBSp{3hvL4Hj~3hioJM77d6{AE z!b2g=c2oUV0wITaVVl$|&~WbC{R(PGsZF`Ye*}C6kbyi~=zo+ljL4w85k(On%M@_h z^B3c^))d=4zPX8vKf}619#n2ec7>+;`X0;IjFuM7)`TepEYK;NaD;;+G0g)8^Uf_! zNPmTqGk0(Yy`pcpQ51jcEZN}=av0#3zoQs%)l zYl4X#e)HMP2z0io|Qum#xphrDF5Z=D+}u5p0dN?2$!jly~QX6Y}B=7$N@n)C(vJ_YlJV(zc> z#|sxC0Y#;D^;(SAJ(^N=MNnaoPwXk$O(fU*qhs`Y-?JbZJDUiE`vaEi>9KJa#@f$PB4vO&<`0GQ_$2`7W3g8$zh_-U zy*)d9lSV=Cha-)sxD0DrTkOfn{CpYpxX__T+~P@~N~>-j`e(5!o2^?F4zBj%M^TC= z&5F{NvrrG<0-G7tWcz387iL{;QCCFpQ`=$vm^Sp4w95E|tWBf)#IXd1Ur<0|_j?2` zL(h1ymmgR6{34yY@c2fZM(?jR4^KZY;}|xnne~C!xrYxL-oqY|1n) zbq#-tXXZK#y6J34lQfEq{~wyp`mM?TZ^QS-DCv?;=?>`*K{`aFB&4LIyGDHIl9Waf zLFopG4e18yo>G#d8}{t`!}BlP$8o>wbzbK+E`_st=3tba6QC7&i8~ z^KS`%0vr;qzImH|^5M&~;HaHJ2p}VOyR%bcL3zjI5N{7HC*w>x=(;~zeM92xwaw*v zlTo!N3^Kmch-Qps&Ni6Z?d2=6)ZAwDSp3$#GAt@L{HWj)`>47A8BiOrj%hR)Vt?^& zB|;0!3}@nWJs3H!+3$k2Phk4~J(rGyPw8*bNY2y&=yu|uzqjhQ*Rkd!D^F}+VM0^f zH&-9jzTL~ubqTR1*$etAG>0XOo@fE?`M*kwpTy?CkF?+(!7Py|nSRzSfBNKCR7F+u z`$adpp&!KnoLPzNVfB)ZPwxoXMcc`VUlWv!QVX$Y#O+I`f6;z^d6j70Dq|=;!6iFP=H<_{mTqkFPp!7Ajmfqe7b; zO%6*Z;AP~m@RK@O-go}+YG91&RotfnvY=MW%9>F`N?oZC{T7~t0GIE8ghel+{8!E} zVB0Rm!Li$Fx?BhUEHxm*$Y7D7mO$m ze*9}Bdip{JIuO;9kC#amu{&Me;VtM2IrRx%5j<5`58R*#L$PWI+GvkV)*dXo(t zyOn5Q_`|H@K|O;wKFu(Wk1J)O$+wCR>g*9R%v&3`&;qGx$~)ct5Z&KPenIP9azaeI zf8#6VFU^cUIg2sK9&rLpcqHQ&-tFytwLhEZcm)Kqv5#{-{fho={5+Golds|1XjIW` zMW&4eSH{^$*I0TIgf=wfIXT3)avB8=2LDG8iByl4QC^i8@?GL=IhQZU5^V0wqCTGv z6bRy6CJL6*%)vAP?ryJ@KHxjx66$~4iTAqcc+887v?vRyVTTQWCXu%21ob8 zZPE9sS-*T-zdG^JTgjR5>0IWyqR= z7Bt!L@GB5=?rBbQCE@GaT8~c1y)Tqmb9r26{E?3xsm&?x8>lf!C!9GPnr@1H+Zm~} zz&LNC7viCBawp{RzN0`$TF0i#Q71rVW{Frv-X;zp1|DzZZ)#eJz&C^6n$We%m#^d> zL`uIO5VaoA=;RN{FBbatSH1?}gY%5F(_Un7dBC5bqUHO%qD_IN5o&RXvK`XOkDmsf zKBXA7(IfgAmrkbf*dx%}B=`Y6*XCMouj}eZEN$D^^+6jwuvmH*O;USHzXF!t7k{2C zgOQO)zIwNn{vJaN3pZqW5v1+O#GAVrWT5$GqThM<8?$9(!B?o?{rOah&TdQRL!>>U z-Qx$Vp7!1#Y_5Stvqe<>DZExQM{pzLU?Lk3$Z(d((#i9h`79&tFi9u(wg1lXtdvq9 zP@v8*)4x4jEtI3opArJigWSZ(KG!I-Wm-{rhH=1$L)5NHjmjmXw@l+!sUwT1H24Z7 zQ}}x`L2W9dmZo|UlGU4uwU^G#XUnu^)fJZ*GGuGS@a`tu8%7V6JE{Qk_;DjiBd-}X z-wrnqAsmuAr`PIL0@I4dsGTJJUFP=mCc|Fp-4}QxQqI4k@rS*M1~%g&lq-t@AF3#i zSjdzUc**wKi~jM@wEd{Tc>aL4)jN|S#Kk{Vf}%9wIB(!tT#Mq94vC(fMXV>E7Kq#b zd;5&-%~)HbbuqiU2g&7#3|Up`i~9le3nk`48MoT`&AXaU0C6aKD~|GHC-5KJzSj>& zF*MY&X-V`xPz~O{Z2xm!hcv*0!f8#AWb0ycan7V5DF~4IVPZn^L%sY)Q+Z{QQJ;0h zcQK42b}WbW<)V}9OJ9SrZol>GqnhKu<7L4XPG$u;Qi?(cNS7IXtU3jRQ;364jH8T$ zg;4F#^UkKgNB-b3qJTI*vu0xqDv$Q{)goVMjp&v(vl>4BS0Cb{R{RwmE z-)s~Kqaf!-5uP*2H(oXjFHOm1nC;_03VmMu&gWV7RJnKhIWr&c0xC4P`g}U~Kg22a z_eL=FEWF9UX&n0zsh8GCZ&ph!99_Qr4Zeg)BWz zNju&~`dzqrwm!ccX@piaEb+SFs7{-+z6$AZE@Qn6@gnH=G3pJ$ zaJohV6F59sBnqAU*x>C@0lLk1v?P*g_Ti=J3GE3LjV+S)!|f_N+gd-9wVKRfGqh~S zdK8t6HL2-d9vi*#^HB|3zlyBC-4DT@WuFGme|t4|_ub9+iuyUoJO7}U?r0gd=C|S% z2)npQvafqW>gwjIAMJyN8kpwZi>dHWY)yPxE|du|okn11X6%-IXYmf@D5uXOT z3#08rBSV4{9ru3|@+5E0dBvB&Ju@J7eZoQRpi^f04pFY81`zTg03ck}2O}=##1wHG zT=6F9b0jJ=sm0QhTpV_no865%>764Vni&raH`c4GTz{1)N;j-$Qu7Xk6M`Z`(&kH) z3_1B{$K{j5Nm9-vdggr#YTURizvH%Qt7xP?18S?rx*9gnoJT%bQWmhbQ`7j+Xv?Mc z+l-l5WiD)2BD6VmWGw3Vpm9}2t(_laMSh$T)b56W&8g4Gt#g8i7LIB-40S!+=|Xy` z$wRYoq)KX-k2`{h7h(Te$~e`SIp*Y^fajPz|4^OtL3++4EG^BP8AiB>IQ<{jw;SXPKh`r~JitfG*~)mWC$Tqd=Ojp&9QqB{Bg8Oyjpo<%1W~2YSs4SVU9u zX0%GM#X{~KEj;KDV8mWLMw$M-8}ydjgo-Pn4fFCDP9g)H3c%0&+P7?ZP$26q zBgF<(=a=xHYMR|_1hzzX;QpakA>HSGGvY^gj?Q4$gAWkJo%8nU^la=IHc+ zUXePC+RAemsHtEdUijvoN*~fseao`Up0mbu(%oNelfw%7a<6tyNlKY+TT8&6#fNvw zzipom{WEaiuzt-zHY~NlHLJo8h0QvVsl$ITG6WqIexJyu8D%r`ie>|9tq(t;dmHXJ z+vO+xaP|1%e_8^#%R!@G)2ue~E0h7I6C*pI!?)#xu*w>X9Z$hgP`=+9q&U4aNEMFj zrK6`^I*PUsg~Uj7|2}=P0bx>nR!4RMa950t{@(7Dv+&}3n_Oq10r}4pceaQ34+@Y2 z*FMv>lf+y1_^9=RXKO4XV^i$hgU#_HLeQhL4pspv(7#(n zc0|TDnQ$nII5roH^L@*1e*4K~Kj)Yi%E7(Pj0 z;mR~84piloWhm?A$Q+4^4S=tI>!h9dopqUEz%d*0Wj$*kDKYe3b)7c@JD6Y@FZt?w z*go~7p^rh@4hdSYV`pOh`Hx`vxG z*lGZ+w8%PvGg#M|;t$4>x%iH!=*R~qu)qySe6+JyriY6OXPInB%`su5149207EtYV z4cj&b#@pOTXF>~FraITngHYOaobfg+@veqV@xy_5Nf(X+`(O#_dJzFyAU3DZxqTE7 zYK;?vAHXi4@zfC71-_`qQ@NiB7|Y7)EKURH?Hh+y@QF>kH9&5zETV&R_?e)59!y%d zpJh5402TK2fb2Huvmk72@sMT4^WYTmIZfZkR-b{@c?6V28RFs*jD7crZdz}=v91AW zp%Zj@1`ObJt`du4iCZ(mM`G_7Zt4h&vhx2p+MLd(Zm=65QaJ_mrR;*fz)BCH?c2e{ z#nh1kSDj?t@+Z(rJIGfmoT9vE$4Q}yNDo=tOB;Oj#Exm7(Zpo|=P~B%R`(y~NKYyU zhC8roQ^5V!`tig1^%Y7iTtMd8QJ+uXTPJ8}jtDrd=063g3|wuuvF>B8j&Na)*;1&AcgPv6}IOEw2wi|%Ec3+*#yJy659jlKDCBlV#Q(p07NIF zpbg?RHdGbZYT#SNe4$UTZ?i{~qH>egNy1WuvI{zN3+3qd=iF$ii&FsiLK9aT+1Z#y zM-+mIJjj%dF(ruS!7lZcmsXw$ay_4U2SOs>B@#}6FV!P~LAEx)2bEkFssjHmOLU2> z;sY@!HVT5Jqaw9{@|Ol}NIL}M)gJ|?g2W=!TkvqEfx?b9d(ZQ1)p9%6p!HCDD);(F z!H~@^3sEwlL#zY>!;YT^ zSp6-U?RR%84c5z0$+a}!ybTKWV7_trW%a zmk|}WoS4I4ORbloH>=yo(}16fr@kP$W}g-F=K0j z$^B4^}~lKz3Md!wx+j)||v%N|2O6?U&1zD#zrkI51vJSjZr+`#!Z=z=ChY z&L++mr02kk*i8h5cVmK9LKuCa2aeQn(sQ7|50t}%VoP;eUH8End#y=sO$_ZN(0h;9 zpz3N7bJy1K&g)Ig`GQsPnrlA?w;D-VX-eP-;cJeQ{Ht$Ek{*j{sj*Kfo^0R=RrZQq z^3B;DD`P^)+xCe|+;N9vvK`)i#t|YMy+~PA40&~@2!DlRj)Ugh_fF7{z2g~n|LT4d;bJBIYj;>6*hX8LLRFbzoaAGql zMBzJK^IjKjZj5MxjzKQV;S-A}tO~`S9;xQkK4}a8O}DpQ*505(uLC0SHfzwx za8`0+e*V zjPzFwUEKtkTFos9)^HEPNya-`6{c%g{qF_)z?<8o2pq-j?gx9zkxon`o>$Ty z#l-Uly)>S)3PT;v<=D2E(!ch(*m?>$lKQssC2sn@&oLo6naM6!B*j-#C+f^3R)uPU zwv*A$HT(kNJR@(JLY)1Os-^Mzsu1eO*06cKv2c^?#rai*`V*u3rB9Jl_S6V@89Dvb za?p)U_|;#V^4xGw(m%)qVvZLy!K%A-E^G-+JJCXyvg0QWbM#ycf4xA-6*jQ*`y1nw zFk19laLN%THP^Y;U!Z{tMDCnadwnC`&Zmpzkc>Hbw#ddtNKwZyROi&w)kl~TP&1e) zZAR6s)LX4V`Ugps+3#Uz{+|X)s)n%0QKy0sKnJfla!M) zbOe*qfA04-(E!{lze!RL{Cjqfd5NPc)5&PGM!v^NPD)P&e z5{x0SP=#?DJ_mi!YBD0H@2J4)tD7n-aWtn5x6-(r&1~30nCw-u z?aP0CXc!GMOV;?rbr;awlZJYGf6Tgw)HMD6@T zW5B+dS$55ZZikhH)Ut$C!p5t>AYWfegat50;R&(N{V|AsPD3d~q|c?Y)U>|kFms!X zob@%5@Ra_`AVF^)Z!8z*w6c7j6%GN4yh&N$J{dr@CK@f}p$&Gp~F&-iiy>L#lk zpKl*x9h8#DG2f3cW<>ptpUWm* z&@`aEj$E6AAN#5<$fM<*Lq+n$9>LEel^HKi-uLv8h~;ab^>TjXZZj<(kC8M|0(;z* z0!pf9g)vNWCTS%=YK5Qo3ToLaS3fN_KGNPVw|+m@g2mwT7Ey#0EO`B}6Y8QXCie2& zCv0t1`aNNCyUzgVHj+Yapwi=G(1`_enWaM7H^(mjhiK~SfAYX$9W&n8g(KfxEFcv{r-dzTdp;wdCTPe6|LhOYnt7jy(A1_JAbV)j~$K$uQRzx>kFC8FDPtS z2Y*5*PgdqnNN{isfa6Qp{TZq&cx`!^r$}Apr5L!-CgtmaCf3fM#Oz|_B?0UOtwydK zT%i_sIULgeLW+uRcZ;}e0inCs+Zf|Pg}TR!QSR6{|0ejDMl1@Rp5=nXu@Ub0j}1-? zgNy#y5)i1+5Qg@&OJ$8{MMcHf>8Zwn{9NOW7t1iarjE^2%SC7sHnYXP8JaTrz~k@XIJW{_W^lCq4cwKkWufKceROW zhLqCUNz0n{?;Zb%k=4?jH_rUHV~iy{ zA0wEINgLVSRmW&K;T?9j<#NWVvsd_GvT^Na`7UW2a5ErBULJbA0WC!jKl}$Mw^PFd|Ut)&8W4dG9uN_KbcM3RA z`rPLwd=S%vks(HkKr53k@`8s~=0^gbBEo52?0*^{zf!+!{|i41wUg<;I{L*6O2q*T zS#TuJ)YmN4SQ-V+Y-WaT^GEatw8BvTOs$MBQ7?%ZH$k>-SGHos_&^5GzleSphKB9v z-Rpf{miZu=QhHI3g%X+SFFNxxFVm)q)v~HtMNQQ_Vvrd1a42($UVGM~o-JFBGa~Ws zB4Qz^i73|ej6=7X35ywRB@#GH`dM3H%uB&o{P)}<(XtT}0pqhGjl+@GeldcngBH|z z*PDye$>457bWhBh)Vm@rNNrM&Ps!N*yzm$LphMOQ2-8{TS7c0)9b(<~gfs3>Q`W-! z;Ot&5>5aj8Kg)8mVDbb#$)8K?&#n2xkV3W*O34@tPkpp{>M)bP7`xGH+O7!V)S^Q# zU!9NwO-#vA{v>*IPU^_`H%^ihwt$?Cj%jQfwZAIyTsEw8%^ zatF6P9r{OV$?$87nBUgd6JN(szOLh;pHYI2(VGAro2Ho8c*gyk@yRU3M&ZV@c8*F? z;O=LV*H}q>)4FguDe?%RcM0S5AHHD>Hs=ZMN-wAc3{czVs32-N@i}`GK|CZ_!LGq; z{*5Ms_^sW#uuGpcO7IgiGqbG#Vd#+qZ-Vk`T@H-<52!AiU`9Dzg4Fp%-pKl!eWCC( zsJlKH!QOs={%O!L%y}1O?F71^iyRlxQZGg>?(aJq=vh)jRyKG`eK+kda z39;>>t83hzCuBY!x}2Lc4llhD%+?k-VK8I5%JdNV?<1(?=QpW}<`>Ot9n9g5KUY_u zmg54_%hCjc(CNd=CV07ISJ#HVO}hl)?3X_qVq%OWoGZ(L+RF#$_ZfT4G7#DRCN+xka;UD>-3r)2S zjwOXHiiUPV&S`wyctRUesn^wk_UOo$HVDIJkF^hdYfS9Gp0X^@hET z?(O1HG__q-t6JOY`_JCTuJmS8)6yv!Eu61nl4)%~NTh$v|1Y*J-V2Cs2YBXm*ccW%@4 za{ub|fWb`)HV&(YxqG}?!K_22gI};)ryX|k&1kh z|0=utkqZ}5kd&gx2He&w+PP`^ieJ6J9wQK&RhOnxW5sdT{vc1=cudu;{EpD?5;lT? z2nuc%_!VaMkqxSFZbA&yg1pauI^9KV4h?S3%gCv<5AHl{tUna6Ad5y!jsH|A<4+>y z^R1!mnGg?Y+usc-eyXfeM0GOIdBd zj%+^o0jdQ!#=g`XI2tfAp0dT5m&;YFGzuRcCUvv)JN3H0i}lq0m{74T}tczYV9 z0Vqr_UP=a7Y>%PMj=+{Qv}iIOrUsy;81*+dU6~ z%lsy5Wxl%d5Fz*i7sZ$+SU2@A83>*|^su@fuwsi}v0_vYD~F`MmQ5E}J2_d#H!A#= z`ZrBDc_8;;*@Z~&GtrhP*G5h2v#W_=DmL~n1_u@iqK~EZsw<+TY>h#0L}%(Ch3ikg zSxmp3WBQvLn=O}L+_3`b{5xEYj!L=Dd}RgbHt=Jt#f|YRtsE{uEplBobUlL`YRAIS~W2?rH^s~0r00XWAgm7yl)G~9#tIDp)Kckvn1 zwSly(@1T{0M*Xx)_QKWQv_%?W$O~S0L}P3DtxnpQ-T--&0(r3U z>j^wl#z9NXN57#xqv-eD4>IcZCGzX*OvLiK-}0T}tv`2_A*+}4OW^q{$%l~DP&~1d zz?T!ZX0~jHhZ=?d%NJW2<5`U>Qm1ts9vyKzd;DBoeCm(p%sFC{@o_W_))!-LV?P9^ z`7omi2jXF)c_Uhf=nt^8-;*QaW+V&Xn_A4HI{)sW|74?>7!utb2uH9|U8DO5?j&rm zuOO3siN5B_ssUz55mcUHpWx3M8O7)D9kEs%g#znSFzI$8>w%_c1e@FRje8A%RrNSS zN^TcMlj>t%N8Rf$w`QhhPcAxOyE11ocwKn&^RQCWFcDsgmn*#~~hwto+T^`A)gFiXrvfQnz8bx>0 zA4J+nd;=b%)AQmu38B)H2l&M2^neT~%~N?DSG8nBYbTD;kIo zy>kwVS#R59AhgW4WNpI|0%gl9w126}Uu^SpU!VgW$SV>Uk?^>$Hwoko@Ma3RCx2zK zVqA$z(lSzWj8NNme!({RJFPXQ=M_m%aOZ*ZorN~xv80CpR_QTsm;I%Xvt?*nlNC8L z;%z#pD-3<&y;D>BT>s^%_>g50g{CKBItNvC4kOc2A!a=hSY$8+Y2=(@aa^yRT{m(o z5X0$S{m}fcRhJwg??Z}_kC~cs;%fQ&Ra^3D#R)#7d}4eGNqdcd}WHE<+YAKT<3! zP_D3mA5>xUnim|C#wS95~sN>)gQuX!g`OO-UQIl#T+ z>ai%aG>?ESmU>2aOWGW7u?x3|ZSIfo(}D{|ONoYhuS(ZUDxzxwXZ-%JBO{Z(xmN8_ z@m1*yN}uhC^_GK{AYEA-?0_vt>+Ei|Uk4@@DWEW3lSXvMa6!7C=e)W@&;HMi>P>CI zd(Hpu#rwnJ;sye}2XRhNt%MLHxV^W(yVMGp?JvsJy?53h@auB<|TS^h{I z6UeZmpXZHw1->ErM{B>nGO&o<-K6dAV;{zR{LPmqYQZq{2On86Zy5MnT_butDyw1pYK+X7*qrTT`NK|+cv*-j0yZM>}GU&mn!;qr-Sg34)|vGv6wA9;~D z`pa+Op^FT)luMN%cWMkHGK~H2SK9xEIuT{zjK#GomiOJPOt@m;IP@MivjWSq`FQW{ zdy$$!{691t8^L_@ier0$Q!?3$>Dk+dJV;Hz)w_Wnc6ANx23ZFS6hi8 zBBIPxL{E~)JFLqs0vWgsda3n;aEGoz=+lE&fIc};%cvm1$#Cu}I*1JMj0Sa8M0SU4 zLbXV#%AQ@>UEj5Jz!TG(imt}y(OsH~zaQ3g@eJq9M#CGZfpKQ+Ryzo_V z$E^T1FGm#EJA^7;+!!xM<6oZ1E#owa+!5STBgn67Tr9BvhM*u=zj}$wiA4tnEf`o% zL~M;0xELKa@5f*lE!78DCJlijIW3P>0)$23VMsql9AKY_G0W7g>8%Tb5YADbbfQC) zoQxa1L9zWXH9wVgOpWt?Tv_{|F}?2Z0XZYKU>4K6ce!MOgj+xgPa?q&yyx1=V0a#1 zc(@!aClgQw!H)GOe34n z%0@dkDAmUVdm*G(lXzy2U0yPQ4@sV+hL~w^pAs_{O8kD1~PP)o>4z(P5LX-)}`^m}43t&Vm z@+w(koKV`~9Uwh*w2@PaO2Np0bWx;(y-7CJ9*EK?=B0)Yb^bV1roK$kB|DyRoi)>r zf8qs>T9KuxxosGeHI^MWzktSi?bin6i0~s?5?^JV7LiGz*9_#O5vFl}EN-WMf7LQ> zdg1SpN1Pf#9@f!f{?y&ZwJM;sQfiD}KXOAZ=qA3bi3U0%gAV(8$Or4b8<^6k?lBTQ zzR(7!#2g&ty%s_vLuplUS{;SqS1^=7jaNd;HdUp`s*j;aIH~H=0Scd3>U(cJD&R=S zkfim4PBU#upJ&5)(HdJ}|5_=|uFrfg;4|c%h<{F^7Ee;^ z#6_QkQ{23kQ|l>90kt-hXc{l~5Q=V+f4~6@mDj}ukly*|KD&R)MIoPC^{c>$CQb~M zi!t;j_P7?posH%0>&y&dWfDSVsT+)bVEz(H4qePSDA88cNe-Ly-wjMJs322j?G0yJLh(t0M7`DvrzUb6zjM%WNPoH=-Q}UM~*0s*?0^@rCX4^vZi!7A*_|!0=&n$FBtlo_& zf&b=GE{N<*UbyfLOZ0o%U9@zOP%x-W>eRJuQ71-AJQK#~Uc+8;y2Cv!m#%>qAaKxq z;I;Fcs48WV4P+~$kv;`gwNH zni7Z=QwNd;-H5!vC~7OZtMQ|I(G1_^1svxsW>PW&6Ks4h$1Zms_t5#4#>3N|$?^Tp z%VJ4(b!h_w%vR3R-24OkQXD1>T?1-D@1N5F$56dL2Q+py%s}N*yxpjxDATw)))RHY zKsgy@o{!%XMX-atCdbI+oIUtQ#rK(qaGow&K73^4(!NKdYVe5=cqlGi^htiw7R~j} zua65&A&R9kRHvdLA~%60V5v+03gPNat3pL&SbxY z3fanI0Fm%t2?^V1foemTyMl17rX2CHngVaI-8IH|ny*zHXxr+mv>5@6dC=yU$eqo( z7bMqRXL$`w>Y$;D;sisBdY%B+e%in_CF=aDl@@O5!uCuc(eh=X*+)3_2Zjp#;Ln6I zz(1UK&ps7IYB#MqbIB*0&9fZf_Dd>*4nK&7zV#qDVv--L?Dci@o`|`S`$<1P8PZMW9feNs9t5zKOu=W_qb7F$a=?u8;7H469VK z{yl8T3Eo;i^rDd&m%|Bu)uDD?rnMxbKqL%^LD{KoN28!C6DM*cn+wJvgLhtG4O+t6 z#~UR!;A5zOfCEj$8l?4=eP_eg!@&&=<%7-0^0}@xnx^4)&aVX&rs|Z_{m$Dy?dti;# zN`8h@xesQHM>$7Z>B&HkSd?=?#}YeC-`%mLtzXqa5;FmA^%Jm@%H#~93)i~2MQUIN zzb+4V;s03xzICz>Qe5O2R4;}Vc;ug$y%9*F0NVa@isW2=he&uLSjV4Z z*oT38-g5G;Ci61JI27>mPZiK!YO06J->ub9s)u1*1kgDSdI!O}Ye!8^LKg?VBxT@W z9+FZnj((pRQ-MGY->jaZ2-aTomJb}ti1@?m7_vRV{zW#nJ}E&-yP;RbmCAoxHoj$VI>-LUd&!EcF1l1yBQ)WBEy?cbo!D%XCY zC-Q9l(I<%kI9{gu8SG56lRC2DEWqYncoTe$z#y$5?T;lD&za0$h|x0HWs|V=o5k^X zOE}&7~sqq_r_N!2_lEv*ZU9e`kj1Lymd2AcfnWOf_Y53dYp9)9PDQW7dNJH@N zzC_JAh33~kj^~?sVLYX?HKuMRm~gpP6itn&z6cM*)4cbu)9HKm;Zz)Ab;-q+c~g4b z)c$;256R2!3G1NAE}Zt3RJM<+t}m-$X5?A?^%9tP+tOooPC?6>{N&bUe{V!`W=^rQ-clJ93;SY?Jl zL9a#{hogQ&Fyjo-nlGy8X!(Wg%2GBF8OJ4)kt=4swfbcB0k9no(;0eU576@5l#q!? zipv&I0*#mAi(r!(w;Y;l2}rwCCgts|zWQjbN-cr&GdvYBro&zxj@f${o_u|9Bf^hw zY$*4zG(Rjfxa7TzrbYx6%)`4GZ?M-_>KC8_@7vSxl>Jh#s<{pp*fwWW8& z&i{L}FvOcd9|GmsQWKq;mLH_&ewi*>-|D#SNRP1AC>EU+5Us)9S~~sxlw^wSUj*~- zex(G0ZakpLFZqezTfR{Qjf)^jSvgk*1ydO({cK@iJUI?uydFVs^+Z{Q_K=S_rP8kM z@bEdMyC69*D#+h7Iv#}EO(OaSTu zLe#7=S&xTOd!D2+4TzYo{)(cAXdz-CPV5be9Mcgb4tEALrzlT4U1ic^3x@u75ikyR zZ}=WG3IDxeKm(?s4HL76ntMBT2|D)zp~#|t6@uK(=+dD|psOXGSX=G=*TgW6h0U&tY;7x{vK;G5{g07qJtZ6|HX(KF3nNr9z->)c z6QZ*k$;-Eva{tY%QwFL5#esZvUjOOiED>^hek?Bk$h5@u6yGF7$|4kZ(Oi!GozhFd zB*NPk$%Uw)+`{t-={$cpTX0ZY%)^E(j8b|*p*xrubbbKTw(ZjY-R8o>;Qq_NoLW3~ zT2`HfN$O$s1-je5;!S6Mx&k(bRica_&4@u&OU2vbbEP*YaM^JkzkSm8qh_pwBs)$) ztze$kXOj6HM|!oleU0nLXNxK3Zg;9X`Ea3wS4dzB&4y#;=4s7SV8De(ZrW0IHGzLh z?|^^wM?z(zxDy1pDgoQ_2vNTdY`x}f9OXTeN71Q--{RE0@7z)&yTF8l!Iz1t1xA6Q zm-2Qf`Io*W3)nn};%1!IXc752HB9WsKIEg0CR2isUIg^uMIi;i;>CEZjTb$0yDd3H z{=s=c1GAT*zK&!c2Vn~AXW>W7T|sMf%rD?xm+&vVp>rRg>bw$EjVR32y!Nf!%QA;! zT}?M9rU}z!*-42xQ_NeFjj?q&L*Lq9U9;asc-X=?Yh>sVk0rqkv#dp+6Z?Op%hW#L z8$zW4^cqd2zUg39gZ~sb{M=_ws%15+NU|b8O!sCL|+`%CrNm_?KbRe(&fUj5E?QPni~; zol7n7a6^x%6=V@zH$_e^^hHDL2lHCA0b19f+TS&Gwa7XsuSi_e;yzh#QcguRnQmG> z&$k1`(DTIi7(sqq#1>B!JRBBetOXsk?f*{VfajKyE({Q|s~cL29#Res?^@8-0}cQ> z4}N~QGG@tv!xUv4!~NTjq&JzDdRBzGpkmKZ((qR}jUuXYdQw;#--GQV`%Xn-2!5U6 zn$B}U0OVa?@9hS@_%oAK48#BIEi9<+rRRe@@oypv%*uD)1@yE2D-^;w3(O+9sq*@} zHr&tkhi;~kIWe6yJun}abFfcYHTtN5|7R~)-est}v5us1%qhO_r4k}-dE zI=qSATMxS1u9knGzcFMJ>`+y|3Z0VecNp@M;L8~EuC6evz%Oo>mafrIt*X9zdI7&V zqx`jdAds1AO#O8rC^g7xz)34*z<<21t9)w$Oh|RbyUt@!HPh9<(&}>?B;~ zDez1z;x;ogpZar(QcE|9+HpRV-SCR!QgDm9ghrO2Q}-vB&ZlJaQj!$QA-$J{j<0m$YX@H_D zvNX{vxwsOJkns|EKt9aqHq}^0?S;(=xcLsRV%k-#&CIHexw#c-xT!Oyz~4^YAXmc# zS6VYgJ*PHsU4-pzbNi&8DUS~oYe(=&4q$tO8O9*MPTyWz2k|}`ao%jjFB3%yNnrhnm>K(-Q zUirlf(+91%@HL~Un}ts7&A7sbg{zt7SIf&nM40a+gKp2=1A}-DJL<#bTYW=pVZh8R zpFK9ira3>LXa|!9;EuN?l@@kyuJ5YG#{L}a9*(XBpL(|%Z6z3!jejeXWBW&zbKR#k z+43EmQP8M!jE6~Y`;0;jF<0?%0hz+<*7~(i|)D@iSVESy!i$$mbIuSaOXO$4EFuDFK?-u0Vsa>kPL!f)n~D# zOn9-I<@3%?Qrh2#)X9J9*L+&x@`TFJTTAaT8~OS!?($^>#5HVMR%3qZ=1QB&L`V67&_> z43^2=f3W2#`-cyZ1sExYIZ)*!ETUV_&en4hek0RzP`F>xWGCyWDLConUko;t!wM_s z-te>1G8~eVt&AT9tMAQn2ShWtKlJ+)e%qYQqn5?d1DM87GHmNyLWO9T+eQP<#l4Nk zQY1sB=au(jhZe}@pWAoZ{?cflcnBc5I!I1~AKGIS>HiJLkmTGu)zE$Lv~?$n z5^+svrg~Aj#2Q2N&tz4TI?pNZ=~fv8z`0Fm`V-0caIJs{iAdyfNWn%?f-nj17_f)T zQ`a$85+YEw?C1NNoK9iMNJSu~4)CunI`g#Pd@0m7@g6DvV@3fPHENf=&mWd&f8Rd& zuc*b3n|}!n!B0%NfMee7>;)lpMqO|vG4G9PUK7#HVi@R6edKYIg% z<;c3`b8sA{EDD=Z8TYJ_OSEFD#(3dg#*13!Ufi@w4H{4>MDmcH-ki(Py87c8zN z2d+OFxC?l%3@eN%Ove3LN-~Swew+9ioNs1E;y*7F{Zz(GAq1E82u7$qNwtI@BUW9bNnCSigO8RO*z)4Ec{7 z@oCc1ub66fnw1whJL#WDHYRVK^ga;P+D9_Vahw+`KY&D+LRkgyIV2K~s0-*N5-Ag^ z-`wK8tlA3eA>rVLgEI>4&EokQSnIa@ex$nl^7-osN8{>^VH$uP<22FNz86xTR*KKh zi>{0BCeY33i!ZYOBiI?mng^P8oZ&}Yr?@kwMuXb|hJnfZcJ25ZyQ>n4#E&XQWl(>w zPCJ`ee%RZG!X?SsXeKt5kNMBAL!A+Al}yZM)Z#+HN!GsnUd*DO_k6 zkQG==g=x`!Cqw`4m`1ziH_OGa*OUNBeDsu{c=8ZWzhSZdj)L+PDq$CAef+(Jx;{4t zFT25`JlwbJiKA1*7YIHvpQC0wJ=4`Bs#F4x+wM0y<9O+a@tF~n6d|Vh;esfjCtRnK z8ld1&N-zDVHIV(>%6IT+H3=BIsw#$V*N0wuO84`2g94vsIf zDr~#(zBT9sKS(bqvX%AH0_u{>hXa9P$@jSdyw#GznTnEoPdX{AA5O29%)UMf*1%^* zuLekl^SmT{4PHnYlJh+`dkVg=E|J7jx7-LHx*>}U9bQJHbtfNnV78n~T3MmwL7>C< z;hCT5vEoj8*%^V;hXG~rY-}`bbrY08f-DD!l|u~kMkhjy08gYZ;-?Umdt368hrz`L z;J*aPQomZkJ?!U1{^wjRWMII}Qz-BQ1^HkC4ua!lzf7c8f@KQ}l%PfI3l~nYbINjL zPP`9o`tN~cCRWZ@1*u>3ZQl0tb-&`d8qg5c9q?}p~sr|+x1i}$$ zdP;cDYWj=H!Cg3etSzWZS_i~p)Zw~Uq#xc+RJ$6YofbdYx*Ro zyb*sHp%1+2cw%!=ZM{GplFB9yA8N#~;UI8Qh>@e}nT^mkcFFDkPR#C> zu2gUj>4QOJ5JI1{AGp+A+_qDJfz4Y3U=D}(9OoT33Vn#}lLim&OIQ3+#-!8S?CvF> zbBX$hPXhYoECd{-yzNPJDeU_YT89P~S5=sxFDIw}xlEh9%gIE+D}*!588$cH=pMkn zW4Z9p8h{+&y7z+3m}7ipig4fw8?v(%pGVxCv3DF4P!=Pi8rwfFkS$`%<3?iH@gJM? z8VClG+CGUdg&tU)P!WK`iDPTX`&3#FCibn)R48d&ZKMj;roQ1BRCGn7i=h<$5 z4*rM;L(32!b`pEct|268tL@{3gU_CLvbrCM319($B)#>qou$5ko{mnrh@lH}#|B^Y zQRV&r`g_I4`W3{2@Y?oq%9w~*N~h9;ax=>zNxKK}#eyN5qQc)FK!vvoA;8&fdY%vZ zXt{sx0)S(;O>a4Z?#~(@shdhc9I!$XwhbJk-VL2wQ#_4H#d z_SyTCZ$6OI9bebfbBtGs{!k;Xj0=Zy9+iX&el@9)*nwQhJaHdKX0acg|G%aAn(;c* zo8eWWMKTGQ^gvO1J-l2%YaEq({U-eDHF-$c>uPlkm>6pVel7FURUAC6u@t|5t{Fsc zALjMBsqI|}%F-i4`4y2!khhedq6KOPLqC$qEFn27ZnV46zZUjCA%OtOQLg@eli!_^ zM06mTeDC@UAGp&wHnIneg^tW#s!+U)&a*JhDHqqs)HJ!T8yLfvbi%8I2KGps;5S_f z@n0*>^yR6PJ$iVk`tk0=appge7234b!}St-w+>^{Gkh*c4l*ur(9aaTVWnjuMru~! z7Mb4t^whq#Ng3-`{l56Yvm=3F&f4I-a-J_yH#u$z0rVhkKj16GF;P?eap7^eZFoBI`MXoS!xd3oGYQxJYH=C?-aknMAVI%GxVK-8OGzsy zg8La2C)(#DR?3Y8z=_HN%w#44Ve^CfJ0ZG{Vn}oXl%0cH5qy>^w`&Be1^2hFHe1Lg zFHgUbAL@Q|u1YA4s_HgxM+(0(x)k1hD2$JkiM;sFy031%)TZ`=y#M0ZafXeh<8g`a zFxw}RQRQg8g$|MC#(CArKJT1X6-*Qu1QzA==IebJh!SqQ&iEPg`(QQ&VC@L>pf}a8 z!V3(P`pT26Kn2Jjo&4f!p$vhT70%E_idOhHQI@LR{++iVt!OSAT&bA-kR*?4U@Mg7 z%^;FrPgDqVIQHavDa0O66lhZFE1Wa*8S)CH7?2$PQ@wKI%YhP>z|b(Pi*4HszR(pP z{>b!_P<4pJ^l~C;@+iUqtF|@uG2CtJO;2w#=OB*N-w%BmU{Z<=e648&DT_UQhZ7-u zY6vAqWd>|Gnzl)`k&l`0E!~#veob5}8~x=gL{Z-BqtFnv4%NCy9I1&}>?S80o`aNg zPS>}NByRG@^Suu$ZFIfRk#lbdg`9RumVe98V6n=4WH0fA219nnS)+Jnh|euWkxli$ zI3~K~>$myu#^Xug!&%tn;sCw$d=^L`xy7aOw#YpON-W=*QdYK|8nxdYf)(T$g#gc1 z1chA`i6{VN7!D%LgQ-u8h?D=5gG}?rjgE_4My*>wL8wYEYI(5)@KY!usmPzvoSN7X z)YujPoru=()l^gb-K%zyvD21&Bcd=!4gWjiO7&Ojh(9WCp-_VB@tc`%>U6<#G>^12 z`Hf6z1jO)8uPJ_3fe2s39*#*n4ek1I^g%~-B90H{YeeU*t%CmPqUwF!*BAbG+QdqW zAeKZGu6~d%ptm>N9}VZ2T55A-oNj|rL5H11*lYV9$=FM~#+fCkL`fB$_Sw zPaf|hpVc0>p5sG$ca&P1(Ln@QJWSdylZ*Onsqr+9Z>wUl{yuGnjU`5{#g;O*#M0D> z{J*;QZEn79+Km0V9q(JCoypVXy`8jtDNNknt_t!muV3r+wr{H7p85W{lDGVYHzEpL zuGALQ3mLc2d^s2y-e>$x|L6K`xi>hHVF4%OS&HfFSZ*S}0R7-}0-+y&qaZSnG|f~H z3sC^>nFnd%g>uChn$bf&gFKWIEWN4aULYSuD!qMbA_F5~(Ad2=T`BhVQ~bbA_A}I* zYFYTb=ImhV&kwlf#!)F{#j9MpP%t%bV4|Pn9{j^4O+hm>D~d{C{+mukRVhOMNjD5* zO9dSBgR%4E^YtxWB{r7=e(Bq7rRn8K!s%J*!m0+|zj2WHVxgO*52$58t(I_cpwG>r zyNbt>jB?03btjn^u0WJhj@L){*dJJoKF?WA?^o4ZSC1YYI}!o|H|^N#_K)^Cp!#N# zOhN+0N4YR#UfXx8^L9gi<+{ww<2=`Hf3u|G&b{n4sK-9`-4Ye)mJiPg*fUXR!aoqj zb{W3J({6WhqB1jjVEZt;5LzS6n_R(&V6wNd4Erkr;iZUf>x~JEpcm>otp)xAeJ4<} z47=Nt41#?Xqe@GQdH@}zetIYn$_5Xzs)OW*$+X)Ypbn2DW`K~X?@?^X9g{$9xW;yZtbC1Z(bP@}uZlX5G-7%6W)|mfAZb zW!^5V)3m}T{Y*KKeGMi_l&@r$@Ta$w2;Jm)+EyC#{e#w93?Qrw4-z9>v8LZJu%4=A zjMe>lU-^+7TGX8jpxJPZMH(}f+{ucew&nmcAUjS7{jkq84D`f(bZ9!fHy8i60#3;D`h#^{ zL;MB(g3uA1%q%oxTDgI}o*+Bur)R9&VJKU>hmlP#>|JAZ?Blw-O3Sw6#EQ2EJFi3} zEt$E+EyTVTL>K>?d}r|*CMhWqhEHBY5>BO|$qUN1VvG#m>0ld8IU9c9+TK@P*Ps%S z0?5ICEh|xa%3C>my#be-vr_@cfT};ame@;7)HZANwC~^6h0!hrgI;$Qb?EUNjCS__P`3ECCwsY>iVrw@;x)>GgDfdxclKmued?@{fX1dMsODbQ0x$G1o2wZ+p18?(ccQ`C2XVL!W6=)3q= zDTGsn2!aukWbHZC%f9)XB(RQ}2MeQ=r>I5tf+mj=(<-Cd4-t*$B#|E!xAXJH9Ody+L*jg!5JeT{%(gzp-jW$02CD(iX`<8brxOnlURNxQ>8 zwPj~vu=It5Jbmola<2VZ?}mx&%U<`RrE{|D5r_2yEz{`%_`sXVlJSgiBtIczJ_BLG23ope#OKkV+<^ivRUHfc?f;+ce z={Xev)c-na(YtS3^JNS8j&eiry{2j;SlEwpsgvL<+{ijqStLIM&Q{7gubjD!c zpgOU3L@$Pp!ku9n#N;EAPLo38SoQy20BbATGg$!YXtg4J-&lYa1mpo^#ob2CI%Pc( z@P*oz42J`N@0T!~N>%vJuLVD3ytV-BIu3hdAOvH!#X8S3phknqCADkW+1&aLv6a^r zj~Uf}%8J~`2hv1exCO1{qt6+pU|jdF(h6tCX>v*4PbS_T`5ah8h3{vxBSQGK%ZKqe zSTH~}V<#1Rx!=yr_B|Otk?{r82%RLZi;i6`M&Tmu84qw`UkmwDWQpN4!Egv)(@~Sm zR#|+WTQEuQ&%Ve|@Z<;Q66t)URaRre>FEy2apnFx%$9AN<1Ama3I*2+of$c|Tg2}L zfQvq!@{}91U7!>hypF7g$MHCdt07fFeAC*FAs?WJ)9G}>)fKcoNgoO#^{#mDZql%V z?H{XyhHxy^c!E<0z7?n+ymlq&U{CMsz6|apwILOLb&~t)~V< zBg@OjAl(0+-(?Znn}O+{ukwnp&woz2C6CwSdI){s{U!R~i2)560LCC;S+`i0 zQ(w=4fAW|#hZ(rtm!@|}w2JDHq2i8eqZ85R zXD*#H5lO^f&)1-TqTQsezG`FRKVZes!J8^Uo*Rn`kevz=cN4d zGu>4|wr$M{hpTx4-3oXjbu%vq8|u9-F+|L*c(_aYON9%eBhi{64u6-@PlwDh#J67^ z=+++ju#XNh)fukuRGg5E!E`Neb|=^FJ1FcsFLoy%#OJ@>ry@#LwIzi@gK=INA}bvF z%kGno&af6&CHN$8alek>v(H8&AkfE$g{uPVCGHh$IAcJHO;V3xQ5Q{nVyH^036aROL7t(w`LbmO$U#~7 zqV_E`2tVozIUFa)B9U0pxC*dS_x1IyCA_9&q}02s-Fp6orlhcmfc@3bX{EOR+hetf z9N{GtoQX6(Uv_FTu^#vG}?axaC0+0lAin$nPdiivZYvm~)^H*Xp5<3U^3+_N<5*2n>AGlaQWh_uS^c+F$hA7R=k_o$bkJ824~ z=;g11rc=>ugtJ+aq^0>B@(e@lT>DF?rmcoXjorJeAg4Um&szZ$*h&Np+Y%x6yrK<# z^r%_WT^kWMZ9ffBIfs%1V<#n4R4V5SX}8T6^@IB5YD|qxlalU3KS+;9`|pR!jd;AM_|aq9gpbnz zLwdhJ{`(lgyl4eMUzbOI8mfC8TFZw`e7rY%oGrKW*A=C%^*l>-KX3zqL(cH*s-n*N zRuo-J-$@&M=N7B85H7gYMQBroc1fm#n+rAXytMsb+Mcw3JGHGq?`(R{dP?Jcx46oK z^;fw`Z(YyP;a*rnKR)Iqz8;S+>>OUKCx$n(DQV@@(!S8Ilr#W{wC3mfvTu^&n`T0L z-ny&JPAw&c@(zX;lR4(@t#5)T?2}ktw*0ULxd4dvTY4B(p*SoC4B|D|i&paPS^Lky zKF2b43{7LIyOv9oH+1Uw#b3cRQ-o_~K8ZU2Y_UU$=8wU`@FD?ll?ruPe z$JlyYO^Cso1wm2rg22c6YV)&qQ+GrY_Qr+t)QlclY2YC(>avO`K}L>u+$yYS8~MAK zc65|+T1?_q!#D;SSR~C9DCqUMQhGHU`G^COK_B>b9)n|%t>P)W0GSZRY`27=VF@vOJoWYUoLZxSe{bS>I)Bdinn)ntk#=Ps zhnMK*k}4!6Mp0Vh{@Q@TAL$uQ8;CL)s5_SE0IBQPYVhp=CkTPhlBLG0ic>F^$DK0s zes1oex%?3z;9%AQFk|26^B<4D7JH^~9YbEeie^I26k*3(f2+K*HH+zm&?juYVKYl_ z{?LpQ+i;Q1Lwg)kUD{pA8TdH)ZEY{j`dsL>1%s6Ij`Kk$IXju+Whct|LzNIB#<{Uf zpu{}Vp-`?T-6U?%DSc>y`O)>Q?D=+|aq~uYYkp_nSo)>=l$@@0`fbqTU?)Tg9D%)sLoQfJji1-QKCkm;cTfVktt#wxf(AT1TdOzDgkB zpCo?ar@+wK5Qf&b1pSI1mkwmBZ>tx42S25zqYv4_<9CoLeX7xlJa|6-w2qvjv~X2k zD%trhthLRldd1<3X%3ul;eK*`Dc^qi_{|nOwGBHBe6NeAU5tcR-#MZo=r>H z@`&+TI=1l9H5=->9f*fr44Qthe}mQ)@(T(ejYRU-l!mZ(nZb@vwsl1d$@n{$UHZ#7K81 zZs)EE-8cV+ z0xi?N`hF|`dXPbQcjJyH#1dvE{l4|5A-;P1$PAp0t)>w=T;jlBU?K|vab@A!NsNrQ zR`X=pls~_7;CkKqhf&0d)bvuNy#-hmT~P?xd(9LlOadNrw52(90rMitkU`dw=6zN? zKLuZi4w7=S;!*O(G-;9NmD`BB{fbs6u_Me{();cP)5~_V-hf)iDrWq`2<8}_Q$;jA z=GFt@Qe2Lwd8V%@<2`#X@aZg^dhP2g-^?d2R2wq*E)d5MJUo1NDM!6+zD((Tw<5(e z{n0Fs=#Spfd|$=*%7_*o>2`##>1JK2F?--TyKvZS8MgiKu%VbGmGrVQv_F-sk;V3kO*^G zC9^fqte>_XxB3>;KKr0L1}i_3)jnpR>BD585{;b<49LpH_bTl( zel27VR_J~NaX)B>bMr*AK|uxnJyll14X4aw#rM9mJodbYAKH5+w09Dkgc6poBpD0G z+WWxBl<)63NWXdX$O-krbV&ATn`Gxnw;nlYMA#Vff^b8_ zeztF4hd?VK0B%1P~)5%YFaNER88bh33qM zPLd~ScOp*8OR*~kiWCIJNAC9|SJD$IGE2~92@0#tT;Pw_1jQQTfMYv{Y5+eTxxCab z?jz|T2dn-Vp`+_#+u-_Ef7 z^r}w%5BY3Xmw6kEksIjJ)-`ogKt~7Wsd93-V`pp?_|&q>>+dY^KTB8wUZTNE_7f&*b(28(%4>)v~839it80( zy?Ie0b(GY0C#zy|QHew?0zls_9|%|=R?a5jg6&D}7rUtGWVNXN;dss+oaqL~rKlt} zzPkD5-v3dEi(BD78KMa?wecPgi!)C*J81TNuq1L_;Cc+VO+IN5%I-b$ecv`dyauXo zkbE`zbD|!CE5xi|TC&r}*eqi<&z5Wn5Ky@Ex`dGBweQGSo%zRtfCTp03wT(}chXvf z@AoJWfnXgIIs6sOY?Tf&a<^i#l;q2>+3~I1@E!J`__zA@K%w9?SjK!_9HX(Xy4@@4 z@83y&uPGZ`lUCXufF0R)5g<8gdzqPE(r&Cpf)3eOoI*tD)VfDH-f|Kwh4gRY^DwN0tVp3-odw6E5qy5^qlxLWceQ++I`yrX%s&pZj!h@-hd-ihx!4F8C>33f^^IQBl{y9g!%*Jl9^TT{+kqbc zrT*go(eG1Y#Idb!I1Q zK}A85xHpiZ<=+OfCOJkJXv{eYipIF-KkruTkFXd$Rq$wKGAjgl zqu#q0)P7tGo1o&MsUP2Z!6()28&X>ma=SBU&P*##i1Ast;{lU!1nPUm+dBIQhVA<- zLO!hp>((@0KYBI$G62wW>&EU1 z(OWhdjmcklSq}7Vnh7!j0MS7Ri!%w!f&a{%O=lf6AV~b=fs{ypc}E+id%MS6{%%En zcvB1y@vZ=xvie9j+IER{KHsv6*4;U_T@19JXDT9_ULNr8Qo9n{T0R>`0zBF93pCVLg{O(PaPHQHPc6QS@9whnUwAd> zW#=l6%XsGImjr9vXK=dY><3tjP6cVg%xC=r%03_M1z1GXn0AQxytDU}{T*+nYvd(es;B^!SDoXwRLN6_GKx1Jz zBa1du%S+-{F}WCW^T{zuc~%vo@RuofVWPyxX~gBOQI9w~tX8~;{-v8Q$_n2mH(sBG z)Ub0(CMf?5KPl=Axw&UZ;kk(pkASZ=Hiq@A0QuG|$ zpQL_THt$?}Lc~zomCqOb?`8Y(2dOoAEL>8gI&qpzPOStC1wyeL%F>Uy@ji}!t}dj? z*YS6$MzVlN*_$B0(U}Dd6trQ7i?V zcHmvn2)ea(tsDVtMTVCKO4|$=+=OekuBP{5cU2UlBfY^tC=r6T5}x}^ZnsriN@64; zqv!Raz?r23M64J5za6{-Ce%nmfOJYUPQxiHRUZ!C3g+D^nNFBG{YzpwY?sj#_*p?6 zPd>WSpnh}1BV*A~)>|vq@ep(I;^Hi1e1=`=lgplVSPj@wDwsC8o3hka>#YyAN!W07 zcvva$K%+;2VaQfd(JBV?%%U8}(;SRBPs7*w^Un77a^}18{ksXp+rx&Ig~vAFR*N=T z3gW{00o_P1*E$d#@h&8RFaSN#J%_&nLoKf$EN7zWmE!p}OrL2?7yD zvERw$IH_N~2(q=@YJ))ozPBlwK^6@`wzfW%?TWGE)A*QsmF8;c`;|rJ*8|l-rw`D$ z1@EOh9ril;f`yVGs{fP&V}d>zn_6AFs$<`8UtXRo;f{b}YoJ5zqNdnq!@^8Y-X%FJ z5yG2kY1G;iJ=hr@z1B!ma{_hH{OvdRz{PdCkCWvCD7!D;lEX=!sqjk>sM>y6fm+1i z{}x2fY`w?TdFZnXY9!*Pg!3Robuzf~l#HkomFE8C0`ybanqWe1EVpFgs1lJb zE^xMvSa>mOzwXc>H~Ypyh#~esq^gb}Y*VRi1*ULij9BZx6a=a-4NgcDR4(7!vonIT zyZ#6bUy!*tWlTB53GHXq_O+O2P>@Wyf0Pegdu_@nAu0LATce!(gIM}k9L>4Xb0Y!y z>P+iUkCm++8!p{Qu14CMSznyfX=Q+>^2ZP^w#rm2`BkLg`s=PmzxjR3;Z%p}r41&y z&_>F|7kAt07mos4?}v7EA~>-Xota8^meGHhteaMGU_*HY1hzpu746xSwGR>~Iuq#l z*&Vd_XSD4D--rH%2ANz0wC6M6vb)>h7VpuZJ5xe^tl@$CI|^Py|X5{@9##lDuypF3>v~pGehfeLScD~N)HP7;H5Ci@pKJIljoy2(lKE`C$4}&X z;(8J_+?vUAtmwGyGddil+c{6X&F$-R?SI`lGLkX-+r7-m-Pj-cZToWsJao%r>8L|St$J#N2=5AQu#TgXw4mPh`^hfEqcjfbgr53j9 zrSn|HS!c!~ja!_Lh6X7#={VsrLUaRu4^G$HIw{^w5?#h^^0BJ;amv^?2U(Bj98y2fLNFY3_9?O)*QhNHD|utFJUXIS>~W*D+)HZybm*2!B0rU zJUcFcyh#!7EFQK({_VbbxQOW~Tm0wr0zv+s!9&XOS0jcm@vV&OL$Mx@k<9eI#OdO= z>GOo*pY6Fnxth~NQ6QjEsPOB>OyAywwE=KrZ=(gN7>hJkxDnTu^|_dM&m3UneuFBsP}ZKnQvyf?S>7c zHs##IsUV`JaiN=t;JxI!p!4QcVij!Y^*}NUUNCSYCokUNcd+w%dxUH@f)Gy?HaZit zU4p1M(3^>7;cC*Ck(cC7xRE1w;F5{<U5i_1#Uk~iiEOzg%HJe_!xvO2t#Yhvt z^XzUwe`7sIQV%4*RhPR?p zZmc1aR)5vo3R|EWe{*jGsf5(Q&xd5m4eJ2?yE!QF_%1;gKWL2QH{Hf5$2bV4kpwz` z_}Xn@b18X3CQE1{9%`{)4N2dT?z{%p*!4>Bgi2~#<#1Ig+ya(iXwEPht)wC{x71(b)n@jHIJCU78`u?^(#7b~x{ zpT>RfeIe@F>>CGLX6Grlyq)XGwv5#|BYA&H=i z47o68eTgsMO{>^vQa>1d4JN~xnKpJ}925uO;VlBpe>$?Vuz#IjsHp^Ia+OnW3}goW z%MU7fe9>k215#PK5#5JlEmgY7<#K%thY7On?Y{_1N`mB$ljbAl*LFzg9nN`Rs+?m+w8j=g)5FVzc)f z)@*s-D{Lv=4T3=%tsCuwkK7R#RVIelxLOHWn*9fsd~jmhk(R$5?85CA;)>V^&0_2J zq4)Pr6{we&`WL0Mz}(M|tzc(62Fw(N=FzWg-nBnF@krJ7;629KMnnE(u&1he$% z(E)#6dwEIlprPYC(>K($jL6T);cB7y?zNv~xH z3twTfZ`_r(sNuDJ^?NnSgbL6egF?N1tj7a@GeCp$)7k9ICQx`@lj% zC|~`RK*<9V5b#^`=wKxRX~WxFu()eDaae6UZeaBK3!LV3$+YHp zYfb10%!EqR-$fIpx38rYl9brN$ijD8O>g%5%??%_R z6?FRJzI!{7+eO={Ew9bU+WIQY>7}aiD;-TOW`O8bbfrk#p-$}1{tkecg3MHRQ+M)rUrSx*L)4zrBP(P#pVv*@ZNhUr z7z(olFP!#dW+z9kl;)^On8%t1gYgbu4+=$~)RK~i@6b<%rP@4i`_kuO-Yh)Rq91DD z{`8|6Q8U%stBuXFOS3_E0*Ti9-LAMM)+VFa}x5bT2bFlE6RWNE={$J$RG z5o)q6FjpZ4v^-fgGE?$j%MJ#v^uc#FSGd`o#Hani}O9t_dGO*Uaa zTzn2R&zJPs!11{K=nkhz@BJEX#+G@hCy-{fb12$QK;!V(&J_Qzg`EHG57!f*F(#*m z?6ZdTHR&wLOx{EZxWyiz!aPAYj;{`Tp3}eob}}tZ`Kg?vMNv~=^o@T={phwQF|s4u zd;~R?7%N$MEe(Y+goG0xla9{MJP-B)Cs*R(Q~bXdpo}B;>fACg$z;fcG0ICV?tF(G?@ zhDdkwh?K}@KP4)YAXVe$mGOnlx)_^3*d%Y9%AGLtq`KR0|Gf71JLe}CE6k3!h3_Sy zAVWHWkFWDot;ObyF##eb#r_D6Y{8k3}t+hi~! z98;si^0FkWOi85h`G?Z!y`n;jY|@T&yF}%fw>|Yi&Uku{Nu>WVHK}p{gU3WFQ?JH# zX|4Z;dsDd@>Q&_K#SCG+zY|I9HGld;kP)N+b-;79RDTi`{n`(shu~b#{e+si@RG94 z?!Fw-43L20HO(Fx)iWIqn%7k0L#!0HAH-_Qvk-qRi(hV-j zO5TRTLpv8DC|tTvL_&S|U;jMUrjzlP!Evf{m#ZgSi|+B&Zr%o~xChSa2JQQeFr6&q z&+RGqmg8gmPEt*071WsKruTg=5L;WtYfD#EL2*`l_ud$`(JG2!UQ_zRu&}_a zYs{SVy2<$Tzi-c#>EI=(R{Exeqr{WUlRVz4Z9g{aN!H? zn)KJ*3oa)^yK7INiV4>RrLQxMeYHn*PbXBWTM?s!vc>qCjPLL0k3lb_FKAu}u0g0Nt6PeZj$j zR1!VtfCyS`C0LfNB_Kq+d0tA%sB3gAiMaB6cNlKGk`fwhtbjX=HT)3QRdQq@^W(0j zu~g6-_MNxYY6pW6e0vF1N7=peRN3)N5pUybSTY~z3JUzUU5}}rtKyPOo)w{W2?Xy2 zXwoIH1WLViP5<{U<*Vt{h4+^z-NG;a-r^$szXG9zeKKOPU0<>lQl+?Ldw!eHA!w8o z#bMiiZa`y~3abTf*4P6m&B zP}tg9-a=!FZM?dWki=ld^R*3MU=A)n=-tdyLc0XF@tqJ?I+c)bi7y?_CYCv*56?h~ zDx-jw>h>q6r~YCUdmY%9AG^{|uhlc8oRyk$Urc;HJ$&^DAANx$mrcO?_fM}jX&SQ3YD)14s`^ru^<+64Dr5nS5tkM2(!SMXKnhK@Vg#2p zFv%nM4fkAu2@WpoxD{20V7z|G?qIX$r}cxcbYB&FA`fDHHsu zbEo zeh|2i07v!W&`gw(W}yPxcWP$XJG{!N-3D$Bf%y06u;u*jPefy5R%-JP6|W0~Rfay{ zj02v|4lfXjN4i7MO3i)$-I#CN|7{`O=C(!Z@XRsNReX~+G<$>T?C>umCr*E2PPIS4 z?{6G>6?LSFjdNYzuP&ACZV}4RbYVbzx}WTyI$?AtgK`zstB=)t-BPdZia}3!szbyw z>Simy#GQ{A(pOJyB})w1O!}GqD&JNLOnTZC@Gi78BR2T$+ww#jexnI$yyJdRDxpOX zr>lYlmltc(hb6^K9$JlVuXW%1lIOv^>oa|hyiE0fZ$>^50#Hf6w-j(Y)gDLJw&Fl( zxU~|1Q||c&H~%R@y`RvsU}yNFC0W5>I#{PA{fi)EMY6(m;d%GnGng*3Od z#Ss-25w0>;tCWke3(Jh zy=MJ$u+K-)CS~2-Ikju&b)kG8kiD+Q_H2I7+j*HlUgKT4r1L7Dis}!SXQDsKpSM;7 zkx!wO3c2Xu&)WBsv;PVDsgrlCDg6;J#cTxALO-~`64IsRf$cv?C^d+(i7~UpX`(8P z#W*(6KW7)V9p6vR7z6+lW#nqs=9^$(tNIRAT<0!rjKk}Dx#Q~YAS;U_!vgvsZTAEz zCX?Huk2FT19++?0W7# znYc9+Si0(NJbI+8xFr>2-_y2Cz|56yn7d!5!*0lv0Jv=H;Pl9+749KAF_avPwu=+j zL|-9)y|%f$IF(^@9`ARl4&=m;aeQZS(fZB(7ln^8Bs(f(PgE6tD+u&DOI@$t>CLS6h)t9Djg(Wm zsO#x9oY`MzVaCjfVohvp1(4tCkJdx~V#JbaL5Ol~fSxd7W`kKRa+u@b`F6+JX& zO_}Bj`qyJc>~zITEYb1)9VEHhqkJQH5S%GKs}%AmA)lfE zhv*5i&afwrzfMo#n-n1sUU4c^RXyvx%w0Lj%|Qw`RBt!e6dp_R_%Ppew>Q|S7Gxag z<13HEXyW4}Pv@oHl=-2%FS~Beuh^<)qlaDhsI(K6t`jV+)iP*sU)Po3=9g%EYl|6zgb~#%|H4Bnk8cz5n|2cQr$u^M7P37~^1Z|KsI(%4n|kOkGVLGLNkqr+=^JfK%`y zv)$)`mhH#c>#RGE#s9oeE36yHvsvT18y1o5Q4ER?-MD4`?mEx~cEsdYmvJ$0{c&%L7xCkq$Au>9 zDE`jw;xndXcvA-LnI^lE4$v#l&smJB@v!0AY`;sw^Z!B8=eIyawBb4Srken+QMk{# zBbjITnGxwZG?E7Zz#CH=Ba?e6{qKBDXHU%x3)0)vfnC z032E$u&y_;Ry-|~TyHo-{9cvK)b(_ZC^xlNdlw)*`$onp-wb^rn^-A(l$K)>4MzMu z`rTDL)Vl6o74?KiA^Vi@m^-6F%IKWlC~5l)Q5xM^-@ck&$u{+z+c86iHYKowMSC>r z#(re38vXE^+|PB;aHE0HtQdY08E<>s7p_DB!hgD|bh3a?eiPumaYh0j_%!P+1PRPM zckk+*+Rjjv?Y;E$5yC9TgkR~|lbPMKbl{ZZO#cS;lJ(^gn{qZ6oOxFeFt?=kYuj*; zX)tKSpZT`FQLyQ5E@;?pg#|rZ(Si#A+L?+)fOYf-u}63Y#ou2&(GV@<-_Z~uUVivp z@}p_o6RwnXXm-1S?bZy%YNMsX7D;d#?(DQ^adV{77ZL}qNoZQwl>FnyNfav^AVZNH zI{f*z^MaB^s!YMbmyJ96Bl+2NKDx+6&Y{zk1zq6kuz)=(h*1AO0Ny|$zmGuneQ>=> z#Mxdo_dw2a(a&km_;&yR%&-JTWB%6AV<$9!Ljh~GCRkJGSNKaG+cU$lb-&lTJ;OelKIzf^BMTaP37xgcn;K&e8iqdAGMmL_o7Z!9rh@_1E{<{i zn)U)F&~NC8ew+gW`jSWVMd;|JXCwDQ7l;zP#_R)dqriafNvLY_5k-B*slfF z?L6;GkJmYCq9B${kio$>{LGAVy+tnKi~o#-*lM<)~a$#RvIAInU%Zg zfvM3>p3{IE=#TAL&1um9adlnvOZS;KTe}k~tbboiVUw4PnCR0r=6#<@e{~yxxf%Ud z*HN1eu!$4{6?&TXf4~D@_{vusNLV%<@u#$Ho(@~vTVa1Fc_3H-#7eNS5i9_@=en5W zR8xE{K}ZMa$7_rx%qKR#G)}=BU~}BTb^%1HIZuoQ>i@Y|MYE~8^@P5W8Pq3+Ph7n; zvNaCFaP8);18eZuY;?!5p$MB95P<7-ZC~(!yg3MCuJoV)1FJTGe7D!I4r6W=%eylH zWU0_(ZbMFl|INw)pw=O;d%Lu^*RZRRhZ)qD?meR2A}OaQmGb?vm^&Qk;COK*u7}-R zI)280vlm0wK9ZkPHbBODx5f5R>-u#}qgenzY;;v?@TQHXR8`mq`|VWVP3%3`M9iv$$6(V>#kE5i(mo-{bg7)O092 zospDC4zk|TF&!If)v;yvp!A8xld=W`{3S>c^y%bP-M16N`bpJ^%XY_A zfePviC}L>4*Nf%eC~i_{Q|Ws=tczB(48ColPfnc*2lHqD)=#$aSSE`TCyuiV_}m#C zbTS|lBtc-k58%%Q{m1bd0T$8Et%mT36-h_cn2G53;T-*SFo9pcpYz^6H$G4j<~F`2 zC=FrSUl##&*!c)E#x*}rue2z5<42ipb<~ocWOnw~=-hFSUl!!f?b{I;TfIKI9#{n6dX+8e?o&tCae1peJ|c-LyVzR07^W&LaZgwv&* zPYUc@yK$p2IxwD%a@J7Yj5qUBf91px6}jHav80!>+x2n)fIc&i8~~v2Uz7#lufG3B z3&v?V5P$#x9<1ygaqb+Y-+aAz22&3NWGyI&F2{I$URw*mY1F$f#}w;ubW)`~75AaW zU-y(@R~4H`w6W|w9Jij;gF`D>I4Wp{QeJa`fCSH=Ybpo}D}mag;6Kl<`zr|SvZn7V z{ibttoaTps0D9r9#S!n0OZ`s2xculHBQbX@6UfhT8^yE!ajbff=x^(%W!bFzDl^*X7aUvqtl z?DqNZ$4U1Mk3-3Q);aBJ@*&Fnr9|`jz;S-fe!lqLp=UhquV4A?-#+e-5R~V84|1KS zZz;_uzU2bS7!y z*iW)I_yNwHK0Ry|=pQ-ifgbkf32=?_6;|RW=3MFfa-0WSssd!el$C!0mXNv3nuvX{ zfP&gHwWmc1uma)+=vV+_K!wu9mGQ42odRoVskB~hj(vfT<+r9Z($lA5_v&7{rxL0D z@(;h4VBYfY>OFv-SYH+RRC`!&o+aM0CrcKn?O|IVQVJ)0q4jKJ{m$(r{j}+QlTD^r zP}h%PJlziJuj$v&Z*5YTrxkoj|!3*rIUXDr6)aaZm zUf}y}Z^QLE4|_GoIS9e~J%Z+z9m}4d@-$yP(|`xb`un&pfGrGQO0%_P-=hnc?lEBl zu)vn=}Fwf+DLw_{NZCIQOkf3vjZ!k_RGuL!1*HaxN zL#$7~d&wwoBm0rxhu zgUpo!&@nhY$*u}Ttm+|3prtc2jhE=eaOh@MH?>eD00}lA#F%jTIR)8>z|1WEoK(`y zRANBNR~qMm$_VP!L_MYQK*m|#JCWN8*pC_dA z^Tv${O=%zO*Eo=smk#Gdi0hS$DWC1YT&P9CZ)~cIm;x4^@83@t7>td9V@6O%ev^xL zyn?s$FpvUm|l&{^QXDk`b3KU!FYdt(!NS68rJ!g}3i1wTG~m>**BKQkLxM_2%`!+}_X! z?w0`%%|YSWXm_ z`W8gA-{M#!w}KTw-{aUKQ#sq0peXcEZ#(+0UsJke>aL|bmeVJ7i((bPPdua}Y!{zBPd?@|6=2Fo54?~ne(%i$*A-hCO0s2g! zA4Uva4_bSaQOQsb47yBpr`sG0z@jn$%%Qoy{y)C|Kh+$YkBYcsPY3qnhl9&y0c*ka zLwBrUtoyZE@Tm;sIp?69U6Ey1_95y!$KsrHr>HxW)&7{T=7@`93qTakzyje!h97Jl zUFKJ;ZL6E@8BQTf%9*Tyy~`zm0q7gGg=d*_I_8+AU8tANji7l2hdsLy@Ko5TIY`YR z5_85VQVFyZNC`@Ns0z(V?DuyEHgl+fD;5BqX}de#>3;$*QH$AZMxWn|srMgqg!VX9 zD!%~=2zg&lW2ai>T(aXMz*9i5bkbzW0&h!nX?@RF9cK6WI`g@y`5S?OnopvNjrnOA za{Zd&T7JL&`n?^-?*NKkRK|Xk=l|L_zVT7s{-xYoxj=dyLM7tw!IY!*l({>e4Z5NVnqp_&f?~&%uSw&s};8zct;asF1lfHk|82=x@k}e!oX2(O(!C z2t;}N{P|oSH9ZEv0kYBLWwgfvKMtO7J>jXo9hg3GwyT(v z#xg{o^nD?nLwk(d2M#jm^-tH?_^sE6a=*&^qt|hNbZUYT?Kw*?WzNR;71W#SJJ!Fh z$wecY8bfs^%MWhW6_(;G3{RI$%qTPn8jK-Lu!j^jZBW9ZP-7SO>_!02OMh z>^}5z`km(uf5nq0!{@*F8^fsrY;JCz3S9x+TmV5a0BBw+yPqJVd?isjuGkLsTrio; zF#x!%m`m6sz#HsDR?dsDP8lR$O6~dG2Ebflu7=KRAb^OH*fC@56bVe z?EbPk?iqSuLB_vlzfZ2#11HPqCfk3K`CrWI#By1CP3G5yCrnUe(${aS+kOw~!7Qxj zD2G!zKm(T)ML)VjT+4wm9U#DEgWuO}xAq=@mIdC(?suk?VCAgXC+zW2hO^2VjBU&0 z@iW`o!^s8f>KR6N=|hhM0EB>Bf(?Mqdr=TTP$twYOsdn9t-e?&Jwca{g4Uf68i(E8 zyXDvk(UUdp8?{-XpoK^-;lp3%g`Oc4#+WBb&md}k>NUs!B1oSTB-@a$ks3|sh9Xp1 zZEWfa)Mv?nq;l1BWPc?c9Ksmqu&y0wZDn*(1Ge6`4a_#Laibb(|C1g*=`(bFHmDT9 zPm}6DP}(Pk?K7u`?XB%b$@CMS{cJp$GM#Q*zup|mI9wKG`}ec2&$M3z23W)hz=qSG z*E0q9eQ~Ng-3Hg;xWh^TaBUsi0~FZUQt8OCN67J;fA-`1zUep1-igCJ^BDW6sEvVy zyx*h*Q3HX@NdphiEDHK80u}i6&Yn9voH{klFu8sEb~B8YmPD%qKUO^;d3WXNv|jwq z&d#v^lCm~GR-O3>>u{~QRhzg;gKRzY%$s?cW>PY zN0>?gM6d-K|Jrbb(se+gJ0CFc!y#8j2sB`1_khgBi9@zq0~s_5yDAqTs(;HCb!Qjo ze4Z&BWrb!AT@+Muff+F}U>wkSBhx@;5RKIRMH6lTx7_bjA9SXu4D?H19I5|xt#n>0 zP*vc;3QE#BiO^5rDthd*j9))%sWJGhvl#$@JG-9s8gs`V<->no5P+OImoH2iYAA)J zv6Wr2bMM};cmF|_iYP!yI)LvFTc=M4NCfAy{%ZW>sEPLil2F4{&gzFn_iwhAg8&== zkaH* z8Ub(x)o>@ww!Q!WAOJ~3K~x076w=!zF$NVB_h%scNx#q0#bP%#n~5x1TmSu>^xC94 zZ)1Hu1IZO2_h77^$w40Otf%k#F;S2Ju!%G4H0KJ=)ftLc+AyiVSWfVMT>>J&L9f4V z_Yo|28(eLjbJq9I0H8vBqc%mRWLFZ!KO^%AF0iJsX$dlT5W#~Tz0=x*956G8J~=>L zMpNur8a!M7EWQ^oW`1veAAJo^Lk6&q=zdWv)~J-Z$7ttG?aRIm?)2{G?8}g`Z^AXc z{LOE^3C(z+Hi))&=iXj(2{+U=d4;r_$)=d#y?epAl;Hk4Mr3b{xSNyp-2bOr#w zkKR*)hxHP`vna=!V63nkbew{DRcc3)*Mn#Tvve$=0Q3*8ANz8#1_<0qK=jZ4;P>-> zr4Io3(s_FCdJFr8?t&DcQ4ZYp^XCA|KK=x13Hpv=Vhq+h@GtrhFrNWMoR%D!+Uuo_ zO>V)2_ZUL34;2F!b4YU8LF6%x)fRN5UPtloc}D$h<-`o2!tb0zGySu#C!WuBC%(&= zN;2&+-)L_H)(l+W-}^ZFv&8zfbJ%10?;7hy7Yycn&hvip=i_&t!*yWxGu9DpWq!={ zJ^j$;ReAOo9n1WpkEENUKXR?Uy)a%iUA2HF*gGl#5HjfG$zdY^0J0fJ|GM-7bOuN5fQ1z@*F51X(6RKP!zOGYMjGWMGcryOR6ehq&158fe|CHO%_srTPr2s-0mPuqWPZn>JWdA|*CpUe z&|I5dDkMo;7KqBCU`pYdXlWgz4Ol^Hq*tQ=ifsF&hE2gDswg2vvV6eA5oProm1&kr zU81jIgK3CutAADoS5WfH5!}$*Sx17vJ<4osN@XAk0HEs%V9=;96`&s~Sg*i;OxUME z`_f7t)WFd8wt1g;Co_(U#en`{tx#qm9XnGR4@wQ_-WM-tEfy)IpZfG?;%-_DAN=UY z@xIUQXP(S~0bHrbg*ei{^_$CKbo@sF2y&CpD+18)O=qs8zzF1+5AgTxol|Nj zmkei7#;;z-w+B=Q@!Yv{?ExfvuV4G{_&(5E*z!dI;G_14>0TDQU-XVUkq_JZ1OU*n zVgQgHa{bor3}#Vtu^JG1AMcC#N&3>G$I2AS03w+$YJ!6B9(W67x>|=ZAtSkWMBunX z*Tk`g6FlxwG@;l^1ir{Bm2M=R4hI;2UH@oKh|m>M4@$!&Df|gwQ77K7rE|&X*K-r_ zA4^XO1R%pJss0@hkorkx{NwbWI7yb6+kN19iBlFH^56Z`Prb{B!X0007Qx zZ4IZlr=UhTav2}}6-D8im=?+roa2;?3t|BfkWD}+KpXmA`C09b;lz|>jE0ZlegTC`?>$++ucABnB<`w-R z8h>O1-+AAUdVks(x|ZxR1ujHAD%J%YZ8$=l4PiocYJtO$BgP;wH*PH>uxxCu@7eaW z+3gx{e{;@snNa#3XQ__Yb8rnZ+qjN9f9IU4{c-**{oL|vb3YgW)Ne{K=!5A#27N#I z^SgZY_XnJxGvy${(P_b%qijlFD|2JVT$vk}mnMK;^M$_ht#7^NJHGtesRY1oQ2{eA zG)AF+Q~)M?9hCtTnM@Ycht;wVV3F~ZwaVA3JmeUNqo(TIS|LdWW{Z}!Xphf4N0xc= z80&Mw0#N6|<`jQxetYI~KaYK_wLOE9OI2zh&Oz^VD%x^F$F1iA{(WR)F4FPxhkSL# zt_R+`oGhcfZYo&>YJCgxw>j=L=GlWghJehhn`V^)sO%X*0SH8LS=GAMoCFMz^J@(H z>v-+kl-$w16nGO@OnXJs)s1Ff*SNR4+w?)*>+ap1;op4!`w2v>Y-deV!14q`V*1uz zjqV4vx33RCY%c5BH<~@w1^wF|USLS4T6g;L(4ma}9)GawM1T<0-k#36)rZfAX?^56 z#3CoA)A%>rt$@$igniIE+CZSXvOZgYygo;N3FJ`$AbnQM0DX_Y{+;i`trSlIpfo?j zZtDOOjmFx_D$zeKE78+jCWp*pPLV`tEK|%it{1wPSYwP$sP7xk_NJd)?s84qF?r^W z0g1heIg0K|Ur#^;7HDgFJZr>21rBtG_(-h}Y;f1zQ?`%EjJluCc|b00@2H2G^tA(! z*^`Q$8U51b(}Y=rtbU{3_hZ!-`NN}>fS494h6QT@{jT*9@hU6f72uGkPlwNc@k_(W z^^?Q)_UQ=zC;k6==marGr7u*8kOVHv=Fie2u+PPPC~Z>LMfZ*VEG7jK0(5+{dn)6f zF%I8CB#NfZn8_3)Ab=78Zig@?{a=FpF%JQo6p&pd0DOL~002I-UcvjrKmbh`m@dV4 z#f}~s|5gge<#{U!MM)}W_bGYIzM;P^Gwn8&NMO(2-MiU0UGTpFpDHPXeTO;M+gik; zr8m0&F6{mSp*Z*~%4UeMs{rF_VY3^}j)QH5k}|E_O6m3JE$ROguxA*yPn{YzHoBz%^FhTn9sn>G_@AE_DRJf~_Fd`l%=@|HbNupI zUAgDje$&atY4zud1*E6({Qm4*9jZ$1(1Ke%?qzT>IdIWBf#`rfc85d}Ye) zuqp}iX3UE|z`qCxFz#vjZpuD0{Vw;BX~u`|=c%Np-t_K!@5RY?ivd6x)c5Z{$XbXE zESkrn^M%vN>R9GJKhpLmSRg?FvDa7DoZc%qDxFC>lsh_Fu&gq9`K@oaJ164e<&2a< zKg|kiP~U6=S@^zT*Z2KB*kdsuM!NrSJxl`k>D~qCk~sCvEX$N2)GEnT z?TI!t_{MZ@V(7n$8T&E-0LupcUFXs~TlRJ7+_?bd@{$1<6txvZzNMJHVR* zfx3eBHy@*HmU23VlgsMw_Wd&2zDWdV*v&GybU>Kpt#MZbNhMVW8mXQABY7) z_h8(d1>z_<<@-m!Mty!AwtkPg$D8>3+W-J~_~`L)>&~4l`o`pQs#>mHP1ge%4(6yh;B@w&e-oIN#@I*Mq9g0T6#(EPS>^x$*azkU zJ$>f#0sW%_3X`=EGQ5(?lvLG$0szSnxK6tvCy3UJQ~hg-C_o1jfNYWVNW#j}9V*)z zGJa5U)@Eb7MEBFR1pw9MmAobY^k07OyTSI;0?BJ@5iI0$2G+8qkQk&MTV_7{6SBhh zI1ly%F6is6>-zvVQ--z++7noBYrjB_jaJ^Bg{1>|7BDs%_K|}V*b5!VhfluWuh$vr{{pu5J)S)reSvl~kawqdME@gZEFewL7d<29E!6f#k?-{H%x&z6 zw!atfoW69qt-d7qMBVzZ4LTZa2Lo_j2ZbU4W=p~J<&Ua8(%UrlK}&A{2%ahQ_i6_^ z&TNdJyPo%h+NJvhi$&Q{x-Q^T2SBi{wQoeMq~<5r;~dryWv6oe)^=caL#%-sQ~V6N z7GA!li!Tk)04-K2HBPLT`)u& zJDg;V?kgXMo&)>QY0z7rm8?_Hasr|$8x~+s4+5a9gZl(r7U%emaUHi6&^cl}TKVg7 zL-rB?8pBU?Y_KZ;z-!!|doaLcaU66MMc}^+7NG~`#+VG2#4RZk5I?bZn^V!tkTf}O zdSZ(Sme6h2EdYXFvw@Ke;Eunml_Dun4D!+af4V=cR`?V{_EyjyKTynX_Qhh|>p!P_ z1UQp@21tp7ZpsEA-%p=9HEg_20Kn&e;TIR#jk7Z_1IuHL_ql`SKmcjP9CY7BF#Dv0 zWp&ikC&PmWSrbsTUlqhw=cF@@8tGE@k~V7Z-n|K>e+;&xhHJBKMoQMeKkIvKA}K&A1CW$%nnwZ!dIAR1Wy~knm5OE zFs<1=utQ*=-eG_IpYnJ;K@T2#me%)RvBi7RVjzI-2jj=??VF*~?C$M{(Tr0r94Mt* zj@g)LNTkyv9d8+Y&p?m#l&G_10lT=4z>-Cm>3(3Z=}mwZr;rEynXjSGRgfpX!_i%i z?MIK3HZC<8Nh|)51l>fWCyKTP7iE;DxotUc!oQH)JmqXWs z{sIC>=Lf72LB(5s{v$!JqrLp=k*`}?)`87$e^y)FJ-pzq5e5S04nP*NZq$Ftg^dEMyziw;wBr_XrDS&s9e1&hl_ z_w2Y>tJPyJOIW)&MLA9~KpFb6UTdA}7}mUG-U!AR17RsPuyM^ZS?ZiO+NW;d;t_RrtNwWqT6p@rf3A-oBla^WB>#>qXYl|56-*oh@IK1XcKus39Q<) z(ib-}5BT~Idj4W(@ki1z%;y6-hUB4uaf-8Qjfjb;)|^ zpyO{`zt&K;D4Pxh=%>vhTK}Vh_dP%$7vtgO1M+ziOo3kCpR?$5Qu0nSIouJ~D;527 zx?nr_Tc1HWf>;g)+j9}Rpqk6ttf`&KMLqALAkE7J5G=Y@U-w(>x-DuqAskn)RSzua zfph22hfMR=Dp-8{r_1FlS0_v_D(m3&ijV&j9{(rk_lswFqPcy*jnadAR_=KhE?x?j zB>@2RdhqDcaQn_qvL#gjJ?q$|VlD&tp+KM~lI=*URq9}w(XV44J}CNRP`b4_hEZM2 z0?nvziuc;+yo2Jq>U&B5(!QnpkZIuoN0fKn283`tJBEpXzTTPE8Dr2lk@N1j^57Wy z>Ig!}tp66Iv^-q0o<^N78K1~5<~?Nue4O;#>j?bQ9nS**c#*(=%&D5_hXDZ2ojyHm zoto}L%1WlMG{P>@B>$B8D<_J+>-9YPh)j-W0Ri-7 z0CX+gbB+bz-~97GJh0Rc3uN{O)1PFXgbvzgeAj26->It}tPRV(=NyW?(^1!m+L*;q zCWAWI8EUONDu0scgrQyzXU+L=BD&GrIUdP=bEb^Z`7y1PNsx?t;-rf)uG+)s^m--* ze5X48sP`{37CKiz2vNtk3@FPSp0iino>9B#Zvy+iR`eY1^d&gbJNVqu$2`HY+Rq!V zk#h4%03>LG_JK*jvrhIt^Ygur7WHEvc<^hrwymuVr?<8;cvGbW`~G(aaPLQ8PP3N# zcDY^1dpU)X^~h!zMtTR;qCI)eku|rro@Gye(~o@{003e;x>Ia4u#=>7KG#2qD785x z@UVPk5!fm=q+kiK&#WWnRnG#@`zQK2%{@FA@6Oex^Hd4Tl=-x|D9y>DtY;w!hB~e! z!g$6rbFST&fPcSN82!KB8$iH;x$8=UdxIy!{7s+nZ)f}Z5&$0P>4W+)Z!1_v;F!6J zqrL4(;eRd0*9w67Z}@Y2+G6O_Lx&SnPX+r)h(c#?+3?!GD$`dwmNNad?t&6H*v!(F zVQ&x+KnwtX_WR!mUkCeYCUs>XAhNkDc)_}cVqVw5{s^CN0SN(`y4}E@Hy2oKYptv4 zj%}pAlD??+382V}y@qz9Q#LC70t@)q`92x!13^`uAUk}_x-VJY0idwpXgsr(AaFV1 zAkSz6jBo%y#m-iGo#YB&2ChLMhM*90g!YAx+_FyznD={mv#S)Oh05LAq6~S>lln`a zAda$J?>N7)Ye922SzhCfJ>bEb2rQHASTZyA0@x%B0G9T0W~J+Qg0K9gzO{}av%j_3 z^k=mLkOeW0l*wauZ_K62;CJ>Z01|Ot1<3g8bAjt=Od_k^j&1YRbi@WWGu8~BpZz)X zd+xaj*e3%YIiv3gQmP-Iub;@FVme^{2Jo2d;@Y2e{6+-wN1(6Y)BR#D* zCwY-Je*ytuD$!cgb^AozwvTJ=6x*Dh1APH@1Ap$gzQyBMClM2g7})rGuQx=$1snA! zcRi@@$p_BNNc(+9G2qWC-@R=F>0-EV_sOUO0QUO$@E8SN&=LfK*tPza7EL!`J|LST6^VcfjG1RA_nc z{4S^wit03v%`C4l(hDe{jtVDjHNurAHkXzGVF6VHZwPd!ps3(-K1*&V`FpmFTCG9b zR!T)Ea8-{blo~M@xPhUJ1_kwlB|tSJk~Lv8{!b)5O!Y;81uEM=7zR$R$2n2v;6$Ro z{6#yWokfwW_flY!IU&zU_JT3nEZQ0qD-|6SJAD@=6Nab5*4Eabpl&|<)8W&f`AobQ zIOE#2507MkIBXUj7091s0+FP>b2^DMLlpz za>h119e3;I&6XXv>bc|D0~aq{p475l$%5lGj=py++BZhvnW2Jl0=ElfDI#8{&zu>y zx3}Ztog3Fe_qcZJcFQi1J|cw~-AcznK^ru=g{TD#AiWHKn;4)&WQA3u3I+}Yhtiu+bxVeG%XdwauHp|-jX!+=4`ODRiEit zwZ)xF6H48#)CJCBwbAJ<90eQ_Mtywu^nTK4bf96GfGWWed56?hW z7{8GPwrCs{$zyjY&)KK_v%YG%{;IG4)o*|MRo~*3Uta)#oqKy@mcPm?R?tAcANh;q zW09W;zZ$wn1a3S#zp{y8&ZO}QK*k)_f1PiQxeY^R185aXX6OXaAD3^aUrzx<)IAKG z5cdw?W9otgncDofea?e($lW;>fHoKdpv*u0u-=?Ij}5b zMFsl_*s>?|z)IIaVMb~hjWrJOy$5Q#fn^V3{Wlw|0?NK$k^SB>kSoC20wKjV6n$F( z=ay(zfDnS;03cy!@Bn1!d1UcdraXNT<7xq*lwnU>c@o_hyV2tXJf|nv0l1Kkul+p6 z1F)9)*j=}vpBx;)IH1!sdjA4X==+|TO3ilg0{aEmkbda;u8$MXoBKrum{||>k7s%_ zruvPbvCDIU?o5qnSAk_6&ZLA}Ju}BU@T3PbFdk&yGwy(Qbd6wxu8xvSP(S|cZ+vNx zPgKXt2Gp}_OawUBUyrrvStHp~_P+%Ng66*ic*J>KV6ucz3vSXD#wCC<6>oF90NKTO zu|_iiwlb+pZfcEsn-2iIEF1d0E0Z<&KSW2p=gzHqzOW{e{7f$kQY-xPR>Mh3F(#2 zSrB@fh~x1Y^pA-dnci7j4P&uQ+M12pC~)|?Qm1E0c7vSY`mB35Wk86VKyoETm5$3Y z0J(2`<|jVe<^&Yoj_&daGe@~U_j?$BUG}<{1K^yat~Yn>wzy;CKgb-gs6B@{O}sxn z!?AbX<+alx@4q!cHskb7L38jN@1GIyaBz9{{dm~1hb?Xg0!*KA)E^cFgnHU<&1YqE zuU@MjSkwcOR~Ii{ocz4AvlFQL)$927K+g!Gee~vy8^`y7J|-=nlljm4=>4^{$8Bz| z2Md5+cW>PY{p#k<-KGIGX#l? zQ!nq41~!f~eb*fBWi0Ug9MdvY%dtS+!P@pGECv1k@7MASeS-fSkCQ5N+ZMbpmV|I* zCDRl-vHDtiA3)oD#?&du90Y+p>Qz-Q^@ws_&pZB$&N~VK@G=7by7wG<8UTRi&YA74 zVf)mnNi&u8ui$)8kUn`b+_-f+f~zc$u{P($e*qEygy<@D`f&1ri--0`zanyy;+&PyQ>CSQ(CU83Y zO+niR?5Ti%te;Y5<2u>NO;%_PC%tCX?euznB`@4j?3q^0@W-hrITTqs??hI;C(dL z4tKhX1;k&v=V8y$&yBgy{k&lu7tOPmEz@7e_1+c+fV-73+}25Da57dn>%%`%flk;0 zdViI#F9}4lk98b=GzS(E0BN$7;3~nN0%#$xW35(DM7jmn4_zyOj-#(Cfl}q4DtX>? zjaoAeoK>IQNjsTC=7{htf6v}N008KcZyeMY*LJUSERfeRYghN^d!R1?aC>KGcp&QC zdO?xv`(4Plu4L8dbbmTwN)3IeXys$rEh9HF?W^Q#>^GF9srNZgo;DT$ebl^$lD_SW zRW4O}oZA!BfJa|sed-tiMQ_}=HaxihAkN`j0%Tk#etY~llCXI1K{V+*NfACYAGx=I z(ggqQ-~GG8*M9!z+TP-O1bs~)9&nM4L9d1(+=iL@N0Ut;D35C`!vvsv zBhUJMPyI{zrgmJ}WD$@L|9WQ4qvH`!_G|UJlRmp|+wDCM7V8-T3|RWy+&AUdv7kfYizbnJt0RXE2oov4@OGO9NNa*FG-^%=4_V2Nn>6XYTuh&-~u}09NWC zY=5({`g^;Ka=-*Sqk}34PDZ~JP}tklgK*~dY;?|u36=dIJM(9L?boBc*T$(+X`fWg zN&s`&cd)~yZjeDl-49!nL{LD5l3SFu(tAKDt=#|$%MZdH4jZ?{C>vv%Z<~kd#_=2A zJxgBovMk7S{r$w%E0e8aRRZ7@>kb&Q4v_3`=|O4(T%-F_H7 z{}VY6+mEsHu|8sr6{ywag8;A@R8Qb*d*M?sHWU~=Vy^(q-v!x1Hc}F%E(RC?JtPtm zO#W&OvIirxCX6kmSA=d-AORTel%*$|x)sIGKy76lnpIEFxGbDki=`fT`)63L%~b}Nvt=gf^D zvrvMHUk;459DHT#M+UtnqtF~eLkaQW%0w{;V0~m@K7;e2`~+h_PGsFP6qQ1Bb1w;f zcT(#fx;G#SHq6{i<=h@oSkS;yvH&B|(RfVAv**qZo13R%4!r;APsgyTUHkX;huz(2 zCRL8#7-)A&yIxu8f79-hG-=BZP|xnht(9$&xq;qiT-k4ei9lli&-AKnq{iK9be1hr98=(6^S zVTdvSI{tbw0F0R)j|z=jXx%W7MbDXK075wrJu3s?=t5b`D**&JU*ebwR(Z>16ua}o z75LQ0M(}6s`IQBO^4^}a{K|k9+*ys|y%eXW*QJ4=c2D&S9pBfBPrV^aHKi_^ph*V? zBnv{;)yMw)$-M1z#*qizZr;8#oIQPd z!cd~XKN%qj=op5ZckaZ5hwc?4Q1{ZY+NacaLE+dT($z*en|0s){Van7&{ywYHV8m- z<1hfgvcdnUo;Mv#K0#UOIxXkTeHZIzJfP`_E-P}6=nVKe2WMT%pS9>yYVc{!kU`y? zrTY4w_V%uy465s^d+T3hopuY6J>*w{N@$vrQ9Dio!uD){y z06pIv=z!ziu8UjC5yI!u`Fval2@n!TTaYLy+!18fdFzLO#|)WTbofLL(Z8K zRPPsNnL+;w3&339f0ml&5Vn9fV19pGns9&tVCQb^VKMh@9>nyipnuy3VFf6sIp0gi zCu6(GOgk2uYUy2GTUY0y*QHN4>3%5#;A0Zme-$Xx_p%`(gSzzT^^FAoNv4y$24Ga* z$#1P`sq#;IRR%=<@Vmv5NwzFOx_Gu~fOJWHR-i9*7|X2XUiurQhYSG0{m~8eT+q_H zu0TIH7+S}M4fEtl1Ri1Bjee-WuHF-1B-7ik>%iH)E~(?pnKN;&`>Qn;J-DIQJp%M7 z-Jx`E01tky&f&A}L2!m^WApGEb=3V{I!8L4^eVB|$wuILbo_twcmB@sTmR^nVuboE z*4Xenhsmx7ry$nLB2Ds zb6qzW5mj=!Namy3G6&#d&sT|ri|5Zxf~q%f3mBG+4y)HI=z$&p&`*?Q00Pyl2_sY2RI>kFr}JPv z@~p{A2kKB7rj@izHi3{EChjghlj0z9402_#_RrBhs4{yF#| z=&KF7xB5P)U}_SH%4%aX6|>e4#SD=273pwSzp!!Taj6ikuWzIv4?3qRTVQ1g1X{=q z^PO;VUbt|f(PF&+sRRMY34i0-|IgmLHdmG<*I@_MKmjP!qwCe(oZ;v=o@8UbkK52QpN9X|do=Rb4w@QRK#kh9@BtbkKm`b& zF8$HhQo!Ylv#*!BmkQUC-h2Ce7mX@4BTP2#=QIjpiYaehnZQj8%XbyfKP!jpw$DJIRf+R)lWaJJM0ek0M3u+FP;xtum%I&odK=w@wKxzx2Se5Wgs2a zJ5I`@cW>;h{pszyqUeJhU>9^j2`k0)`GtG%xaN`df}BZ(0Og|MiIb?ptW2SGG{s>k88t2`s^`kgV08-WOgoQ5ZnOH??~nyORwU&% zuwbbtzbaNJ_fgg;7nuTL?PWmMr@Bny;8~Xks04DEtB*gt%^lv3?4FvEHzx!=@t(E`OxN#049gNsE=Nb-_H6`9yxmots zeo*6Yk*$NWouNXoo@hK?P`I|3p_9Sg@)kpvbeMZQNqTw^@D53jIMDG^35=fvlQ1te z{;SfHO2>TX(0-`(DW8-6ABsd6lC{sc7v}!gyJHT6!1`n$0p~k@7NEt*T}gohrYH`N z4zggN4p6RBvCMg;b5RwtHAQh&*beWz{kY}%t?%I-805LGX^7JD_`Z%+?JR7KQ(oIB zk9nd0Y22x;!(5L%clb{2?y2i`YK`B8=l|PZ|Mgv{=4c&p_8bS@Z*R1BT@%-W(kK^Q zRe0j-coPswd4_A#(qK!wx8dQFLT)MZHymZi24LUIexCOvn{&xY!WEkC3_~hYlxMo5 zOo2*|-_VheO+}fMyw0%?YY&>?!JTSIC99tQw&q%ZgN*K)D`?#LS$4Y{kO2VuhwnQJ z0aN*?hbYm!?cxRnNW3WPxBmvA#COM4y|y%bK%5*k8B@=B-z4 zzqLC`POpGqKg#>CklbH00HDY+pFVYuA3f}LVoh_8dG&VRY)$LW4fQ|`4bRCf6QYbQ z>F#;1CLkt30s512UcOV~`;6nXdBnM@4i*Ji<#hTAR@J#`dz*9}K}YJy!SJF4$GRiU zJr6?NW*o5tvdcbRd<+J6|Ar1cg^@FKon$_G9N{FdV$}5> z-^#BE0AOYPpy=sEn;AuKQ$VW~UKA7&qs)~rLD^(NNsokpfP}x{rG&g7H1Tp_b%+g@ zgUAa4X=;2@;Sv-y`gV!w6>aWC1qwoXPWh(A`g6l11*=_fJ{g{+P!VBbaME#7Zw4^H z1TSvVb|Ley0-nFecP&(wJYY7lQA1hlpa8!ZI>iNkqAf%=^6=Kf0lz~abfLgQ4)CBi zS{DO4c#IeaO(5=tUp`TW)6O`xE`%X?>sdeE+vtAy;Sb8tgU&hAfR0Vr8V!H;#OE5X zdGsT1ddzvh4gmzU{C!dOwaOrZDTR$5Vl`!yu8*vb%?g>ESF5jTx=7}&#uaVX5LhtG zdCX(81~j#$4>w~aWPN>Gv!$G=nuJt&-s&=7s`A@CF{B(JAkna7{WMM7z`lmLONxr z`n79uZfE7`WoJJC0CV;6l*h-)oMZUU@55lv{xHSs$B*6N5frmN_R0{U@*kAAjOEC5 z=ui6|icy<4UYaT}t`r0?0|21Le{K7m{>*(vSs#X4n@^EI_XGZ}2Id7Bniu_Kg!eT( zG}`9BsSKsJ3=L&eRw_`4cP|>~k-x^{h2yHJuBgG1^RD)(?tvU^_K_ju>y z9RP}F8rqpf?QXG*u~*Xqd;r5W=N`+=W2ko$O{0|k>=zx6fl?)6^J@8QZw4Q*eC|!m zhek~(JlPLwc+d6EXHK3MET{H;D=piHpT;N=o=xV}S(%HuFKbHC+FHo-jDQ1OD;mBb z=d1H1ui>$0TJB}{>f7@E*8%`II65+2PCsvZY9&?RQx^rfMU{*+l-WEDPbJP-?#xhL z($lFti#?9}C}oqPFQdLn4ESWUwD}Yj9-P}DpP9EGjqzTwflR2h$wU3z;_NEtlPEq0 zRI|bWz&_{?B&noUxP@4|EtC6aRF5eDfExXk6{4&cVTzz9+oG-;#{1HIS&-U*52gq&i zr1tR~3~A1&X1Z+LMb75hZcfjd)ul^c0Ih0`xJo^TvMFW1RXF`Gq+}fNXnXw{-yl^^PHdxWoe+CwzIoi z#)#|JK*3Q*jtQABtj=KC3!n$)1pyfN9_4c0m9#;l55@|DD^M>oZ=hbt2W0|ufuGC^ z@4SEi-oZjUJEnI~Pz3sihEF)qL4R&69u_XqK`#WmPzT^P9%p>EDHLI}sAI6Uh4GVn z9OoAqg;ZuY{fKOwW@iaom#-ra{ZV7?$$K)_yZzJ<6%jIs1(iJ^yrI8)hOm%B``hnd zuS14@QL%tBQ~Ig*vvOYvdu9RB7sqMQ4N^Zw5lznVEL)1%uI$OaU51W8yy)$F%E7@- zN06MYnOG~B z4>We3DNfBRDQNT|fLwg+PESvY;AYj1f>hbU@2QNTP{<2K?WZe_V{cs?$kef}Kh@XPOCngV?P^-p$2f&%Zu8H{95ba;GeUW!fNkBhm>iy>flPQ6Jv z&E-=!(3^Y|mrv4fnGq_C@JOqMbDqUc{qAxfz3K=i(7&_6%e-YwhC#VKu+rq3h>=T$ z5ZR$fvu6q)q4sAV^)i~XKq-)u7iGxBE*mZaFes~gU0qJ~3yzN+fwqtrhw^#M=Y+Vv z>RJ9j{P7=8W|`+u>jgFb*F64f?{OdEJUBQw>`sI#l!_DnRLXz#lHp|#`9bN0Pq`qT zUo3bquKUOT@;m#Pjj8O5xqYjBcYJbEWLmwTbFJBY7y9_> zyeeF0QMUvpu<|MZ19})0s#P+C#Qp%#g(~E!5NG`f(6RT!yK4aEN#FzX7!t6IR|_C% zSA^L<(RJN}ot@G}_)h7C@c@Qx1?O-~YW-gutD^9TQuw#tAE+3Gl9tBgoR=y%^cjEm zyJv(|5iefWlWkzS(jR0%k-pM8YddpW&{yVxc@G|c9|}lfY;Ll?%xliQOV@$E$3DcG zJXU@lug+jSC{;M3uV+uiuR8E?aCDs(zBMnp3>(E$Y#(4_~6!g4dxa-3~_MtJ=k;~jqxZhEa7C(!k zpNfFkkLiR$9h=ef!}}_9cdSEEcE(&XSt_VkEh~O6allFSU)B;s!Gx2L&Er0ZOx@#u za3Cdmnzix&R;_FW0APN+KRW4-PF=R>=aCywZO(|Nt2Tt|LHF2NTCk?#Qyh!T1<#$D zFdql;!AbuQrm(n6n6WQpI~bcu8(-FJtP%Wx0Ux>yGuGeVDpdKXE96EP{gEHmG-MhW z2cbJAML!IyNN3@t0zi!VAq}39l?w9x&h7&Ma$2`H&ZWMO_ld%t&Lmc$Q=XNJU zdC=>tq1BiL?r)X6u}2{t7!uGQV8*rnJM*wwURKv_-G>qMgZ;Enx8L0Bz}V&T9la?( zyD>k&;iwDhgg(L@iTAU;hYziv@y}Tqd|z>_6G-z*xdTyU<5F~p`UQqBj5u+sqaS_7;6V~ zoOLjMdl-t&zYB1H8K%SW4?2AG6`mJnm6MJ!GGQ%#ZbmwPH*hU`Ys& z1jAO?*uYVMEDvGRAy|N+FR&JzslvzFo`-Boumt9e%~!Cz33CYQO~wnJ%_x`56F7b} ztcA<#7?*oChGfOMzq4a~1-Te$*q^*dWm%fvbNpCO%CgGRrwj^eJ1hE*#va>}vuiSb zkx9jgmcT1J!z-Zx`22^LF9v`C=rn$M`}S6yTR)r1Ovy{~yqwqW*6!zZFg6v#CRv<9 zhAXU@a^7=(WHGMR=L8+OV@t>klt;r^+Ui05M+qO`xMy2lSz3jwg|{G0>;_~3ZOMarK=qQ1v@F*SjG#m_gTEbcLWN=q7FUGhJt{6;;DPemnE@OvBD5_O zwxW%8xCDEFPxL@?h!H-6H2jctMKTWvZ|^t7^WVGG>E3v0Lt9_Gcu}Zye)+3km9A}h z>0Pt*L-($~i-?|KT%FLy*{egaEjAuRA(E=?;(H zyHY%i{PZZJg4~o3CN#T|9r-ZkWHC;C!bLy4>P4uh^37$9h{qKTME?8^3JqTRDd5wn z%X-;x$3crUqy#U<$MB5d<=lk)a`}Y^3BjgeL^OavZ=mnx3J>GNOTEgRP`rEfgL0Qh z>M#TlV2kGkd0b=>A1eb-Bw0yi$(xwgEfBz%0Z{9;is2vctMUK%^lP>q^lkqPGZH7I(K zw|f59WM|E978pRhM6&S`b%a8VH20*4q}*)j1-;6(2E|~1cW?%A!PaB|03ZNKL_t&x zu2}<3bNyB(xq`h3M6mmvgzljJ14_fq2=9US2>f9ENc-Q*_hZ1|em%F0+WBswcM$xJ zd36G%ZKCVWN<7^I`8&H}pePhWA@{>U-^=qcFoo?ap{yxNk&O+b-bcRX zpAa=#4!8J4waP<3m7AKn>vE(AG6TTL=?4SF6o#(kp`t7RO)!9ggq>N-_VO_LYbD^0@w?K6+r^FM+Z2^43oi7W-?)b1z@-|fB@puhgUeBV=cnaOT#YbGs9z| zT?G6pnWuu9v&Wgo8k^<;kLf{rUOMi@--uHcvwT9basYN2B1Ly*nRr!jJh=T z63h)i1lfFH*w=R8cMq5AGAQ~7vOcCJ`UvAmpaaH;j(V_FVBAqZJVzZ2gpi_40qB5x zn6ve|F&J}-jKTy)P>+xF$dBXW@&bVD2$k&jM}owW2K~Ri4deK!fdSCxC~RJ#2-@b}s`&IF=q{}N4p4ER2-cRj8TsPQ)3Ypt)q&@U0nsiTxPm?0>Js1=f-^Xt zSXaAyd$zuKKf|0N(|`jdK9qRbs3+Gt&pCp*QODEc0c(>grx@r zCs;vpmkAigcuwP(&8{4B1f!uF`hN3GCq<#@;}i2|#7)0t_~-li)yo0} zT5G#i&N90ZXpDFX;CuV~`$f=SCa-ncpGOY>@%ru4r-R1g!bjlO&!ZQu0ssI$7oR?LZ{EIJxD-IqK>9ff@9Is93o{iUNUNYo z_l!ZWrB}qPq>QA-o_tAwOsH`hNexPh!GT->q4Bd{Y~0JiFB2A93?Bb+ zNzWG&8rgWcA?SeLvwmts(|-5g`xs*`@40|Z;DIqz@p2QDHgBFe(CaInwiy7hjI2fD z|6GrMR$Yz%_znO7^z*^{_cl)mG|7fh>%)joNqL#^6;1ibn4~qYd?>EuQ>$}k0%-Nc z7zp6+fAcq^BcvBrO*q!?^gf~oT+stC=3QL;c~@|mwVzDcC|TxfDATi1mG$D?jz-eG z2M_v7e;Bx_IKVr~41h&|zdz8+D3JMv#1FO(u3H1ah@zn|kEoZdc>mLTmP&G~Zz#E}S3+g#+2L|q(c5V|sRK-Uw$ialVLjkDUU~G^FJ46t5CEWi z-aq{WFmMlIQG-&RBN-@AKmk|}!RAV1Kf|0N51n(k8&ICNxZXk8PFh?`AFN@VO0Mtz zY-a>%g_V|^>!+;iknRFmOj7mV@!h>EW+{ zKI|O~0bs@JhMn%F?r_nkAX_58QMRv^zQ@YIy$XAY*sY5Epv-Dv6wPM{fZb0X4UL}f z4i4@9w*K6b9-vs30F-uy3qZ5fcAx`ryCUaA3CE-N_V}Hl^70*rY#|ELBbc9Oq%XIS z8KXRPLcnvCIS3BW^MLEsbaS!4DqtS(+us}EjO3XT&(bp(iII+Hj>*eOKf-P@**#c% zUOXL!(Z22(U;qFVa-ARm8ziGD_2%%f;~-Me!@u#|P*m8U0u@3*%njAOGDI&pye#ET z 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≀L@JC(<1H8;3P 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

sXxA>cDyi}*TON{TKvEX5D`A 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

SXW{kpwx6A|8WSHha$4>02;b+db@-XQL}Pw* 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≪Ria_Jll8 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≈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%0AB^nSLU4eeBXQS)DO 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%0DCdH%v588 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�jbj;4|lp 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%0D8)E9+A$zgIDsY9?`Fj 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
    ZUM%6UvNF*sGkK>0!#A%&I=Uv4psjy}`7yx} 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 y)i0hfI~YSHKq_J@4K>VyIE9gNc!4}mk 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२-76QNvG3%jjbRhstkMA%O0RGlb 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%0D_0D;C#@8|wd1nDS*ZvniQE(n*ugyXk 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

    3G=i&MV!b@$%{cf~j-J+)mGylk!AHW9 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

    (tW?R5tl^HBsfPmUe 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%0Aps^YOPDa$t33F4Dx;tpB6(;eQ|eV#r)Xi6 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

    %%vYXNgw2-0kGEqs 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%0D#3EmuujxRRoS;IXVu471p2ujz5stQm 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

    J^{Arn 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�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ú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�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�NAl&$XSs%ZYpneKl&RXNv>vS~{9Pv~`jT{LaL- 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

    ya3 zIHR6ZC*Pvu_=tMoi*_|r?-y-b5&Sen{av-NOQZEe9R27?uWw3J^_K3(C`ilOz(sbd z>0-~NSJQ4i4`sh>xof>$fl#qn*7g%GE|#J3Gvo)(65{nOa4Oct2m==4hOTOnXEE!s zdMAel#IdQ=!wl8i$C{;W?~zeDK%W;k<`WjX%=*PEfjUi3@AhyMDK3&&+LHWYOLzFe zTk(>bwmu)i;gs%hxaO!!ViaN6NPW+Wx$$*vV%p;No2uqU%zm6acoQ0Tc>YMk zmGm4<%KrF~|4QHlqoAD)WZ5IU@o)T{G1xL#!{J2=Ay_T|wC>>Vh}(R3{q~zyicGxnObRMUS8vac=nYln2!`M&=@x|POzqL@Z2DNj#p6-mP6}YPY4KcJ zB37voa@WWMNs2I3M98P&>8fif{^RBg9FHAbQ0fkE&Vj9zm|z+XJ#}S{3bp?6nMTr* zE6*;qn=&ne3%o<#e6)u1yOct8k-jUKKQSprjac=hYA>KH`_iYQjvG*vQLWeZ@Rh5A z?!+DF_X*8G8~PqD9y~2&;%$l+e&_v)(s|D*c)ame4}J@=O7in?*|IoU`$zeEScH8} zeH$Qym1B{S^Bk@?}YRB|?pqj>Mwt-}?Kme0*{|zjUN~O9+GT8~9s)OsN3g zi5Sr0#R^3D>BfcawHOv8&+HpKpv{xo7@WPBkS2TqxxpZLGjy7gkmds>n|F~rM z-{E7)E9>~1E~uOAcPrP}*WRkcX8vx~bLCE>5lV;c(Q>v!3xQ+&vJ5cY+Nu|tw5%`& ze|>S|f%Pe}h1!5`8R}mXxW>Aw7Fz8CAvlqdg|$<7&)M-3+b-~O^xc558dKr@7vS^n zvv38}l`HmE6L?m}@85m~hVb_iL#mlrEJ%T-KV;tYLrRn5P`qFxi)|bezTNIvpidVJ54%V74m39~Y z)ApQ-i5#Gxt{W#%N@^Om8h<%P?{$lfW#&>M_%8CO7&pwsqfTfL@U-L`t7VM5*LO6z zkwj@jFzKVnj;VIq@p{EHunnhW^7R=Xw>L9$RCQy~L~q12nglv`1&Dzk8437X&s;&t z8g(^<%s_;#7}t9k@XXk&NHKPz7T`dbBU`8i5NA915wozX)8aUs6^MzcFbrXTkPk-q z|LsS!GxH(C-wzB8fM||a!0}0-uC4@JMaxvh92b2GI3UhDDoh5X{F<&@+!%`p5y2h1 zvk|vbkn1x2J`?(4!UnSb@UX~r2q_%jActWOV}^~6Ln{~OPP=zEX(_YJfdbgV{iNg7 zj3XHp#^a#5@oOc4wW9!s!)XM#1YQm{{X&TVtHtQ$%s^{ibVEp0qFWR)AZW?_zaLO=y^XS3ybl9f3xyncPJ55e-Z0yGFzt;GI=cOH$ zOP10*)<=Cu`!UoccuVzId+l+)OEYUTHrDLx9m$HfA|7Pz#6<+V0=h8FR@D<;IY1fI*@z)TCU2s&?BhtVl_z|Sh0FNf(oy1XnWz~r(M26r@?sLbn((sn@@gpKrr{X1IKFlJ}5c}b4t5D64 zs&I$$;l1jyLJ}Opij`5F5TN>D<-a4D4tzzU@_yF&Vl>m^vkFdMV`J1febydUXd!|e zVtucp0A|{!uPye^{!7D&HEutp*S@2}`?GoUhr2D6|2qlKarQGDBL0ebTUZFm#~^_J zD>t<<#SSc3u^oXdYP~~cT;6hCSiGI2-a@HRrHe)Z5vO?Mk$D_aNnQsb`%q@x z5sIgp4+qv5bgM?uSbAxW+B!Y#Eup=|$_{MP8%FQYWr2H~)wjY+t!S?huknr!l1(yh zG6v3ne0ph2fPmg{|5I8(%db&;@?&y7;$vxJ)pZp(Fsi+CE~q-1*mmkZ-*`45(tI=q80*{V5}&}^%sl1A*^xSRA+lM}pTBAiGAQwse^ZwE zC-T-WOP1e%^SW>@z+KW@V~n)?JLwFfN{4oj2fsCvXE4hSgxB@`Rld~Jg#=tm)HYQ^ z@EtDk^Fm2zrwF(&<~KXwIPddw=(lFm-#5y81D_C2_tU%ufBkEbKD2JS`$EuSl2({y z(E!o@%cfDtIF*|AW&3go7q|~Xcd7{V?IP-r<;0XRe2!8-YdSNQXiBp25b9AntMeeg z`+SD5aRP{iOSzfVrijsGD!o|VPGo~^#KeBrrz3O%OA*t2nUE7bqKm1m%)OQeD!`(M zU5``2-ewF<75md*x@}3hB=eU3R=2|&qSUQ7i_4q%9qU(VIBMT~0p!u!0-OFeJ49OA z4{+T-^iJogs|5B)D1g)|o$GGzsko+s?%=afgx{t7$LT9^j99 z(33Nfprm(LZmRj=9O|N`tWplH%*E^xx4zKI$Zo)$`V2ne_mfQlw7I`n7v=tc3FrTR zOSs-i>T~*;H>uE@pvCvsZ*;LT=TBQ1&itr*x=?t_19u@_Y7&N^l*Zv@Trrf8%r%Mk zgkh-sBxI$}up|`+(*+U?d>8QW%tVJCzjB3H4jW1x#82Kg%!2qXHm(X!|ta=QPl7M1X)GG-s7-fvXbR^CcHkcOw%H1a@!62PbJ;F)^PNB zTXrmYYJ>NS)?E0&^`DpB_c2eF*n#}zY%v5@rR}RK7@*=NYM(B)rbvy2Mg17B-E`|N zQTN`mM&4pS0}_+%NH@E>8a@ zlS3rETG-$&gy8j=cnuyOS#2Kk*F{Ss($&-E1aZtZT7XoEVLN6cBV^=(_5ScK3?w>M zN9A-)pPY;mnD#^tX2gNe^IDU$o!~X#hue1xL-!Po#}y}dWgb@HfSOM?(f3w z85nieJlska+4nR8gFgkbl=6MmKChybx--n!sZ3=&So=XZbx`H%cLER*SEJn_cv1@F zN0{I=@?RB{Y8@@M(ZPzn6`P29;?sN z5+T?Acf(?~zxd)XQi_Ihc#fEOf~3xRYs=Ah+=*0bA;$y~TVB?pcRR3TgcL6}ZwON( z^N0Z~+z!SEWHX#B%6DikSus1mC{d@QO2w3&A5C)M26MI)4dhhX?v5A}Eg9DeCTRi} zX3At6Hp0rn*^$`qHG^i7m}>t37LW>Ifzw_r+vIPrU+)6!`-lIg9F?5d7HMzR zqv(jQG)>N$e7W_3l57F;7BmyaE;H3~exQi&9+=6}C0=3G^FH7l+7J&@4zu!mpf{ms z9u;7Wd*6s-NHLkcjx0#Ysx$fwjsi@Usz%LDDwllN>YmzY#*{Iiv5zL*%jzr>l9zL6 z_K}d&)orFw0zdeXAHg!UYVZ;1A7|h;(}}`a_lW5b3{2+&j5(o@n;+bz9UQRxZYiAz z3_X{>2?|{Q&zB%dB2tt1C=*`|zynGWA3Tmbdcj!UJvp`}Vjg6Mc#Q}SV7Vpwj0m5z z@Zr-vD+Jx%%=_H(6$L)}K8XG~D2qo;q1^G`UA^HfCQwr9zpZ{T3U%SX+%RGFexC@4LuhAJLN`Heha9Kw1u!)a-Z zpdRzbtZ{a`2NTZR+bZXWdo;YTm2eVAjB=v5*(E(u;8cx}U1{F!75b(;;C;=@!P|=X zlTp754^^rS$aX6WdwBUV{g74E(KdPGAj0qWM7fJeMi=-Ew3t#>{60+*sSB0Ach#F zT>isECn2=b4LgtKSuSX}sYmtbKud+e4A^lR`jn8cr;W+>oHx@FaWD_Y?JTG z-zo5eRg8Q71mEs}7?JHj4owtfO7JGEZ?fKt`x9v2w)#>mJ@7tAr2mhF)bLAz{53*4 zxjN6!q312R=?jMhBF^#LdHOvV4x*w5>D2{V7opvF?&x|`JRMJ^$c&Y~BXLR$&6{1X z7NfzAAv9RAhsmZw2j?(%SoQCg=I3P-9bmh=r8O|NkYFv%x3gIA5)URtlZjdKg#*K^ zZ8F{c^dub|S@LSj5DBC9Ax!PVe(uIg2IYBPCs0rDoJt+d|C|WX^uBr5#8KIiN-JMa z@V{bWP z37s%NnVO=+eOid?^#X8KTzh}o+)t#QAKF{x3`OD-A~b4=I(O)Lz(xX zlmx26s<6Pv)*&WdS^IN1rND*D^Pe6{!h{Cj0;Gp=2MfRn9Vg{v1ZtwJyA6O+y3!=P z(SOx!vQ-_>J%0a-CJbM~GYU=3>sR4!Hy#`RggZ=sgr%ntlg~T6VgEXt`A9&RROxIy z#VBq7U}rkZe^zA#Uo^>&`gQy%BMV>veH&|ksZ%?sQ4tDNaLm{SN?J*KiEtR+#C*j! zl&~LUWwy@mT%KZrv>FC)cJHv|Nr92&b1M{? zGT*T|ciPa*5&!yzzVL2AD78~;3r$+ z2e!YlfepkD%)tdSmcjCP>wKlhZc=B#@c9?JLgziRKCfwwoUJD8tu|I}F0}I3m8IN) z)v~MiK-+990_%jQBRb4(aEarkPJ^6eqp+KN_&xjY}EpX~vXL{G29|L4U z&azFrP|EiA-53Rvf5XN@+@-}O@l07B2#|*$3yz`$y9<&QlG_y8rNQ1DzcF}zJ|H(m ziE%XQcm``(%Ud}FYiq{o90W*dd4G>DK&wZ$a#n-~U$i%&F8VrpN`IQrDIjJM&rT=+ zp=_ln{b(vZ9nlRs$YcXNX)fjlZ4?W*viHI{R+1uwSjDxjy7tO2h_m-YZ|5gPSL8X6 zOh4`9F!$OxhS#eosE&w;3xIZX&Bx3qz*nRG{X24}s4eG>v=celJ2V8} z8)MZNP5Kja{|8wEi$cGdu8_cb;izwUu2wv1XMWwpg`s+p6XAqlsOQs(e#%%;g~K+%y?V=_#rZ} z;BlVP{42E65xVf*^9dR*;4PGem@AL1*e~bJt1rj@=)e%jpqH9AY1wGoaB)HsJ5oa5WN1*51=@#Trrw2KZT7@%fqkU06 z$}>a$Ai9;+f+UX&NC^BOpT5dtr)}^w-J{emTDRAYDC1_Ahkun=Nh6PFMUdDYFKd({ zMvMw~R*%&{eM0((a9Y~ZIt~s{6^|O^YeN(+7nCft&sRcTv4>UN4vp*=@PeuzLdM?y z_N-Wg29jFfH(}CeBO;Yh>lIcAY^coT(1-qBt|)DNCI|Q}Xw?{wsvsP%5OUS+FZtOi z^uBfouFX~(*;GYgaS_YG0={x*KDCS_1<$TZ%SuhLTvSF5TUa?>TJv3VL&FGZADPTTAPn>e6suPIn+c*5#!cO_6fa?qmD9yib*UwQweMh4DH?ZfOn* zFaStO1U<Z_#J zCvHndOf7yyw1fXRXxI?b)91zp{MMh}LsC;yh)f6FmYgVZe?JTmM3Yh`gyBN@Xe({V z^V*IPEijQ_Dy(^*S^_@>J5hiW2#`V%kFEbYUBn7-t;)vkn>qN?Uy(JdTN{P%KDep% z8@qZnc&4yR2C!NF9d;@-F?0BZ2b)NDM$+@}+$GY&5LCkRi#hkp zk9`Y2m`O)IPguEu1hx$W`Q^u$5T{w+2?*=Ul!Gx}B1biKk4Qblkd_neKf2SPDVa{d z1Vug;L~usl=?i3~&Bd;KjZHXKU!{3ad`v6UVBLT=0bW;j7?S6zrlLlsyH`njrtw@E z7i@{{4;Yz89c_5Ho^HRdJ_eRA(yyjTnQ9!K6ytPsYnI}dN6{0phr55(Mg{xcAW=W* z1R@lSMQx^bpm)xQ88Tt?NyLcgI?{QgH|MB<39kfL>Tlw!mJ7ZV$?AxMi4-zmIo2!R z-s!pmSqS5G62)h!I2sz5<6u?SFf~4U(dbyR@pzFNZl0;eKKqWKxLhAOBy94WrfnC| z7c+j=v&YKJ5anO<4golJrP206YIo*r%zR&e2PA&&8u#0?@|8z~-o59X20r*azQnJb^nM|%a>%|;tzXbaIVyT(}SQ9r;@A+V8b(ntV-b7GVM0T-TgMW_v++sP9 z?}yeQe=%^h<(F6YT+We9y9#}SI#S0(?GvIHUH@8q82@DV3)q^*wM7^r*lxEPKJXG* zrhEQ&RChHj!`O*EB1{Q(lqWhmvh5cdc5R@}@eE#tk_-y%8U^M>=CX|oqIIDP?H9}E zNj@GuaCGGQCmj6WOzL78S@lEgSp7l9>5CsnE}Xmbr1EBI?E`jDbq{4TU%pc|dC1CJ zcsBWa@p3_am?|JD(m$!%e^Tn1S!ql8{NM$F60Q*bANw@Q2EJSCui?0voeoi@SgvQW z1J$|do{)+$ky&WGDPD^ni884xq(>-IaW8-F$LDTr)Nyh7bje9cjr}wL>UBIk+H6jG zK%&v)$X6`_i)AW&n{%3IEKqF(d}OP9%e_WD;XqhxC9CfyKQY5;B3i%0wzl}y>g}2W zyziT{hayw<7~Klhfbfx^1g&#E#l*V4y}|wX~u>S za2&h$)X@NbZE`HN&b}5XTIClq^?tZ``e#DEpecpN;RLPIrTI5D0@#dOhL;WD=jMOI zUEr(DMo!@bJ1#$?!#AjoR231m;eeXv{e_-8-WLU0)E5GXtiMIvD?-iz8*pXS`_*;c zLR(YX%F%b33}PUKidlgkU)idLi$3!}veKm8T`DtYVJmpa2In0C1!N2tT%FbdX4JI` z$%)|od@mOR`0;fd&iM8Irm~9f--myGbTREs?eY)@2SWT+8Ik%%h*X1za43wE5Oif4 zYB$62cMvMCxlHT3eh!i!JA>dVma(_}J3ie}Z1$9N_E=@6`~=ABS;VS21>@~?(IlDz zka!H6!B5i1pPUqqT2o*nI9*{7dRZkeQ`_f#J-nzd*E|u%@S% zoy^OICv-Ls@U)4Xey8^n*{T`WElK%{oXshsbZifc zBGp_|PnC$iD`;{4O5}G(pfw)(#7-gOl+Etcr$^kZflvn*msAT2j&-2j>qK&gL$-4k zo~)Zk9PX6)=_h+jV(EZNZGJ3^I(P&h?4GJ{0)nf0eyJG%L^ys@`*JF)U|H~I8v(qE z#tE+@5fg3bD;<#b-dfAP=-DQ6nv1Q2)dR|`cD(LSTmMM}f2qYX!HK{o3|4STtFY!% z{T)>_{+R*Ly{Z-zSym7uDnF^GVE_`Un;gU*CGR*xxcI2-+~!b0NvT{fjzIHgWX^v~ zu`>N%x6&21;5+o%BUAe}Z5?@1lSSRFjn{03^5bV`1U0WF#X6SUSIDa3yL0vWiGpvj zLFc#xtC;%>$0aN)^kS!X?#Gneo*zb}@h&8#sNMGZreH5kc5V{q*39b`vFShl9V6q< zm}_<>V&`Jy8*LZ6pvl?IF@c#{k*T)⁣JMt+md%`#wMRr{u&8ITp6v@gjnXgFZ{w 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%0DZgu#tVc;R%X@ZQKL!{x@1JwKPl2 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 K^{JAAzyA*$+x7ea literal 0 HcmV?d00001 diff --git a/packages/model-viewer/dist/model-viewer-module.js b/packages/model-viewer/dist/model-viewer-module.js new file mode 100644 index 0000000..c98573b --- /dev/null +++ b/packages/model-viewer/dist/model-viewer-module.js @@ -0,0 +1,29271 @@ +import { NeutralToneMapping, ACESFilmicToneMapping, AgXToneMapping, ReinhardToneMapping, CineonToneMapping, LinearToneMapping, NoToneMapping, Loader, FileLoader, SRGBColorSpace, LinearSRGBColorSpace, BufferGeometry, BufferAttribute, Color, ColorManagement, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, LoaderUtils, MeshPhysicalMaterial, Vector2, SpotLight, PointLight, DirectionalLight, Matrix4, Vector3, Quaternion, InstancedMesh, InstancedBufferAttribute, Object3D, TextureLoader, ImageBitmapLoader, InterleavedBuffer, InterleavedBufferAttribute, LinearMipmapLinearFilter, NearestMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapNearestFilter, LinearFilter, NearestFilter, RepeatWrapping, MirroredRepeatWrapping, ClampToEdgeWrapping, PointsMaterial, Material as Material$1, LineBasicMaterial, MeshStandardMaterial, DoubleSide, MeshBasicMaterial, PropertyBinding, SkinnedMesh, Mesh, LineSegments, Line, LineLoop, Points, Group, PerspectiveCamera, MathUtils, OrthographicCamera, Skeleton, AnimationClip, Bone, InterpolateDiscrete, InterpolateLinear, Texture as Texture$1, VectorKeyframeTrack, NumberKeyframeTrack, QuaternionKeyframeTrack, FrontSide, Interpolant, Box3, Sphere, CompressedCubeTexture, CompressedArrayTexture, CompressedTexture, NoColorSpace, RGBA_ASTC_6x6_Format, RGBA_ASTC_4x4_Format, RedFormat, RGFormat, RGBAFormat, UnsignedByteType, HalfFloatType, FloatType, DataTexture, Data3DTexture, RGBA_S3TC_DXT1_Format, RGB_PVRTC_4BPPV1_Format, RGB_ETC2_Format, RGB_ETC1_Format, RGBA_S3TC_DXT5_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_ETC2_EAC_Format, RGBA_BPTC_Format, RGB_BPTC_UNSIGNED_Format, EventDispatcher, REVISION, Source, Scene, LightProbe, WebGLCubeRenderTarget, AdditiveBlending, NormalBlending, Float32BufferAttribute, PlaneGeometry, BoxGeometry, Spherical, Matrix3, Euler, ShapeGeometry, Shape, CanvasTexture, WebGLRenderTarget, UVMapping, WebGLRenderer, ShaderMaterial, IntType, ShortType, ByteType, UnsignedIntType, LoadingManager, LinearMipMapLinearFilter, NoBlending, DataTextureLoader, DataUtils, BackSide, EquirectangularReflectionMapping, CubeCamera, VideoTexture, SphereGeometry, Triangle, MeshDepthMaterial, Raycaster, AnimationMixer, LoopPingPong, LoopRepeat, LoopOnce } from 'three'; +export { CanvasTexture, FileLoader, Loader, NearestFilter } from 'three'; + +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +const NODE_MODE = false; +// Allows minifiers to rename references to globalThis +const global$2 = globalThis; +/** + * Whether the current browser supports `adoptedStyleSheets`. + */ +const supportsAdoptingStyleSheets = global$2.ShadowRoot && + (global$2.ShadyCSS === undefined || global$2.ShadyCSS.nativeShadow) && + 'adoptedStyleSheets' in Document.prototype && + 'replace' in CSSStyleSheet.prototype; +const constructionToken = Symbol(); +const cssTagCache = new WeakMap(); +/** + * A container for a string of CSS text, that may be used to create a CSSStyleSheet. + * + * CSSResult is the return value of `css`-tagged template literals and + * `unsafeCSS()`. In order to ensure that CSSResults are only created via the + * `css` tag and `unsafeCSS()`, CSSResult cannot be constructed directly. + */ +class CSSResult { + constructor(cssText, strings, safeToken) { + // This property needs to remain unminified. + this['_$cssResult$'] = true; + if (safeToken !== constructionToken) { + throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.'); + } + this.cssText = cssText; + this._strings = strings; + } + // This is a getter so that it's lazy. In practice, this means stylesheets + // are not created until the first element instance is made. + get styleSheet() { + // If `supportsAdoptingStyleSheets` is true then we assume CSSStyleSheet is + // constructable. + let styleSheet = this._styleSheet; + const strings = this._strings; + if (supportsAdoptingStyleSheets && styleSheet === undefined) { + const cacheable = strings !== undefined && strings.length === 1; + if (cacheable) { + styleSheet = cssTagCache.get(strings); + } + if (styleSheet === undefined) { + (this._styleSheet = styleSheet = new CSSStyleSheet()).replaceSync(this.cssText); + if (cacheable) { + cssTagCache.set(strings, styleSheet); + } + } + } + return styleSheet; + } + toString() { + return this.cssText; + } +} +/** + * Wrap a value for interpolation in a {@linkcode css} tagged template literal. + * + * This is unsafe because untrusted CSS text can be used to phone home + * or exfiltrate data to an attacker controlled site. Take care to only use + * this with trusted input. + */ +const unsafeCSS = (value) => new CSSResult(typeof value === 'string' ? value : String(value), undefined, constructionToken); +/** + * Applies the given styles to a `shadowRoot`. When Shadow DOM is + * available but `adoptedStyleSheets` is not, styles are appended to the + * `shadowRoot` to [mimic spec behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets). + * Note, when shimming is used, any styles that are subsequently placed into + * the shadowRoot should be placed *before* any shimmed adopted styles. This + * will match spec behavior that gives adopted sheets precedence over styles in + * shadowRoot. + */ +const adoptStyles = (renderRoot, styles) => { + if (supportsAdoptingStyleSheets) { + renderRoot.adoptedStyleSheets = styles.map((s) => s instanceof CSSStyleSheet ? s : s.styleSheet); + } + else { + for (const s of styles) { + const style = document.createElement('style'); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const nonce = global$2['litNonce']; + if (nonce !== undefined) { + style.setAttribute('nonce', nonce); + } + style.textContent = s.cssText; + renderRoot.appendChild(style); + } + } +}; +const cssResultFromStyleSheet = (sheet) => { + let cssText = ''; + for (const rule of sheet.cssRules) { + cssText += rule.cssText; + } + return unsafeCSS(cssText); +}; +const getCompatibleStyle = supportsAdoptingStyleSheets || + (NODE_MODE) + ? (s) => s + : (s) => s instanceof CSSStyleSheet ? cssResultFromStyleSheet(s) : s; + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +/** + * Use this module if you want to create your own base class extending + * {@link ReactiveElement}. + * @packageDocumentation + */ +// TODO (justinfagnani): Add `hasOwn` here when we ship ES2022 +const { is, defineProperty, getOwnPropertyDescriptor, getOwnPropertyNames, getOwnPropertySymbols, getPrototypeOf, } = Object; +// Lets a minifier replace globalThis references with a minified name +const global$1 = globalThis; +let issueWarning$3; +const trustedTypes$1 = global$1 + .trustedTypes; +// Temporary workaround for https://crbug.com/993268 +// Currently, any attribute starting with "on" is considered to be a +// TrustedScript source. Such boolean attributes must be set to the equivalent +// trusted emptyScript value. +const emptyStringForBooleanAttribute = trustedTypes$1 + ? trustedTypes$1.emptyScript + : ''; +const polyfillSupport$2 = global$1.reactiveElementPolyfillSupportDevMode + ; +{ + // Ensure warnings are issued only 1x, even if multiple versions of Lit + // are loaded. + const issuedWarnings = (global$1.litIssuedWarnings ??= + new Set()); + // Issue a warning, if we haven't already. + issueWarning$3 = (code, warning) => { + warning += ` See https://lit.dev/msg/${code} for more information.`; + if (!issuedWarnings.has(warning)) { + console.warn(warning); + issuedWarnings.add(warning); + } + }; + issueWarning$3('dev-mode', `Lit is in dev mode. Not recommended for production!`); + // Issue polyfill support warning. + if (global$1.ShadyDOM?.inUse && polyfillSupport$2 === undefined) { + issueWarning$3('polyfill-support-missing', `Shadow DOM is being polyfilled via \`ShadyDOM\` but ` + + `the \`polyfill-support\` module has not been loaded.`); + } +} +/** + * Useful for visualizing and logging insights into what the Lit template system is doing. + * + * Compiled out of prod mode builds. + */ +const debugLogEvent$1 = (event) => { + const shouldEmit = global$1 + .emitLitDebugLogEvents; + if (!shouldEmit) { + return; + } + global$1.dispatchEvent(new CustomEvent('lit-debug', { + detail: event, + })); + } + ; +/* + * When using Closure Compiler, JSCompiler_renameProperty(property, object) is + * replaced at compile time by the munged name for object[property]. We cannot + * alias this function, so we have to use a small shim that has the same + * behavior when not compiling. + */ +/*@__INLINE__*/ +const JSCompiler_renameProperty$1 = (prop, _obj) => prop; +const defaultConverter = { + toAttribute(value, type) { + switch (type) { + case Boolean: + value = value ? emptyStringForBooleanAttribute : null; + break; + case Object: + case Array: + // if the value is `null` or `undefined` pass this through + // to allow removing/no change behavior. + value = value == null ? value : JSON.stringify(value); + break; + } + return value; + }, + fromAttribute(value, type) { + let fromValue = value; + switch (type) { + case Boolean: + fromValue = value !== null; + break; + case Number: + fromValue = value === null ? null : Number(value); + break; + case Object: + case Array: + // Do *not* generate exception when invalid JSON is set as elements + // don't normally complain on being mis-configured. + // TODO(sorvell): Do generate exception in *dev mode*. + try { + // Assert to adhere to Bazel's "must type assert JSON parse" rule. + fromValue = JSON.parse(value); + } + catch (e) { + fromValue = null; + } + break; + } + return fromValue; + }, +}; +/** + * Change function that returns true if `value` is different from `oldValue`. + * This method is used as the default for a property's `hasChanged` function. + */ +const notEqual = (value, old) => !is(value, old); +const defaultPropertyDeclaration$1 = { + attribute: true, + type: String, + converter: defaultConverter, + reflect: false, + hasChanged: notEqual, +}; +// Ensure metadata is enabled. TypeScript does not polyfill +// Symbol.metadata, so we must ensure that it exists. +Symbol.metadata ??= Symbol('metadata'); +// Map from a class's metadata object to property options +// Note that we must use nullish-coalescing assignment so that we only use one +// map even if we load multiple version of this module. +global$1.litPropertyMetadata ??= new WeakMap(); +/** + * Base element class which manages element properties and attributes. When + * properties change, the `update` method is asynchronously called. This method + * should be supplied by subclasses to render updates as desired. + * @noInheritDoc + */ +class ReactiveElement +// In the Node build, this `extends` clause will be substituted with +// `(globalThis.HTMLElement ?? HTMLElement)`. +// +// This way, we will first prefer any global `HTMLElement` polyfill that the +// user has assigned, and then fall back to the `HTMLElement` shim which has +// been imported (see note at the top of this file about how this import is +// generated by Rollup). Note that the `HTMLElement` variable has been +// shadowed by this import, so it no longer refers to the global. + extends HTMLElement { + /** + * Adds an initializer function to the class that is called during instance + * construction. + * + * This is useful for code that runs against a `ReactiveElement` + * subclass, such as a decorator, that needs to do work for each + * instance, such as setting up a `ReactiveController`. + * + * ```ts + * const myDecorator = (target: typeof ReactiveElement, key: string) => { + * target.addInitializer((instance: ReactiveElement) => { + * // This is run during construction of the element + * new MyController(instance); + * }); + * } + * ``` + * + * Decorating a field will then cause each instance to run an initializer + * that adds a controller: + * + * ```ts + * class MyElement extends LitElement { + * @myDecorator foo; + * } + * ``` + * + * Initializers are stored per-constructor. Adding an initializer to a + * subclass does not add it to a superclass. Since initializers are run in + * constructors, initializers will run in order of the class hierarchy, + * starting with superclasses and progressing to the instance's class. + * + * @nocollapse + */ + static addInitializer(initializer) { + this.__prepare(); + (this._initializers ??= []).push(initializer); + } + /** + * Returns a list of attributes corresponding to the registered properties. + * @nocollapse + * @category attributes + */ + static get observedAttributes() { + // Ensure we've created all properties + this.finalize(); + // this.__attributeToPropertyMap is only undefined after finalize() in + // ReactiveElement itself. ReactiveElement.observedAttributes is only + // accessed with ReactiveElement as the receiver when a subclass or mixin + // calls super.observedAttributes + return (this.__attributeToPropertyMap && [...this.__attributeToPropertyMap.keys()]); + } + /** + * Creates a property accessor on the element prototype if one does not exist + * and stores a {@linkcode PropertyDeclaration} for the property with the + * given options. The property setter calls the property's `hasChanged` + * property option or uses a strict identity check to determine whether or not + * to request an update. + * + * This method may be overridden to customize properties; however, + * when doing so, it's important to call `super.createProperty` to ensure + * the property is setup correctly. This method calls + * `getPropertyDescriptor` internally to get a descriptor to install. + * To customize what properties do when they are get or set, override + * `getPropertyDescriptor`. To customize the options for a property, + * implement `createProperty` like this: + * + * ```ts + * static createProperty(name, options) { + * options = Object.assign(options, {myOption: true}); + * super.createProperty(name, options); + * } + * ``` + * + * @nocollapse + * @category properties + */ + static createProperty(name, options = defaultPropertyDeclaration$1) { + // If this is a state property, force the attribute to false. + if (options.state) { + options.attribute = false; + } + this.__prepare(); + this.elementProperties.set(name, options); + if (!options.noAccessor) { + const key = // Use Symbol.for in dev mode to make it easier to maintain state + // when doing HMR. + Symbol.for(`${String(name)} (@property() cache)`) + ; + const descriptor = this.getPropertyDescriptor(name, key, options); + if (descriptor !== undefined) { + defineProperty(this.prototype, name, descriptor); + } + } + } + /** + * Returns a property descriptor to be defined on the given named property. + * If no descriptor is returned, the property will not become an accessor. + * For example, + * + * ```ts + * class MyElement extends LitElement { + * static getPropertyDescriptor(name, key, options) { + * const defaultDescriptor = + * super.getPropertyDescriptor(name, key, options); + * const setter = defaultDescriptor.set; + * return { + * get: defaultDescriptor.get, + * set(value) { + * setter.call(this, value); + * // custom action. + * }, + * configurable: true, + * enumerable: true + * } + * } + * } + * ``` + * + * @nocollapse + * @category properties + */ + static getPropertyDescriptor(name, key, options) { + const { get, set } = getOwnPropertyDescriptor(this.prototype, name) ?? { + get() { + return this[key]; + }, + set(v) { + this[key] = v; + }, + }; + if (get == null) { + if ('value' in (getOwnPropertyDescriptor(this.prototype, name) ?? {})) { + throw new Error(`Field ${JSON.stringify(String(name))} on ` + + `${this.name} was declared as a reactive property ` + + `but it's actually declared as a value on the prototype. ` + + `Usually this is due to using @property or @state on a method.`); + } + issueWarning$3('reactive-property-without-getter', `Field ${JSON.stringify(String(name))} on ` + + `${this.name} was declared as a reactive property ` + + `but it does not have a getter. This will be an error in a ` + + `future version of Lit.`); + } + return { + get() { + return get?.call(this); + }, + set(value) { + const oldValue = get?.call(this); + set.call(this, value); + this.requestUpdate(name, oldValue, options); + }, + configurable: true, + enumerable: true, + }; + } + /** + * Returns the property options associated with the given property. + * These options are defined with a `PropertyDeclaration` via the `properties` + * object or the `@property` decorator and are registered in + * `createProperty(...)`. + * + * Note, this method should be considered "final" and not overridden. To + * customize the options for a given property, override + * {@linkcode createProperty}. + * + * @nocollapse + * @final + * @category properties + */ + static getPropertyOptions(name) { + return this.elementProperties.get(name) ?? defaultPropertyDeclaration$1; + } + /** + * Initializes static own properties of the class used in bookkeeping + * for element properties, initializers, etc. + * + * Can be called multiple times by code that needs to ensure these + * properties exist before using them. + * + * This method ensures the superclass is finalized so that inherited + * property metadata can be copied down. + * @nocollapse + */ + static __prepare() { + if (this.hasOwnProperty(JSCompiler_renameProperty$1('elementProperties'))) { + // Already prepared + return; + } + // Finalize any superclasses + const superCtor = getPrototypeOf(this); + superCtor.finalize(); + // Create own set of initializers for this class if any exist on the + // superclass and copy them down. Note, for a small perf boost, avoid + // creating initializers unless needed. + if (superCtor._initializers !== undefined) { + this._initializers = [...superCtor._initializers]; + } + // Initialize elementProperties from the superclass + this.elementProperties = new Map(superCtor.elementProperties); + } + /** + * Finishes setting up the class so that it's ready to be registered + * as a custom element and instantiated. + * + * This method is called by the ReactiveElement.observedAttributes getter. + * If you override the observedAttributes getter, you must either call + * super.observedAttributes to trigger finalization, or call finalize() + * yourself. + * + * @nocollapse + */ + static finalize() { + if (this.hasOwnProperty(JSCompiler_renameProperty$1('finalized'))) { + return; + } + this.finalized = true; + this.__prepare(); + // Create properties from the static properties block: + if (this.hasOwnProperty(JSCompiler_renameProperty$1('properties'))) { + const props = this.properties; + const propKeys = [ + ...getOwnPropertyNames(props), + ...getOwnPropertySymbols(props), + ]; + for (const p of propKeys) { + this.createProperty(p, props[p]); + } + } + // Create properties from standard decorator metadata: + const metadata = this[Symbol.metadata]; + if (metadata !== null) { + const properties = litPropertyMetadata.get(metadata); + if (properties !== undefined) { + for (const [p, options] of properties) { + this.elementProperties.set(p, options); + } + } + } + // Create the attribute-to-property map + this.__attributeToPropertyMap = new Map(); + for (const [p, options] of this.elementProperties) { + const attr = this.__attributeNameForProperty(p, options); + if (attr !== undefined) { + this.__attributeToPropertyMap.set(attr, p); + } + } + this.elementStyles = this.finalizeStyles(this.styles); + { + if (this.hasOwnProperty('createProperty')) { + issueWarning$3('no-override-create-property', 'Overriding ReactiveElement.createProperty() is deprecated. ' + + 'The override will not be called with standard decorators'); + } + if (this.hasOwnProperty('getPropertyDescriptor')) { + issueWarning$3('no-override-get-property-descriptor', 'Overriding ReactiveElement.getPropertyDescriptor() is deprecated. ' + + 'The override will not be called with standard decorators'); + } + } + } + /** + * Takes the styles the user supplied via the `static styles` property and + * returns the array of styles to apply to the element. + * Override this method to integrate into a style management system. + * + * Styles are deduplicated preserving the _last_ instance in the list. This + * is a performance optimization to avoid duplicated styles that can occur + * especially when composing via subclassing. The last item is kept to try + * to preserve the cascade order with the assumption that it's most important + * that last added styles override previous styles. + * + * @nocollapse + * @category styles + */ + static finalizeStyles(styles) { + const elementStyles = []; + if (Array.isArray(styles)) { + // Dedupe the flattened array in reverse order to preserve the last items. + // Casting to Array works around TS error that + // appears to come from trying to flatten a type CSSResultArray. + const set = new Set(styles.flat(Infinity).reverse()); + // Then preserve original order by adding the set items in reverse order. + for (const s of set) { + elementStyles.unshift(getCompatibleStyle(s)); + } + } + else if (styles !== undefined) { + elementStyles.push(getCompatibleStyle(styles)); + } + return elementStyles; + } + /** + * Returns the property name for the given attribute `name`. + * @nocollapse + */ + static __attributeNameForProperty(name, options) { + const attribute = options.attribute; + return attribute === false + ? undefined + : typeof attribute === 'string' + ? attribute + : typeof name === 'string' + ? name.toLowerCase() + : undefined; + } + constructor() { + super(); + this.__instanceProperties = undefined; + /** + * True if there is a pending update as a result of calling `requestUpdate()`. + * Should only be read. + * @category updates + */ + this.isUpdatePending = false; + /** + * Is set to `true` after the first update. The element code cannot assume + * that `renderRoot` exists before the element `hasUpdated`. + * @category updates + */ + this.hasUpdated = false; + /** + * Name of currently reflecting property + */ + this.__reflectingProperty = null; + this.__initialize(); + } + /** + * Internal only override point for customizing work done when elements + * are constructed. + */ + __initialize() { + this.__updatePromise = new Promise((res) => (this.enableUpdating = res)); + this._$changedProperties = new Map(); + // This enqueues a microtask that ust run before the first update, so it + // must be called before requestUpdate() + this.__saveInstanceProperties(); + // ensures first update will be caught by an early access of + // `updateComplete` + this.requestUpdate(); + this.constructor._initializers?.forEach((i) => i(this)); + } + /** + * Registers a `ReactiveController` to participate in the element's reactive + * update cycle. The element automatically calls into any registered + * controllers during its lifecycle callbacks. + * + * If the element is connected when `addController()` is called, the + * controller's `hostConnected()` callback will be immediately called. + * @category controllers + */ + addController(controller) { + (this.__controllers ??= new Set()).add(controller); + // If a controller is added after the element has been connected, + // call hostConnected. Note, re-using existence of `renderRoot` here + // (which is set in connectedCallback) to avoid the need to track a + // first connected state. + if (this.renderRoot !== undefined && this.isConnected) { + controller.hostConnected?.(); + } + } + /** + * Removes a `ReactiveController` from the element. + * @category controllers + */ + removeController(controller) { + this.__controllers?.delete(controller); + } + /** + * Fixes any properties set on the instance before upgrade time. + * Otherwise these would shadow the accessor and break these properties. + * The properties are stored in a Map which is played back after the + * constructor runs. Note, on very old versions of Safari (<=9) or Chrome + * (<=41), properties created for native platform properties like (`id` or + * `name`) may not have default values set in the element constructor. On + * these browsers native properties appear on instances and therefore their + * default value will overwrite any element default (e.g. if the element sets + * this.id = 'id' in the constructor, the 'id' will become '' since this is + * the native platform default). + */ + __saveInstanceProperties() { + const instanceProperties = new Map(); + const elementProperties = this.constructor + .elementProperties; + for (const p of elementProperties.keys()) { + if (this.hasOwnProperty(p)) { + instanceProperties.set(p, this[p]); + delete this[p]; + } + } + if (instanceProperties.size > 0) { + this.__instanceProperties = instanceProperties; + } + } + /** + * Returns the node into which the element should render and by default + * creates and returns an open shadowRoot. Implement to customize where the + * element's DOM is rendered. For example, to render into the element's + * childNodes, return `this`. + * + * @return Returns a node into which to render. + * @category rendering + */ + createRenderRoot() { + const renderRoot = this.shadowRoot ?? + this.attachShadow(this.constructor.shadowRootOptions); + adoptStyles(renderRoot, this.constructor.elementStyles); + return renderRoot; + } + /** + * On first connection, creates the element's renderRoot, sets up + * element styling, and enables updating. + * @category lifecycle + */ + connectedCallback() { + // Create renderRoot before controllers `hostConnected` + this.renderRoot ??= + this.createRenderRoot(); + this.enableUpdating(true); + this.__controllers?.forEach((c) => c.hostConnected?.()); + } + /** + * Note, this method should be considered final and not overridden. It is + * overridden on the element instance with a function that triggers the first + * update. + * @category updates + */ + enableUpdating(_requestedUpdate) { } + /** + * Allows for `super.disconnectedCallback()` in extensions while + * reserving the possibility of making non-breaking feature additions + * when disconnecting at some point in the future. + * @category lifecycle + */ + disconnectedCallback() { + this.__controllers?.forEach((c) => c.hostDisconnected?.()); + } + /** + * Synchronizes property values when attributes change. + * + * Specifically, when an attribute is set, the corresponding property is set. + * You should rarely need to implement this callback. If this method is + * overridden, `super.attributeChangedCallback(name, _old, value)` must be + * called. + * + * See [using the lifecycle callbacks](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks) + * on MDN for more information about the `attributeChangedCallback`. + * @category attributes + */ + attributeChangedCallback(name, _old, value) { + this._$attributeToProperty(name, value); + } + __propertyToAttribute(name, value) { + const elemProperties = this.constructor.elementProperties; + const options = elemProperties.get(name); + const attr = this.constructor.__attributeNameForProperty(name, options); + if (attr !== undefined && options.reflect === true) { + const converter = options.converter?.toAttribute !== + undefined + ? options.converter + : defaultConverter; + const attrValue = converter.toAttribute(value, options.type); + if (this.constructor.enabledWarnings.includes('migration') && + attrValue === undefined) { + issueWarning$3('undefined-attribute-value', `The attribute value for the ${name} property is ` + + `undefined on element ${this.localName}. The attribute will be ` + + `removed, but in the previous version of \`ReactiveElement\`, ` + + `the attribute would not have changed.`); + } + // Track if the property is being reflected to avoid + // setting the property again via `attributeChangedCallback`. Note: + // 1. this takes advantage of the fact that the callback is synchronous. + // 2. will behave incorrectly if multiple attributes are in the reaction + // stack at time of calling. However, since we process attributes + // in `update` this should not be possible (or an extreme corner case + // that we'd like to discover). + // mark state reflecting + this.__reflectingProperty = name; + if (attrValue == null) { + this.removeAttribute(attr); + } + else { + this.setAttribute(attr, attrValue); + } + // mark state not reflecting + this.__reflectingProperty = null; + } + } + /** @internal */ + _$attributeToProperty(name, value) { + const ctor = this.constructor; + // Note, hint this as an `AttributeMap` so closure clearly understands + // the type; it has issues with tracking types through statics + const propName = ctor.__attributeToPropertyMap.get(name); + // Use tracking info to avoid reflecting a property value to an attribute + // if it was just set because the attribute changed. + if (propName !== undefined && this.__reflectingProperty !== propName) { + const options = ctor.getPropertyOptions(propName); + const converter = typeof options.converter === 'function' + ? { fromAttribute: options.converter } + : options.converter?.fromAttribute !== undefined + ? options.converter + : defaultConverter; + // mark state reflecting + this.__reflectingProperty = propName; + this[propName] = converter.fromAttribute(value, options.type + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ); + // mark state not reflecting + this.__reflectingProperty = null; + } + } + /** + * Requests an update which is processed asynchronously. This should be called + * when an element should update based on some state not triggered by setting + * a reactive property. In this case, pass no arguments. It should also be + * called when manually implementing a property setter. In this case, pass the + * property `name` and `oldValue` to ensure that any configured property + * options are honored. + * + * @param name name of requesting property + * @param oldValue old value of requesting property + * @param options property options to use instead of the previously + * configured options + * @category updates + */ + requestUpdate(name, oldValue, options) { + // If we have a property key, perform property update steps. + if (name !== undefined) { + if (name instanceof Event) { + issueWarning$3(``, `The requestUpdate() method was called with an Event as the property name. This is probably a mistake caused by binding this.requestUpdate as an event listener. Instead bind a function that will call it with no arguments: () => this.requestUpdate()`); + } + options ??= this.constructor.getPropertyOptions(name); + const hasChanged = options.hasChanged ?? notEqual; + const newValue = this[name]; + if (hasChanged(newValue, oldValue)) { + this._$changeProperty(name, oldValue, options); + } + else { + // Abort the request if the property should not be considered changed. + return; + } + } + if (this.isUpdatePending === false) { + this.__updatePromise = this.__enqueueUpdate(); + } + } + /** + * @internal + */ + _$changeProperty(name, oldValue, options) { + // TODO (justinfagnani): Create a benchmark of Map.has() + Map.set( + // vs just Map.set() + if (!this._$changedProperties.has(name)) { + this._$changedProperties.set(name, oldValue); + } + // Add to reflecting properties set. + // Note, it's important that every change has a chance to add the + // property to `__reflectingProperties`. This ensures setting + // attribute + property reflects correctly. + if (options.reflect === true && this.__reflectingProperty !== name) { + (this.__reflectingProperties ??= new Set()).add(name); + } + } + /** + * Sets up the element to asynchronously update. + */ + async __enqueueUpdate() { + this.isUpdatePending = true; + try { + // Ensure any previous update has resolved before updating. + // This `await` also ensures that property changes are batched. + await this.__updatePromise; + } + catch (e) { + // Refire any previous errors async so they do not disrupt the update + // cycle. Errors are refired so developers have a chance to observe + // them, and this can be done by implementing + // `window.onunhandledrejection`. + Promise.reject(e); + } + const result = this.scheduleUpdate(); + // If `scheduleUpdate` returns a Promise, we await it. This is done to + // enable coordinating updates with a scheduler. Note, the result is + // checked to avoid delaying an additional microtask unless we need to. + if (result != null) { + await result; + } + return !this.isUpdatePending; + } + /** + * Schedules an element update. You can override this method to change the + * timing of updates by returning a Promise. The update will await the + * returned Promise, and you should resolve the Promise to allow the update + * to proceed. If this method is overridden, `super.scheduleUpdate()` + * must be called. + * + * For instance, to schedule updates to occur just before the next frame: + * + * ```ts + * override protected async scheduleUpdate(): Promise { + * await new Promise((resolve) => requestAnimationFrame(() => resolve())); + * super.scheduleUpdate(); + * } + * ``` + * @category updates + */ + scheduleUpdate() { + const result = this.performUpdate(); + if (this.constructor.enabledWarnings.includes('async-perform-update') && + typeof result?.then === + 'function') { + issueWarning$3('async-perform-update', `Element ${this.localName} returned a Promise from performUpdate(). ` + + `This behavior is deprecated and will be removed in a future ` + + `version of ReactiveElement.`); + } + return result; + } + /** + * Performs an element update. Note, if an exception is thrown during the + * update, `firstUpdated` and `updated` will not be called. + * + * Call `performUpdate()` to immediately process a pending update. This should + * generally not be needed, but it can be done in rare cases when you need to + * update synchronously. + * + * @category updates + */ + performUpdate() { + // Abort any update if one is not pending when this is called. + // This can happen if `performUpdate` is called early to "flush" + // the update. + if (!this.isUpdatePending) { + return; + } + debugLogEvent$1?.({ kind: 'update' }); + if (!this.hasUpdated) { + // Create renderRoot before first update. This occurs in `connectedCallback` + // but is done here to support out of tree calls to `enableUpdating`/`performUpdate`. + this.renderRoot ??= + this.createRenderRoot(); + { + // Produce warning if any reactive properties on the prototype are + // shadowed by class fields. Instance fields set before upgrade are + // deleted by this point, so any own property is caused by class field + // initialization in the constructor. + const ctor = this.constructor; + const shadowedProperties = [...ctor.elementProperties.keys()].filter((p) => this.hasOwnProperty(p) && p in getPrototypeOf(this)); + if (shadowedProperties.length) { + throw new Error(`The following properties on element ${this.localName} will not ` + + `trigger updates as expected because they are set using class ` + + `fields: ${shadowedProperties.join(', ')}. ` + + `Native class fields and some compiled output will overwrite ` + + `accessors used for detecting changes. See ` + + `https://lit.dev/msg/class-field-shadowing ` + + `for more information.`); + } + } + // Mixin instance properties once, if they exist. + if (this.__instanceProperties) { + // TODO (justinfagnani): should we use the stored value? Could a new value + // have been set since we stored the own property value? + for (const [p, value] of this.__instanceProperties) { + this[p] = value; + } + this.__instanceProperties = undefined; + } + // Trigger initial value reflection and populate the initial + // changedProperties map, but only for the case of experimental + // decorators on accessors, which will not have already populated the + // changedProperties map. We can't know if these accessors had + // initializers, so we just set them anyway - a difference from + // experimental decorators on fields and standard decorators on + // auto-accessors. + // For context why experimentalDecorators with auto accessors are handled + // specifically also see: + // https://github.com/lit/lit/pull/4183#issuecomment-1711959635 + const elementProperties = this.constructor + .elementProperties; + if (elementProperties.size > 0) { + for (const [p, options] of elementProperties) { + if (options.wrapped === true && + !this._$changedProperties.has(p) && + this[p] !== undefined) { + this._$changeProperty(p, this[p], options); + } + } + } + } + let shouldUpdate = false; + const changedProperties = this._$changedProperties; + try { + shouldUpdate = this.shouldUpdate(changedProperties); + if (shouldUpdate) { + this.willUpdate(changedProperties); + this.__controllers?.forEach((c) => c.hostUpdate?.()); + this.update(changedProperties); + } + else { + this.__markUpdated(); + } + } + catch (e) { + // Prevent `firstUpdated` and `updated` from running when there's an + // update exception. + shouldUpdate = false; + // Ensure element can accept additional updates after an exception. + this.__markUpdated(); + throw e; + } + // The update is no longer considered pending and further updates are now allowed. + if (shouldUpdate) { + this._$didUpdate(changedProperties); + } + } + /** + * Invoked before `update()` to compute values needed during the update. + * + * Implement `willUpdate` to compute property values that depend on other + * properties and are used in the rest of the update process. + * + * ```ts + * willUpdate(changedProperties) { + * // only need to check changed properties for an expensive computation. + * if (changedProperties.has('firstName') || changedProperties.has('lastName')) { + * this.sha = computeSHA(`${this.firstName} ${this.lastName}`); + * } + * } + * + * render() { + * return html`SHA: ${this.sha}`; + * } + * ``` + * + * @category updates + */ + willUpdate(_changedProperties) { } + // Note, this is an override point for polyfill-support. + // @internal + _$didUpdate(changedProperties) { + this.__controllers?.forEach((c) => c.hostUpdated?.()); + if (!this.hasUpdated) { + this.hasUpdated = true; + this.firstUpdated(changedProperties); + } + this.updated(changedProperties); + if (this.isUpdatePending && + this.constructor.enabledWarnings.includes('change-in-update')) { + issueWarning$3('change-in-update', `Element ${this.localName} scheduled an update ` + + `(generally because a property was set) ` + + `after an update completed, causing a new update to be scheduled. ` + + `This is inefficient and should be avoided unless the next update ` + + `can only be scheduled as a side effect of the previous update.`); + } + } + __markUpdated() { + this._$changedProperties = new Map(); + this.isUpdatePending = false; + } + /** + * Returns a Promise that resolves when the element has completed updating. + * The Promise value is a boolean that is `true` if the element completed the + * update without triggering another update. The Promise result is `false` if + * a property was set inside `updated()`. If the Promise is rejected, an + * exception was thrown during the update. + * + * To await additional asynchronous work, override the `getUpdateComplete` + * method. For example, it is sometimes useful to await a rendered element + * before fulfilling this Promise. To do this, first await + * `super.getUpdateComplete()`, then any subsequent state. + * + * @return A promise of a boolean that resolves to true if the update completed + * without triggering another update. + * @category updates + */ + get updateComplete() { + return this.getUpdateComplete(); + } + /** + * Override point for the `updateComplete` promise. + * + * It is not safe to override the `updateComplete` getter directly due to a + * limitation in TypeScript which means it is not possible to call a + * superclass getter (e.g. `super.updateComplete.then(...)`) when the target + * language is ES5 (https://github.com/microsoft/TypeScript/issues/338). + * This method should be overridden instead. For example: + * + * ```ts + * class MyElement extends LitElement { + * override async getUpdateComplete() { + * const result = await super.getUpdateComplete(); + * await this._myChild.updateComplete; + * return result; + * } + * } + * ``` + * + * @return A promise of a boolean that resolves to true if the update completed + * without triggering another update. + * @category updates + */ + getUpdateComplete() { + return this.__updatePromise; + } + /** + * Controls whether or not `update()` should be called when the element requests + * an update. By default, this method always returns `true`, but this can be + * customized to control when to update. + * + * @param _changedProperties Map of changed properties with old values + * @category updates + */ + shouldUpdate(_changedProperties) { + return true; + } + /** + * Updates the element. This method reflects property values to attributes. + * It can be overridden to render and keep updated element DOM. + * Setting properties inside this method will *not* trigger + * another update. + * + * @param _changedProperties Map of changed properties with old values + * @category updates + */ + update(_changedProperties) { + // The forEach() expression will only run when when __reflectingProperties is + // defined, and it returns undefined, setting __reflectingProperties to + // undefined + this.__reflectingProperties &&= this.__reflectingProperties.forEach((p) => this.__propertyToAttribute(p, this[p])); + this.__markUpdated(); + } + /** + * Invoked whenever the element is updated. Implement to perform + * post-updating tasks via DOM APIs, for example, focusing an element. + * + * Setting properties inside this method will trigger the element to update + * again after this update cycle completes. + * + * @param _changedProperties Map of changed properties with old values + * @category updates + */ + updated(_changedProperties) { } + /** + * Invoked when the element is first updated. Implement to perform one time + * work on the element after update. + * + * ```ts + * firstUpdated() { + * this.renderRoot.getElementById('my-text-area').focus(); + * } + * ``` + * + * Setting properties inside this method will trigger the element to update + * again after this update cycle completes. + * + * @param _changedProperties Map of changed properties with old values + * @category updates + */ + firstUpdated(_changedProperties) { } +} +/** + * Memoized list of all element styles. + * Created lazily on user subclasses when finalizing the class. + * @nocollapse + * @category styles + */ +ReactiveElement.elementStyles = []; +/** + * Options used when calling `attachShadow`. Set this property to customize + * the options for the shadowRoot; for example, to create a closed + * shadowRoot: `{mode: 'closed'}`. + * + * Note, these options are used in `createRenderRoot`. If this method + * is customized, options should be respected if possible. + * @nocollapse + * @category rendering + */ +ReactiveElement.shadowRootOptions = { mode: 'open' }; +// Assigned here to work around a jscompiler bug with static fields +// when compiling to ES5. +// https://github.com/google/closure-compiler/issues/3177 +ReactiveElement[JSCompiler_renameProperty$1('elementProperties')] = new Map(); +ReactiveElement[JSCompiler_renameProperty$1('finalized')] = new Map(); +// Apply polyfills if available +polyfillSupport$2?.({ ReactiveElement }); +// Dev mode warnings... +{ + // Default warning set. + ReactiveElement.enabledWarnings = [ + 'change-in-update', + 'async-perform-update', + ]; + const ensureOwnWarnings = function (ctor) { + if (!ctor.hasOwnProperty(JSCompiler_renameProperty$1('enabledWarnings'))) { + ctor.enabledWarnings = ctor.enabledWarnings.slice(); + } + }; + ReactiveElement.enableWarning = function (warning) { + ensureOwnWarnings(this); + if (!this.enabledWarnings.includes(warning)) { + this.enabledWarnings.push(warning); + } + }; + ReactiveElement.disableWarning = function (warning) { + ensureOwnWarnings(this); + const i = this.enabledWarnings.indexOf(warning); + if (i >= 0) { + this.enabledWarnings.splice(i, 1); + } + }; +} +// IMPORTANT: do not change the property name or the assignment expression. +// This line will be used in regexes to search for ReactiveElement usage. +(global$1.reactiveElementVersions ??= []).push('2.0.4'); +if (global$1.reactiveElementVersions.length > 1) { + issueWarning$3('multiple-versions', `Multiple versions of Lit loaded. Loading multiple versions ` + + `is not recommended.`); +} + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +/* + * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all + * property decorators (but not class decorators) in this file that have + * an @ExportDecoratedItems annotation must be defined as a regular function, + * not an arrow function. + */ +let issueWarning$2; +{ + // Ensure warnings are issued only 1x, even if multiple versions of Lit + // are loaded. + const issuedWarnings = (globalThis.litIssuedWarnings ??= new Set()); + // Issue a warning, if we haven't already. + issueWarning$2 = (code, warning) => { + warning += ` See https://lit.dev/msg/${code} for more information.`; + if (!issuedWarnings.has(warning)) { + console.warn(warning); + issuedWarnings.add(warning); + } + }; +} +const legacyProperty = (options, proto, name) => { + const hasOwnProperty = proto.hasOwnProperty(name); + proto.constructor.createProperty(name, hasOwnProperty ? { ...options, wrapped: true } : options); + // For accessors (which have a descriptor on the prototype) we need to + // return a descriptor, otherwise TypeScript overwrites the descriptor we + // define in createProperty() with the original descriptor. We don't do this + // for fields, which don't have a descriptor, because this could overwrite + // descriptor defined by other decorators. + return hasOwnProperty + ? Object.getOwnPropertyDescriptor(proto, name) + : undefined; +}; +// This is duplicated from a similar variable in reactive-element.ts, but +// actually makes sense to have this default defined with the decorator, so +// that different decorators could have different defaults. +const defaultPropertyDeclaration = { + attribute: true, + type: String, + converter: defaultConverter, + reflect: false, + hasChanged: notEqual, +}; +/** + * Wraps a class accessor or setter so that `requestUpdate()` is called with the + * property name and old value when the accessor is set. + */ +const standardProperty = (options = defaultPropertyDeclaration, target, context) => { + const { kind, metadata } = context; + if (metadata == null) { + issueWarning$2('missing-class-metadata', `The class ${target} is missing decorator metadata. This ` + + `could mean that you're using a compiler that supports decorators ` + + `but doesn't support decorator metadata, such as TypeScript 5.1. ` + + `Please update your compiler.`); + } + // Store the property options + let properties = globalThis.litPropertyMetadata.get(metadata); + if (properties === undefined) { + globalThis.litPropertyMetadata.set(metadata, (properties = new Map())); + } + properties.set(context.name, options); + if (kind === 'accessor') { + // Standard decorators cannot dynamically modify the class, so we can't + // replace a field with accessors. The user must use the new `accessor` + // keyword instead. + const { name } = context; + return { + set(v) { + const oldValue = target.get.call(this); + target.set.call(this, v); + this.requestUpdate(name, oldValue, options); + }, + init(v) { + if (v !== undefined) { + this._$changeProperty(name, undefined, options); + } + return v; + }, + }; + } + else if (kind === 'setter') { + const { name } = context; + return function (value) { + const oldValue = this[name]; + target.call(this, value); + this.requestUpdate(name, oldValue, options); + }; + } + throw new Error(`Unsupported decorator location: ${kind}`); +}; +/** + * A class field or accessor decorator which creates a reactive property that + * reflects a corresponding attribute value. When a decorated property is set + * the element will update and render. A {@linkcode PropertyDeclaration} may + * optionally be supplied to configure property features. + * + * This decorator should only be used for public fields. As public fields, + * properties should be considered as primarily settable by element users, + * either via attribute or the property itself. + * + * Generally, properties that are changed by the element should be private or + * protected fields and should use the {@linkcode state} decorator. + * + * However, sometimes element code does need to set a public property. This + * should typically only be done in response to user interaction, and an event + * should be fired informing the user; for example, a checkbox sets its + * `checked` property when clicked and fires a `changed` event. Mutating public + * properties should typically not be done for non-primitive (object or array) + * properties. In other cases when an element needs to manage state, a private + * property decorated via the {@linkcode state} decorator should be used. When + * needed, state properties can be initialized via public properties to + * facilitate complex interactions. + * + * ```ts + * class MyElement { + * @property({ type: Boolean }) + * clicked = false; + * } + * ``` + * @category Decorator + * @ExportDecoratedItems + */ +function property(options) { + return (protoOrTarget, nameOrContext + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) => { + return (typeof nameOrContext === 'object' + ? standardProperty(options, protoOrTarget, nameOrContext) + : legacyProperty(options, protoOrTarget, nameOrContext)); + }; +} + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +{ + // Ensure warnings are issued only 1x, even if multiple versions of Lit + // are loaded. + (globalThis.litIssuedWarnings ??= new Set()); +} + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +// Allows minifiers to rename references to globalThis +const global = globalThis; +/** + * Useful for visualizing and logging insights into what the Lit template system is doing. + * + * Compiled out of prod mode builds. + */ +const debugLogEvent = (event) => { + const shouldEmit = global + .emitLitDebugLogEvents; + if (!shouldEmit) { + return; + } + global.dispatchEvent(new CustomEvent('lit-debug', { + detail: event, + })); + } + ; +// Used for connecting beginRender and endRender events when there are nested +// renders when errors are thrown preventing an endRender event from being +// called. +let debugLogRenderId = 0; +let issueWarning$1; +{ + global.litIssuedWarnings ??= new Set(); + // Issue a warning, if we haven't already. + issueWarning$1 = (code, warning) => { + warning += code + ? ` See https://lit.dev/msg/${code} for more information.` + : ''; + if (!global.litIssuedWarnings.has(warning)) { + console.warn(warning); + global.litIssuedWarnings.add(warning); + } + }; + issueWarning$1('dev-mode', `Lit is in dev mode. Not recommended for production!`); +} +const wrap = global.ShadyDOM?.inUse && + global.ShadyDOM?.noPatch === true + ? global.ShadyDOM.wrap + : (node) => node; +const trustedTypes = global.trustedTypes; +/** + * Our TrustedTypePolicy for HTML which is declared using the html template + * tag function. + * + * That HTML is a developer-authored constant, and is parsed with innerHTML + * before any untrusted expressions have been mixed in. Therefor it is + * considered safe by construction. + */ +const policy = trustedTypes + ? trustedTypes.createPolicy('lit-html', { + createHTML: (s) => s, + }) + : undefined; +const identityFunction = (value) => value; +const noopSanitizer = (_node, _name, _type) => identityFunction; +/** Sets the global sanitizer factory. */ +const setSanitizer = (newSanitizer) => { + if (sanitizerFactoryInternal !== noopSanitizer) { + throw new Error(`Attempted to overwrite existing lit-html security policy.` + + ` setSanitizeDOMValueFactory should be called at most once.`); + } + sanitizerFactoryInternal = newSanitizer; +}; +/** + * Only used in internal tests, not a part of the public API. + */ +const _testOnlyClearSanitizerFactoryDoNotCallOrElse = () => { + sanitizerFactoryInternal = noopSanitizer; +}; +const createSanitizer = (node, name, type) => { + return sanitizerFactoryInternal(node, name, type); +}; +// Added to an attribute name to mark the attribute as bound so we can find +// it easily. +const boundAttributeSuffix = '$lit$'; +// This marker is used in many syntactic positions in HTML, so it must be +// a valid element name and attribute name. We don't support dynamic names (yet) +// but this at least ensures that the parse tree is closer to the template +// intention. +const marker = `lit$${Math.random().toFixed(9).slice(2)}$`; +// String used to tell if a comment is a marker comment +const markerMatch = '?' + marker; +// Text used to insert a comment marker node. We use processing instruction +// syntax because it's slightly smaller, but parses as a comment node. +const nodeMarker = `<${markerMatch}>`; +const d = document; +// Creates a dynamic marker. We never have to search for these in the DOM. +const createMarker = () => d.createComment(''); +const isPrimitive = (value) => value === null || (typeof value != 'object' && typeof value != 'function'); +const isArray = Array.isArray; +const isIterable = (value) => isArray(value) || + // eslint-disable-next-line @typescript-eslint/no-explicit-any + typeof value?.[Symbol.iterator] === 'function'; +const SPACE_CHAR = `[ \t\n\f\r]`; +const ATTR_VALUE_CHAR = `[^ \t\n\f\r"'\`<>=]`; +const NAME_CHAR = `[^\\s"'>=/]`; +// These regexes represent the five parsing states that we care about in the +// Template's HTML scanner. They match the *end* of the state they're named +// after. +// Depending on the match, we transition to a new state. If there's no match, +// we stay in the same state. +// Note that the regexes are stateful. We utilize lastIndex and sync it +// across the multiple regexes used. In addition to the five regexes below +// we also dynamically create a regex to find the matching end tags for raw +// text elements. +/** + * End of text is: `<` followed by: + * (comment start) or (tag) or (dynamic tag binding) + */ +const textEndRegex = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g; +const COMMENT_START = 1; +const TAG_NAME = 2; +const DYNAMIC_TAG_NAME = 3; +const commentEndRegex = /-->/g; +/** + * Comments not started with + + + + + + + + + + + + + + +`; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ControlsPrompt = html ` + + + + + + + + + + + + + + + + + + +`; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ARGlyph = html ` + + + + + + + + + + + +`; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const templateResult = html ` + +

    + + + +
    + + + +
    + +
    + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    + +
    +
    + +
    + +
    + + +
    + + + +
    + + +
    +
    +
    + +
    `; +const makeTemplate = (shadowRoot) => { + render(templateResult, shadowRoot); +}; + +// This file is part of meshoptimizer library and is distributed under the terms of MIT License. +// Copyright (C) 2016-2022, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) +var MeshoptDecoder = (function() { + + // Built with clang version 14.0.4 + // Built from meshoptimizer 0.18 + var wasm_base = "b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq:P8Yqdbk;3sezu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfgocl4cifcd4hxdndndndnaoc9WGgmTmbcbhPcehsawcjdfhzalhHinaraH9Rax6midnaraHaxfgl9RcK6mbczhoinawcj;cbfaogifgoc9WfhOdndndndndnaHaic9WfgAco4fRbbaAci4coG4ciGPlbedibkaO9cb83ibaOcwf9cb83ibxikaOalRblalRbbgAco4gCaCciSgCE86bbaocGfalclfaCfgORbbaAcl4ciGgCaCciSgCE86bbaocVfaOaCfgORbbaAcd4ciGgCaCciSgCE86bbaoc7faOaCfgORbbaAciGgAaAciSgAE86bbaoctfaOaAfgARbbalRbegOco4gCaCciSgCE86bbaoc91faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc4faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc93faAaCfgARbbaOciGgOaOciSgOE86bbaoc94faAaOfgARbbalRbdgOco4gCaCciSgCE86bbaoc95faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc96faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc97faAaCfgARbbaOciGgOaOciSgOE86bbaoc98faAaOfgORbbalRbiglco4gAaAciSgAE86bbaoc99faOaAfgORbbalcl4ciGgAaAciSgAE86bbaoc9:faOaAfgORbbalcd4ciGgAaAciSgAE86bbaocufaOaAfgoRbbalciGglalciSglE86bbaoalfhlxdkaOalRbwalRbbgAcl4gCaCcsSgCE86bbaocGfalcwfaCfgORbbaAcsGgAaAcsSgAE86bbaocVfaOaAfgORbbalRbegAcl4gCaCcsSgCE86bbaoc7faOaCfgORbbaAcsGgAaAcsSgAE86bbaoctfaOaAfgORbbalRbdgAcl4gCaCcsSgCE86bbaoc91faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc4faOaAfgORbbalRbigAcl4gCaCcsSgCE86bbaoc93faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc94faOaAfgORbbalRblgAcl4gCaCcsSgCE86bbaoc95faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc96faOaAfgORbbalRbvgAcl4gCaCcsSgCE86bbaoc97faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc98faOaAfgORbbalRbogAcl4gCaCcsSgCE86bbaoc99faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc9:faOaAfgORbbalRbrglcl4gAaAcsSgAE86bbaocufaOaAfgoRbbalcsGglalcsSglE86bbaoalfhlxekaOal8Pbb83bbaOcwfalcwf8Pbb83bbalczfhlkdnaiam9pmbaiczfhoaral9RcL0mekkaiam6mialTmidnakTmbawaPfRbbhOcbhoazhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkkazcefhzaPcefgPad6hsalhHaPad9hmexvkkcbhlasceGmdxikalaxad2fhCdnakTmbcbhHcehsawcjdfhminaral9Rax6mialTmdalaxfhlawaHfRbbhOcbhoamhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkamcefhmaHcefgHad6hsaHad9hmbkaChlxikcbhocehsinaral9Rax6mdalTmealaxfhlaocefgoad6hsadao9hmbkaChlxdkcbhlasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqalmbkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;yzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabavcefciGaiVcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabavcdfciGaiVcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabavcufciGaiVcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabavciGaiVcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2geTmbinababydbgdcwtcw91:Yadce91cjjj;8ifcjjj98G::NUdbabclfhbaecufgembkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaiczfhiaeczfheadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb"; + var wasm_simd = "b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;t9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;h8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincehHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAci6hHalhOaAcefgohAaoclSmdxekkcbhlaHceGmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;uzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:EPliuo97eue978Jjjjjbca9Rhidndnadcl9hmbdnaec98GglTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaiaeciGgvcdtgdVcbczad9R;8kbaiabalcdtfglad;8qbbdnavTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkalaiad;8qbbskdnaec98GgxTmbcbhvabhdinadczfglalpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgvax6mbkkaxae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabaxcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbhdabheinaeaepbbbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepkbbaeczfheadclfgdav6mbkkdnaval9pmbaialciGgdcdtgeVcbc;abae9R;8kbaiabavcdtfgvae;8qbbdnadTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepklbkavaiae;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb"; + + var detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]); + var wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]); + + if (typeof WebAssembly !== 'object') { + return { + supported: false, + }; + } + + var wasm = WebAssembly.validate(detector) ? wasm_simd : wasm_base; + + var instance; + + var ready = + WebAssembly.instantiate(unpack(wasm), {}) + .then(function(result) { + instance = result.instance; + instance.exports.__wasm_call_ctors(); + }); + + function unpack(data) { + var result = new Uint8Array(data.length); + for (var i = 0; i < data.length; ++i) { + var ch = data.charCodeAt(i); + result[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4; + } + var write = 0; + for (var i = 0; i < data.length; ++i) { + result[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i]; + } + return result.buffer.slice(0, write); + } + + function decode(fun, target, count, size, source, filter) { + var sbrk = instance.exports.sbrk; + var count4 = (count + 3) & -4; + var tp = sbrk(count4 * size); + var sp = sbrk(source.length); + var heap = new Uint8Array(instance.exports.memory.buffer); + heap.set(source, sp); + var res = fun(tp, count, size, sp, source.length); + if (res == 0 && filter) { + filter(tp, count4, size); + } + target.set(heap.subarray(tp, tp + count * size)); + sbrk(tp - sbrk(0)); + if (res != 0) { + throw new Error("Malformed buffer data: " + res); + } + } + + var filters = { + NONE: "", + OCTAHEDRAL: "meshopt_decodeFilterOct", + QUATERNION: "meshopt_decodeFilterQuat", + EXPONENTIAL: "meshopt_decodeFilterExp", + }; + + var decoders = { + ATTRIBUTES: "meshopt_decodeVertexBuffer", + TRIANGLES: "meshopt_decodeIndexBuffer", + INDICES: "meshopt_decodeIndexSequence", + }; + + var workers = []; + var requestId = 0; + + function createWorker(url) { + var worker = { + object: new Worker(url), + pending: 0, + requests: {} + }; + + worker.object.onmessage = function(event) { + var data = event.data; + + worker.pending -= data.count; + worker.requests[data.id][data.action](data.value); + + delete worker.requests[data.id]; + }; + + return worker; + } + + function initWorkers(count) { + var source = + "var instance; var ready = WebAssembly.instantiate(new Uint8Array([" + new Uint8Array(unpack(wasm)) + "]), {})" + + ".then(function(result) { instance = result.instance; instance.exports.__wasm_call_ctors(); });" + + "self.onmessage = workerProcess;" + + decode.toString() + workerProcess.toString(); + + var blob = new Blob([source], {type: 'text/javascript'}); + var url = URL.createObjectURL(blob); + + for (var i = 0; i < count; ++i) { + workers[i] = createWorker(url); + } + + URL.revokeObjectURL(url); + } + + function decodeWorker(count, size, source, mode, filter) { + var worker = workers[0]; + + for (var i = 1; i < workers.length; ++i) { + if (workers[i].pending < worker.pending) { + worker = workers[i]; + } + } + + return new Promise(function (resolve, reject) { + var data = new Uint8Array(source); + var id = requestId++; + + worker.pending += count; + worker.requests[id] = { resolve: resolve, reject: reject }; + worker.object.postMessage({ id: id, count: count, size: size, source: data, mode: mode, filter: filter }, [ data.buffer ]); + }); + } + + function workerProcess(event) { + ready.then(function() { + var data = event.data; + try { + var target = new Uint8Array(data.count * data.size); + decode(instance.exports[data.mode], target, data.count, data.size, data.source, instance.exports[data.filter]); + self.postMessage({ id: data.id, count: data.count, action: "resolve", value: target }, [ target.buffer ]); + } catch (error) { + self.postMessage({ id: data.id, count: data.count, action: "reject", value: error }); + } + }); + } + + return { + ready: ready, + supported: true, + useWorkers: function(count) { + initWorkers(count); + }, + decodeVertexBuffer: function(target, count, size, source, filter) { + decode(instance.exports.meshopt_decodeVertexBuffer, target, count, size, source, instance.exports[filters[filter]]); + }, + decodeIndexBuffer: function(target, count, size, source) { + decode(instance.exports.meshopt_decodeIndexBuffer, target, count, size, source); + }, + decodeIndexSequence: function(target, count, size, source) { + decode(instance.exports.meshopt_decodeIndexSequence, target, count, size, source); + }, + decodeGltfBuffer: function(target, count, size, source, mode, filter) { + decode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]); + }, + decodeGltfBufferAsync: function(count, size, source, mode, filter) { + if (workers.length > 0) { + return decodeWorker(count, size, source, decoders[mode], filters[filter]); + } + + return ready.then(function() { + var target = new Uint8Array(count * size); + decode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]); + return target; + }); + } + }; +})(); + +const _taskCache$1 = new WeakMap(); + +class DRACOLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.decoderPath = ''; + this.decoderConfig = {}; + this.decoderBinary = null; + this.decoderPending = null; + + this.workerLimit = 4; + this.workerPool = []; + this.workerNextTaskID = 1; + this.workerSourceURL = ''; + + this.defaultAttributeIDs = { + position: 'POSITION', + normal: 'NORMAL', + color: 'COLOR', + uv: 'TEX_COORD' + }; + this.defaultAttributeTypes = { + position: 'Float32Array', + normal: 'Float32Array', + color: 'Float32Array', + uv: 'Float32Array' + }; + + } + + setDecoderPath( path ) { + + this.decoderPath = path; + + return this; + + } + + setDecoderConfig( config ) { + + this.decoderConfig = config; + + return this; + + } + + setWorkerLimit( workerLimit ) { + + this.workerLimit = workerLimit; + + return this; + + } + + load( url, onLoad, onProgress, onError ) { + + const loader = new FileLoader( this.manager ); + + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + + loader.load( url, ( buffer ) => { + + this.parse( buffer, onLoad, onError ); + + }, onProgress, onError ); + + } + + + parse( buffer, onLoad, onError = ()=>{} ) { + + this.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace, onError ).catch( onError ); + + } + + decodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) { + + const taskConfig = { + attributeIDs: attributeIDs || this.defaultAttributeIDs, + attributeTypes: attributeTypes || this.defaultAttributeTypes, + useUniqueIDs: !! attributeIDs, + vertexColorSpace: vertexColorSpace, + }; + + return this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError ); + + } + + decodeGeometry( buffer, taskConfig ) { + + const taskKey = JSON.stringify( taskConfig ); + + // Check for an existing task using this buffer. A transferred buffer cannot be transferred + // again from this thread. + if ( _taskCache$1.has( buffer ) ) { + + const cachedTask = _taskCache$1.get( buffer ); + + if ( cachedTask.key === taskKey ) { + + return cachedTask.promise; + + } else if ( buffer.byteLength === 0 ) { + + // Technically, it would be possible to wait for the previous task to complete, + // transfer the buffer back, and decode again with the second configuration. That + // is complex, and I don't know of any reason to decode a Draco buffer twice in + // different ways, so this is left unimplemented. + throw new Error( + + 'THREE.DRACOLoader: Unable to re-decode a buffer with different ' + + 'settings. Buffer has already been transferred.' + + ); + + } + + } + + // + + let worker; + const taskID = this.workerNextTaskID ++; + const taskCost = buffer.byteLength; + + // Obtain a worker and assign a task, and construct a geometry instance + // when the task completes. + const geometryPending = this._getWorker( taskID, taskCost ) + .then( ( _worker ) => { + + worker = _worker; + + return new Promise( ( resolve, reject ) => { + + worker._callbacks[ taskID ] = { resolve, reject }; + + worker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] ); + + // this.debug(); + + } ); + + } ) + .then( ( message ) => this._createGeometry( message.geometry ) ); + + // Remove task from the task list. + // Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416) + geometryPending + .catch( () => true ) + .then( () => { + + if ( worker && taskID ) { + + this._releaseTask( worker, taskID ); + + // this.debug(); + + } + + } ); + + // Cache the task result. + _taskCache$1.set( buffer, { + + key: taskKey, + promise: geometryPending + + } ); + + return geometryPending; + + } + + _createGeometry( geometryData ) { + + const geometry = new BufferGeometry(); + + if ( geometryData.index ) { + + geometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) ); + + } + + for ( let i = 0; i < geometryData.attributes.length; i ++ ) { + + const result = geometryData.attributes[ i ]; + const name = result.name; + const array = result.array; + const itemSize = result.itemSize; + + const attribute = new BufferAttribute( array, itemSize ); + + if ( name === 'color' ) { + + this._assignVertexColorSpace( attribute, result.vertexColorSpace ); + + attribute.normalized = ( array instanceof Float32Array ) === false; + + } + + geometry.setAttribute( name, attribute ); + + } + + return geometry; + + } + + _assignVertexColorSpace( attribute, inputColorSpace ) { + + // While .drc files do not specify colorspace, the only 'official' tooling + // is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc + // file is passed into .load() or .parse(). GLTFLoader uses internal APIs + // to decode geometry, and vertex colors are already Linear-sRGB in there. + + if ( inputColorSpace !== SRGBColorSpace ) return; + + const _color = new Color(); + + for ( let i = 0, il = attribute.count; i < il; i ++ ) { + + _color.fromBufferAttribute( attribute, i ); + ColorManagement.toWorkingColorSpace( _color, SRGBColorSpace ); + attribute.setXYZ( i, _color.r, _color.g, _color.b ); + + } + + } + + _loadLibrary( url, responseType ) { + + const loader = new FileLoader( this.manager ); + loader.setPath( this.decoderPath ); + loader.setResponseType( responseType ); + loader.setWithCredentials( this.withCredentials ); + + return new Promise( ( resolve, reject ) => { + + loader.load( url, resolve, undefined, reject ); + + } ); + + } + + preload() { + + this._initDecoder(); + + return this; + + } + + _initDecoder() { + + if ( this.decoderPending ) return this.decoderPending; + + const useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js'; + const librariesPending = []; + + if ( useJS ) { + + librariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) ); + + } else { + + librariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) ); + librariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) ); + + } + + this.decoderPending = Promise.all( librariesPending ) + .then( ( libraries ) => { + + const jsContent = libraries[ 0 ]; + + if ( ! useJS ) { + + this.decoderConfig.wasmBinary = libraries[ 1 ]; + + } + + const fn = DRACOWorker.toString(); + + const body = [ + '/* draco decoder */', + jsContent, + '', + '/* worker */', + fn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) ) + ].join( '\n' ); + + this.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) ); + + } ); + + return this.decoderPending; + + } + + _getWorker( taskID, taskCost ) { + + return this._initDecoder().then( () => { + + if ( this.workerPool.length < this.workerLimit ) { + + const worker = new Worker( this.workerSourceURL ); + + worker._callbacks = {}; + worker._taskCosts = {}; + worker._taskLoad = 0; + + worker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } ); + + worker.onmessage = function ( e ) { + + const message = e.data; + + switch ( message.type ) { + + case 'decode': + worker._callbacks[ message.id ].resolve( message ); + break; + + case 'error': + worker._callbacks[ message.id ].reject( message ); + break; + + default: + console.error( 'THREE.DRACOLoader: Unexpected message, "' + message.type + '"' ); + + } + + }; + + this.workerPool.push( worker ); + + } else { + + this.workerPool.sort( function ( a, b ) { + + return a._taskLoad > b._taskLoad ? -1 : 1; + + } ); + + } + + const worker = this.workerPool[ this.workerPool.length - 1 ]; + worker._taskCosts[ taskID ] = taskCost; + worker._taskLoad += taskCost; + return worker; + + } ); + + } + + _releaseTask( worker, taskID ) { + + worker._taskLoad -= worker._taskCosts[ taskID ]; + delete worker._callbacks[ taskID ]; + delete worker._taskCosts[ taskID ]; + + } + + debug() { + + console.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) ); + + } + + dispose() { + + for ( let i = 0; i < this.workerPool.length; ++ i ) { + + this.workerPool[ i ].terminate(); + + } + + this.workerPool.length = 0; + + if ( this.workerSourceURL !== '' ) { + + URL.revokeObjectURL( this.workerSourceURL ); + + } + + return this; + + } + +} + +/* WEB WORKER */ + +function DRACOWorker() { + + let decoderConfig; + let decoderPending; + + onmessage = function ( e ) { + + const message = e.data; + + switch ( message.type ) { + + case 'init': + decoderConfig = message.decoderConfig; + decoderPending = new Promise( function ( resolve/*, reject*/ ) { + + decoderConfig.onModuleLoaded = function ( draco ) { + + // Module is Promise-like. Wrap before resolving to avoid loop. + resolve( { draco: draco } ); + + }; + + DracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef + + } ); + break; + + case 'decode': + const buffer = message.buffer; + const taskConfig = message.taskConfig; + decoderPending.then( ( module ) => { + + const draco = module.draco; + const decoder = new draco.Decoder(); + + try { + + const geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig ); + + const buffers = geometry.attributes.map( ( attr ) => attr.array.buffer ); + + if ( geometry.index ) buffers.push( geometry.index.array.buffer ); + + self.postMessage( { type: 'decode', id: message.id, geometry }, buffers ); + + } catch ( error ) { + + console.error( error ); + + self.postMessage( { type: 'error', id: message.id, error: error.message } ); + + } finally { + + draco.destroy( decoder ); + + } + + } ); + break; + + } + + }; + + function decodeGeometry( draco, decoder, array, taskConfig ) { + + const attributeIDs = taskConfig.attributeIDs; + const attributeTypes = taskConfig.attributeTypes; + + let dracoGeometry; + let decodingStatus; + + const geometryType = decoder.GetEncodedGeometryType( array ); + + if ( geometryType === draco.TRIANGULAR_MESH ) { + + dracoGeometry = new draco.Mesh(); + decodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry ); + + } else if ( geometryType === draco.POINT_CLOUD ) { + + dracoGeometry = new draco.PointCloud(); + decodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry ); + + } else { + + throw new Error( 'THREE.DRACOLoader: Unexpected geometry type.' ); + + } + + if ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) { + + throw new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() ); + + } + + const geometry = { index: null, attributes: [] }; + + // Gather all vertex attributes. + for ( const attributeName in attributeIDs ) { + + const attributeType = self[ attributeTypes[ attributeName ] ]; + + let attribute; + let attributeID; + + // A Draco file may be created with default vertex attributes, whose attribute IDs + // are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively, + // a Draco file may contain a custom set of attributes, identified by known unique + // IDs. glTF files always do the latter, and `.drc` files typically do the former. + if ( taskConfig.useUniqueIDs ) { + + attributeID = attributeIDs[ attributeName ]; + attribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID ); + + } else { + + attributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] ); + + if ( attributeID === -1 ) continue; + + attribute = decoder.GetAttribute( dracoGeometry, attributeID ); + + } + + const attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ); + + if ( attributeName === 'color' ) { + + attributeResult.vertexColorSpace = taskConfig.vertexColorSpace; + + } + + geometry.attributes.push( attributeResult ); + + } + + // Add index. + if ( geometryType === draco.TRIANGULAR_MESH ) { + + geometry.index = decodeIndex( draco, decoder, dracoGeometry ); + + } + + draco.destroy( dracoGeometry ); + + return geometry; + + } + + function decodeIndex( draco, decoder, dracoGeometry ) { + + const numFaces = dracoGeometry.num_faces(); + const numIndices = numFaces * 3; + const byteLength = numIndices * 4; + + const ptr = draco._malloc( byteLength ); + decoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr ); + const index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice(); + draco._free( ptr ); + + return { array: index, itemSize: 1 }; + + } + + function decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) { + + const numComponents = attribute.num_components(); + const numPoints = dracoGeometry.num_points(); + const numValues = numPoints * numComponents; + const byteLength = numValues * attributeType.BYTES_PER_ELEMENT; + const dataType = getDracoDataType( draco, attributeType ); + + const ptr = draco._malloc( byteLength ); + decoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr ); + const array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice(); + draco._free( ptr ); + + return { + name: attributeName, + array: array, + itemSize: numComponents + }; + + } + + function getDracoDataType( draco, attributeType ) { + + switch ( attributeType ) { + + case Float32Array: return draco.DT_FLOAT32; + case Int8Array: return draco.DT_INT8; + case Int16Array: return draco.DT_INT16; + case Int32Array: return draco.DT_INT32; + case Uint8Array: return draco.DT_UINT8; + case Uint16Array: return draco.DT_UINT16; + case Uint32Array: return draco.DT_UINT32; + + } + + } + +} + +/** + * @param {BufferGeometry} geometry + * @param {number} drawMode + * @return {BufferGeometry} + */ +function toTrianglesDrawMode( geometry, drawMode ) { + + if ( drawMode === TrianglesDrawMode ) { + + console.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' ); + return geometry; + + } + + if ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) { + + let index = geometry.getIndex(); + + // generate index if not present + + if ( index === null ) { + + const indices = []; + + const position = geometry.getAttribute( 'position' ); + + if ( position !== undefined ) { + + for ( let i = 0; i < position.count; i ++ ) { + + indices.push( i ); + + } + + geometry.setIndex( indices ); + index = geometry.getIndex(); + + } else { + + console.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' ); + return geometry; + + } + + } + + // + + const numberOfTriangles = index.count - 2; + const newIndices = []; + + if ( drawMode === TriangleFanDrawMode ) { + + // gl.TRIANGLE_FAN + + for ( let i = 1; i <= numberOfTriangles; i ++ ) { + + newIndices.push( index.getX( 0 ) ); + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + + } + + } else { + + // gl.TRIANGLE_STRIP + + for ( let i = 0; i < numberOfTriangles; i ++ ) { + + if ( i % 2 === 0 ) { + + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i + 2 ) ); + + } else { + + newIndices.push( index.getX( i + 2 ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i ) ); + + } + + } + + } + + if ( ( newIndices.length / 3 ) !== numberOfTriangles ) { + + console.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' ); + + } + + // build final geometry + + const newGeometry = geometry.clone(); + newGeometry.setIndex( newIndices ); + newGeometry.clearGroups(); + + return newGeometry; + + } else { + + console.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode ); + return geometry; + + } + +} + +class GLTFLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.dracoLoader = null; + this.ktx2Loader = null; + this.meshoptDecoder = null; + + this.pluginCallbacks = []; + + this.register( function ( parser ) { + + return new GLTFMaterialsClearcoatExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsDispersionExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureBasisUExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureWebPExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureAVIFExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsSheenExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsTransmissionExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsVolumeExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsIorExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsEmissiveStrengthExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsSpecularExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsIridescenceExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsAnisotropyExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsBumpExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFLightsExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMeshoptCompression( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMeshGpuInstancing$1( parser ); + + } ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + let resourcePath; + + if ( this.resourcePath !== '' ) { + + resourcePath = this.resourcePath; + + } else if ( this.path !== '' ) { + + // If a base path is set, resources will be relative paths from that plus the relative path of the gltf file + // Example path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf' + // resourcePath = 'https://my-cnd-server.com/assets/models/' + // referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin' + // referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png' + const relativeUrl = LoaderUtils.extractUrlBase( url ); + resourcePath = LoaderUtils.resolveURL( relativeUrl, this.path ); + + } else { + + resourcePath = LoaderUtils.extractUrlBase( url ); + + } + + // Tells the LoadingManager to track an extra item, which resolves after + // the model is fully loaded. This means the count of items loaded will + // be incorrect, but ensures manager.onLoad() does not fire early. + this.manager.itemStart( url ); + + const _onError = function ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + }; + + const loader = new FileLoader( this.manager ); + + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + + loader.load( url, function ( data ) { + + try { + + scope.parse( data, resourcePath, function ( gltf ) { + + onLoad( gltf ); + + scope.manager.itemEnd( url ); + + }, _onError ); + + } catch ( e ) { + + _onError( e ); + + } + + }, onProgress, _onError ); + + } + + setDRACOLoader( dracoLoader ) { + + this.dracoLoader = dracoLoader; + return this; + + } + + setKTX2Loader( ktx2Loader ) { + + this.ktx2Loader = ktx2Loader; + return this; + + } + + setMeshoptDecoder( meshoptDecoder ) { + + this.meshoptDecoder = meshoptDecoder; + return this; + + } + + register( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) === -1 ) { + + this.pluginCallbacks.push( callback ); + + } + + return this; + + } + + unregister( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) !== -1 ) { + + this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 ); + + } + + return this; + + } + + parse( data, path, onLoad, onError ) { + + let json; + const extensions = {}; + const plugins = {}; + const textDecoder = new TextDecoder(); + + if ( typeof data === 'string' ) { + + json = JSON.parse( data ); + + } else if ( data instanceof ArrayBuffer ) { + + const magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) ); + + if ( magic === BINARY_EXTENSION_HEADER_MAGIC ) { + + try { + + extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data ); + + } catch ( error ) { + + if ( onError ) onError( error ); + return; + + } + + json = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content ); + + } else { + + json = JSON.parse( textDecoder.decode( data ) ); + + } + + } else { + + json = data; + + } + + if ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) { + + if ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) ); + return; + + } + + const parser = new GLTFParser( json, { + + path: path || this.resourcePath || '', + crossOrigin: this.crossOrigin, + requestHeader: this.requestHeader, + manager: this.manager, + ktx2Loader: this.ktx2Loader, + meshoptDecoder: this.meshoptDecoder + + } ); + + parser.fileLoader.setRequestHeader( this.requestHeader ); + + for ( let i = 0; i < this.pluginCallbacks.length; i ++ ) { + + const plugin = this.pluginCallbacks[ i ]( parser ); + + if ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' ); + + plugins[ plugin.name ] = plugin; + + // Workaround to avoid determining as unknown extension + // in addUnknownExtensionsToUserData(). + // Remove this workaround if we move all the existing + // extension handlers to plugin system + extensions[ plugin.name ] = true; + + } + + if ( json.extensionsUsed ) { + + for ( let i = 0; i < json.extensionsUsed.length; ++ i ) { + + const extensionName = json.extensionsUsed[ i ]; + const extensionsRequired = json.extensionsRequired || []; + + switch ( extensionName ) { + + case EXTENSIONS.KHR_MATERIALS_UNLIT: + extensions[ extensionName ] = new GLTFMaterialsUnlitExtension$1(); + break; + + case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: + extensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader ); + break; + + case EXTENSIONS.KHR_TEXTURE_TRANSFORM: + extensions[ extensionName ] = new GLTFTextureTransformExtension(); + break; + + case EXTENSIONS.KHR_MESH_QUANTIZATION: + extensions[ extensionName ] = new GLTFMeshQuantizationExtension(); + break; + + default: + + if ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) { + + console.warn( 'THREE.GLTFLoader: Unknown extension "' + extensionName + '".' ); + + } + + } + + } + + } + + parser.setExtensions( extensions ); + parser.setPlugins( plugins ); + parser.parse( onLoad, onError ); + + } + + parseAsync( data, path ) { + + const scope = this; + + return new Promise( function ( resolve, reject ) { + + scope.parse( data, path, resolve, reject ); + + } ); + + } + +} + +/* GLTFREGISTRY */ + +function GLTFRegistry() { + + let objects = {}; + + return { + + get: function ( key ) { + + return objects[ key ]; + + }, + + add: function ( key, object ) { + + objects[ key ] = object; + + }, + + remove: function ( key ) { + + delete objects[ key ]; + + }, + + removeAll: function () { + + objects = {}; + + } + + }; + +} + +/*********************************/ +/********** EXTENSIONS ***********/ +/*********************************/ + +const EXTENSIONS = { + KHR_BINARY_GLTF: 'KHR_binary_glTF', + KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', + KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual', + KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat', + KHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion', + KHR_MATERIALS_IOR: 'KHR_materials_ior', + KHR_MATERIALS_SHEEN: 'KHR_materials_sheen', + KHR_MATERIALS_SPECULAR: 'KHR_materials_specular', + KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission', + KHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence', + KHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy', + KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', + KHR_MATERIALS_VOLUME: 'KHR_materials_volume', + KHR_TEXTURE_BASISU: 'KHR_texture_basisu', + KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform', + KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization', + KHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength', + EXT_MATERIALS_BUMP: 'EXT_materials_bump', + EXT_TEXTURE_WEBP: 'EXT_texture_webp', + EXT_TEXTURE_AVIF: 'EXT_texture_avif', + EXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression', + EXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing' +}; + +/** + * Punctual Lights Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual + */ +class GLTFLightsExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; + + // Object3D instance caches + this.cache = { refs: {}, uses: {} }; + + } + + _markDefs() { + + const parser = this.parser; + const nodeDefs = this.parser.json.nodes || []; + + for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + const nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.extensions + && nodeDef.extensions[ this.name ] + && nodeDef.extensions[ this.name ].light !== undefined ) { + + parser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light ); + + } + + } + + } + + _loadLight( lightIndex ) { + + const parser = this.parser; + const cacheKey = 'light:' + lightIndex; + let dependency = parser.cache.get( cacheKey ); + + if ( dependency ) return dependency; + + const json = parser.json; + const extensions = ( json.extensions && json.extensions[ this.name ] ) || {}; + const lightDefs = extensions.lights || []; + const lightDef = lightDefs[ lightIndex ]; + let lightNode; + + const color = new Color( 0xffffff ); + + if ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace ); + + const range = lightDef.range !== undefined ? lightDef.range : 0; + + switch ( lightDef.type ) { + + case 'directional': + lightNode = new DirectionalLight( color ); + lightNode.target.position.set( 0, 0, -1 ); + lightNode.add( lightNode.target ); + break; + + case 'point': + lightNode = new PointLight( color ); + lightNode.distance = range; + break; + + case 'spot': + lightNode = new SpotLight( color ); + lightNode.distance = range; + // Handle spotlight properties. + lightDef.spot = lightDef.spot || {}; + lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0; + lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0; + lightNode.angle = lightDef.spot.outerConeAngle; + lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; + lightNode.target.position.set( 0, 0, -1 ); + lightNode.add( lightNode.target ); + break; + + default: + throw new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type ); + + } + + // Some lights (e.g. spot) default to a position other than the origin. Reset the position + // here, because node-level parsing will only override position if explicitly specified. + lightNode.position.set( 0, 0, 0 ); + + assignExtrasToUserData( lightNode, lightDef ); + + if ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity; + + lightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) ); + + dependency = Promise.resolve( lightNode ); + + parser.cache.add( cacheKey, dependency ); + + return dependency; + + } + + getDependency( type, index ) { + + if ( type !== 'light' ) return; + + return this._loadLight( index ); + + } + + createNodeAttachment( nodeIndex ) { + + const self = this; + const parser = this.parser; + const json = parser.json; + const nodeDef = json.nodes[ nodeIndex ]; + const lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {}; + const lightIndex = lightDef.light; + + if ( lightIndex === undefined ) return null; + + return this._loadLight( lightIndex ).then( function ( light ) { + + return parser._getNodeRef( self.cache, lightIndex, light ); + + } ); + + } + +} + +/** + * Unlit Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit + */ +let GLTFMaterialsUnlitExtension$1 = class GLTFMaterialsUnlitExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + + } + + getMaterialType() { + + return MeshBasicMaterial; + + } + + extendParams( materialParams, materialDef, parser ) { + + const pending = []; + + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + const metallicRoughness = materialDef.pbrMetallicRoughness; + + if ( metallicRoughness ) { + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + const array = metallicRoughness.baseColorFactor; + + materialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) ); + + } + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Materials Emissive Strength Extension + * + * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md + */ +let GLTFMaterialsEmissiveStrengthExtension$1 = class GLTFMaterialsEmissiveStrengthExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength; + + if ( emissiveStrength !== undefined ) { + + materialParams.emissiveIntensity = emissiveStrength; + + } + + return Promise.resolve(); + + } + +}; + +/** + * Clearcoat Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat + */ +let GLTFMaterialsClearcoatExtension$1 = class GLTFMaterialsClearcoatExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.clearcoatFactor !== undefined ) { + + materialParams.clearcoat = extension.clearcoatFactor; + + } + + if ( extension.clearcoatTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) ); + + } + + if ( extension.clearcoatRoughnessFactor !== undefined ) { + + materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; + + } + + if ( extension.clearcoatRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) ); + + } + + if ( extension.clearcoatNormalTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) ); + + if ( extension.clearcoatNormalTexture.scale !== undefined ) { + + const scale = extension.clearcoatNormalTexture.scale; + + materialParams.clearcoatNormalScale = new Vector2( scale, scale ); + + } + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Materials dispersion Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion + */ +let GLTFMaterialsDispersionExtension$1 = class GLTFMaterialsDispersionExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_DISPERSION; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const extension = materialDef.extensions[ this.name ]; + + materialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0; + + return Promise.resolve(); + + } + +}; + +/** + * Iridescence Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence + */ +let GLTFMaterialsIridescenceExtension$1 = class GLTFMaterialsIridescenceExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.iridescenceFactor !== undefined ) { + + materialParams.iridescence = extension.iridescenceFactor; + + } + + if ( extension.iridescenceTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) ); + + } + + if ( extension.iridescenceIor !== undefined ) { + + materialParams.iridescenceIOR = extension.iridescenceIor; + + } + + if ( materialParams.iridescenceThicknessRange === undefined ) { + + materialParams.iridescenceThicknessRange = [ 100, 400 ]; + + } + + if ( extension.iridescenceThicknessMinimum !== undefined ) { + + materialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum; + + } + + if ( extension.iridescenceThicknessMaximum !== undefined ) { + + materialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum; + + } + + if ( extension.iridescenceThicknessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Sheen Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen + */ +let GLTFMaterialsSheenExtension$1 = class GLTFMaterialsSheenExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_SHEEN; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + materialParams.sheenColor = new Color( 0, 0, 0 ); + materialParams.sheenRoughness = 0; + materialParams.sheen = 1; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.sheenColorFactor !== undefined ) { + + const colorFactor = extension.sheenColorFactor; + materialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace ); + + } + + if ( extension.sheenRoughnessFactor !== undefined ) { + + materialParams.sheenRoughness = extension.sheenRoughnessFactor; + + } + + if ( extension.sheenColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) ); + + } + + if ( extension.sheenRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Transmission Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission + * Draft: https://github.com/KhronosGroup/glTF/pull/1698 + */ +let GLTFMaterialsTransmissionExtension$1 = class GLTFMaterialsTransmissionExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.transmissionFactor !== undefined ) { + + materialParams.transmission = extension.transmissionFactor; + + } + + if ( extension.transmissionTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Materials Volume Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume + */ +let GLTFMaterialsVolumeExtension$1 = class GLTFMaterialsVolumeExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_VOLUME; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + materialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0; + + if ( extension.thicknessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) ); + + } + + materialParams.attenuationDistance = extension.attenuationDistance || Infinity; + + const colorArray = extension.attenuationColor || [ 1, 1, 1 ]; + materialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace ); + + return Promise.all( pending ); + + } + +}; + +/** + * Materials ior Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior + */ +let GLTFMaterialsIorExtension$1 = class GLTFMaterialsIorExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_IOR; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const extension = materialDef.extensions[ this.name ]; + + materialParams.ior = extension.ior !== undefined ? extension.ior : 1.5; + + return Promise.resolve(); + + } + +}; + +/** + * Materials specular Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular + */ +let GLTFMaterialsSpecularExtension$1 = class GLTFMaterialsSpecularExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_SPECULAR; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + materialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0; + + if ( extension.specularTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) ); + + } + + const colorArray = extension.specularColorFactor || [ 1, 1, 1 ]; + materialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace ); + + if ( extension.specularColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) ); + + } + + return Promise.all( pending ); + + } + +}; + + +/** + * Materials bump Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump + */ +let GLTFMaterialsBumpExtension$1 = class GLTFMaterialsBumpExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.EXT_MATERIALS_BUMP; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + materialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0; + + if ( extension.bumpTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Materials anisotropy Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy + */ +let GLTFMaterialsAnisotropyExtension$1 = class GLTFMaterialsAnisotropyExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.anisotropyStrength !== undefined ) { + + materialParams.anisotropy = extension.anisotropyStrength; + + } + + if ( extension.anisotropyRotation !== undefined ) { + + materialParams.anisotropyRotation = extension.anisotropyRotation; + + } + + if ( extension.anisotropyTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * BasisU Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu + */ +class GLTFTextureBasisUExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_TEXTURE_BASISU; + + } + + loadTexture( textureIndex ) { + + const parser = this.parser; + const json = parser.json; + + const textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) { + + return null; + + } + + const extension = textureDef.extensions[ this.name ]; + const loader = parser.options.ktx2Loader; + + if ( ! loader ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' ); + + } else { + + // Assumes that the extension is optional and that a fallback texture is present + return null; + + } + + } + + return parser.loadTextureImage( textureIndex, extension.source, loader ); + + } + +} + +/** + * WebP Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp + */ +class GLTFTextureWebPExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.EXT_TEXTURE_WEBP; + this.isSupported = null; + + } + + loadTexture( textureIndex ) { + + const name = this.name; + const parser = this.parser; + const json = parser.json; + + const textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) { + + return null; + + } + + const extension = textureDef.extensions[ name ]; + const source = json.images[ extension.source ]; + + let loader = parser.textureLoader; + if ( source.uri ) { + + const handler = parser.options.manager.getHandler( source.uri ); + if ( handler !== null ) loader = handler; + + } + + return this.detectSupport().then( function ( isSupported ) { + + if ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader ); + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' ); + + } + + // Fall back to PNG or JPEG. + return parser.loadTexture( textureIndex ); + + } ); + + } + + detectSupport() { + + if ( ! this.isSupported ) { + + this.isSupported = new Promise( function ( resolve ) { + + const image = new Image(); + + // Lossy test image. Support for lossy images doesn't guarantee support for all + // WebP images, unfortunately. + image.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'; + + image.onload = image.onerror = function () { + + resolve( image.height === 1 ); + + }; + + } ); + + } + + return this.isSupported; + + } + +} + +/** + * AVIF Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif + */ +class GLTFTextureAVIFExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.EXT_TEXTURE_AVIF; + this.isSupported = null; + + } + + loadTexture( textureIndex ) { + + const name = this.name; + const parser = this.parser; + const json = parser.json; + + const textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) { + + return null; + + } + + const extension = textureDef.extensions[ name ]; + const source = json.images[ extension.source ]; + + let loader = parser.textureLoader; + if ( source.uri ) { + + const handler = parser.options.manager.getHandler( source.uri ); + if ( handler !== null ) loader = handler; + + } + + return this.detectSupport().then( function ( isSupported ) { + + if ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader ); + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' ); + + } + + // Fall back to PNG or JPEG. + return parser.loadTexture( textureIndex ); + + } ); + + } + + detectSupport() { + + if ( ! this.isSupported ) { + + this.isSupported = new Promise( function ( resolve ) { + + const image = new Image(); + + // Lossy test image. + image.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI='; + image.onload = image.onerror = function () { + + resolve( image.height === 1 ); + + }; + + } ); + + } + + return this.isSupported; + + } + +} + +/** + * meshopt BufferView Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression + */ +class GLTFMeshoptCompression { + + constructor( parser ) { + + this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; + this.parser = parser; + + } + + loadBufferView( index ) { + + const json = this.parser.json; + const bufferView = json.bufferViews[ index ]; + + if ( bufferView.extensions && bufferView.extensions[ this.name ] ) { + + const extensionDef = bufferView.extensions[ this.name ]; + + const buffer = this.parser.getDependency( 'buffer', extensionDef.buffer ); + const decoder = this.parser.options.meshoptDecoder; + + if ( ! decoder || ! decoder.supported ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' ); + + } else { + + // Assumes that the extension is optional and that fallback buffer data is present + return null; + + } + + } + + return buffer.then( function ( res ) { + + const byteOffset = extensionDef.byteOffset || 0; + const byteLength = extensionDef.byteLength || 0; + + const count = extensionDef.count; + const stride = extensionDef.byteStride; + + const source = new Uint8Array( res, byteOffset, byteLength ); + + if ( decoder.decodeGltfBufferAsync ) { + + return decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) { + + return res.buffer; + + } ); + + } else { + + // Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync + return decoder.ready.then( function () { + + const result = new ArrayBuffer( count * stride ); + decoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter ); + return result; + + } ); + + } + + } ); + + } else { + + return null; + + } + + } + +} + +/** + * GPU Instancing Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing + * + */ +let GLTFMeshGpuInstancing$1 = class GLTFMeshGpuInstancing { + + constructor( parser ) { + + this.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING; + this.parser = parser; + + } + + createNodeMesh( nodeIndex ) { + + const json = this.parser.json; + const nodeDef = json.nodes[ nodeIndex ]; + + if ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] || + nodeDef.mesh === undefined ) { + + return null; + + } + + const meshDef = json.meshes[ nodeDef.mesh ]; + + // No Points or Lines + Instancing support yet + + for ( const primitive of meshDef.primitives ) { + + if ( primitive.mode !== WEBGL_CONSTANTS$1.TRIANGLES && + primitive.mode !== WEBGL_CONSTANTS$1.TRIANGLE_STRIP && + primitive.mode !== WEBGL_CONSTANTS$1.TRIANGLE_FAN && + primitive.mode !== undefined ) { + + return null; + + } + + } + + const extensionDef = nodeDef.extensions[ this.name ]; + const attributesDef = extensionDef.attributes; + + // @TODO: Can we support InstancedMesh + SkinnedMesh? + + const pending = []; + const attributes = {}; + + for ( const key in attributesDef ) { + + pending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => { + + attributes[ key ] = accessor; + return attributes[ key ]; + + } ) ); + + } + + if ( pending.length < 1 ) { + + return null; + + } + + pending.push( this.parser.createNodeMesh( nodeIndex ) ); + + return Promise.all( pending ).then( results => { + + const nodeObject = results.pop(); + const meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ]; + const count = results[ 0 ].count; // All attribute counts should be same + const instancedMeshes = []; + + for ( const mesh of meshes ) { + + // Temporal variables + const m = new Matrix4(); + const p = new Vector3(); + const q = new Quaternion(); + const s = new Vector3( 1, 1, 1 ); + + const instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count ); + + for ( let i = 0; i < count; i ++ ) { + + if ( attributes.TRANSLATION ) { + + p.fromBufferAttribute( attributes.TRANSLATION, i ); + + } + + if ( attributes.ROTATION ) { + + q.fromBufferAttribute( attributes.ROTATION, i ); + + } + + if ( attributes.SCALE ) { + + s.fromBufferAttribute( attributes.SCALE, i ); + + } + + instancedMesh.setMatrixAt( i, m.compose( p, q, s ) ); + + } + + // Add instance attributes to the geometry, excluding TRS. + for ( const attributeName in attributes ) { + + if ( attributeName === '_COLOR_0' ) { + + const attr = attributes[ attributeName ]; + instancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized ); + + } else if ( attributeName !== 'TRANSLATION' && + attributeName !== 'ROTATION' && + attributeName !== 'SCALE' ) { + + mesh.geometry.setAttribute( attributeName, attributes[ attributeName ] ); + + } + + } + + // Just in case + Object3D.prototype.copy.call( instancedMesh, mesh ); + + this.parser.assignFinalMaterial( instancedMesh ); + + instancedMeshes.push( instancedMesh ); + + } + + if ( nodeObject.isGroup ) { + + nodeObject.clear(); + + nodeObject.add( ... instancedMeshes ); + + return nodeObject; + + } + + return instancedMeshes[ 0 ]; + + } ); + + } + +}; + +/* BINARY EXTENSION */ +const BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; +const BINARY_EXTENSION_HEADER_LENGTH = 12; +const BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; + +class GLTFBinaryExtension { + + constructor( data ) { + + this.name = EXTENSIONS.KHR_BINARY_GLTF; + this.content = null; + this.body = null; + + const headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH ); + const textDecoder = new TextDecoder(); + + this.header = { + magic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ), + version: headerView.getUint32( 4, true ), + length: headerView.getUint32( 8, true ) + }; + + if ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) { + + throw new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' ); + + } else if ( this.header.version < 2.0 ) { + + throw new Error( 'THREE.GLTFLoader: Legacy binary file detected.' ); + + } + + const chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH; + const chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH ); + let chunkIndex = 0; + + while ( chunkIndex < chunkContentsLength ) { + + const chunkLength = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + const chunkType = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) { + + const contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength ); + this.content = textDecoder.decode( contentArray ); + + } else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) { + + const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; + this.body = data.slice( byteOffset, byteOffset + chunkLength ); + + } + + // Clients must ignore chunks with unknown types. + + chunkIndex += chunkLength; + + } + + if ( this.content === null ) { + + throw new Error( 'THREE.GLTFLoader: JSON content not found.' ); + + } + + } + +} + +/** + * DRACO Mesh Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression + */ +class GLTFDracoMeshCompressionExtension { + + constructor( json, dracoLoader ) { + + if ( ! dracoLoader ) { + + throw new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' ); + + } + + this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; + this.json = json; + this.dracoLoader = dracoLoader; + this.dracoLoader.preload(); + + } + + decodePrimitive( primitive, parser ) { + + const json = this.json; + const dracoLoader = this.dracoLoader; + const bufferViewIndex = primitive.extensions[ this.name ].bufferView; + const gltfAttributeMap = primitive.extensions[ this.name ].attributes; + const threeAttributeMap = {}; + const attributeNormalizedMap = {}; + const attributeTypeMap = {}; + + for ( const attributeName in gltfAttributeMap ) { + + const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + threeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ]; + + } + + for ( const attributeName in primitive.attributes ) { + + const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + if ( gltfAttributeMap[ attributeName ] !== undefined ) { + + const accessorDef = json.accessors[ primitive.attributes[ attributeName ] ]; + const componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + attributeTypeMap[ threeAttributeName ] = componentType.name; + attributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true; + + } + + } + + return parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) { + + return new Promise( function ( resolve, reject ) { + + dracoLoader.decodeDracoFile( bufferView, function ( geometry ) { + + for ( const attributeName in geometry.attributes ) { + + const attribute = geometry.attributes[ attributeName ]; + const normalized = attributeNormalizedMap[ attributeName ]; + + if ( normalized !== undefined ) attribute.normalized = normalized; + + } + + resolve( geometry ); + + }, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject ); + + } ); + + } ); + + } + +} + +/** + * Texture Transform Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform + */ +class GLTFTextureTransformExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; + + } + + extendTexture( texture, transform ) { + + if ( ( transform.texCoord === undefined || transform.texCoord === texture.channel ) + && transform.offset === undefined + && transform.rotation === undefined + && transform.scale === undefined ) { + + // See https://github.com/mrdoob/three.js/issues/21819. + return texture; + + } + + texture = texture.clone(); + + if ( transform.texCoord !== undefined ) { + + texture.channel = transform.texCoord; + + } + + if ( transform.offset !== undefined ) { + + texture.offset.fromArray( transform.offset ); + + } + + if ( transform.rotation !== undefined ) { + + texture.rotation = transform.rotation; + + } + + if ( transform.scale !== undefined ) { + + texture.repeat.fromArray( transform.scale ); + + } + + texture.needsUpdate = true; + + return texture; + + } + +} + +/** + * Mesh Quantization Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization + */ +class GLTFMeshQuantizationExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; + + } + +} + +/*********************************/ +/********** INTERPOLATION ********/ +/*********************************/ + +// Spline Interpolation +// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation +class GLTFCubicSplineInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + copySampleValue_( index ) { + + // Copies a sample value to the result buffer. See description of glTF + // CUBICSPLINE values layout in interpolate_() function below. + + const result = this.resultBuffer, + values = this.sampleValues, + valueSize = this.valueSize, + offset = index * valueSize * 3 + valueSize; + + for ( let i = 0; i !== valueSize; i ++ ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer; + const values = this.sampleValues; + const stride = this.valueSize; + + const stride2 = stride * 2; + const stride3 = stride * 3; + + const td = t1 - t0; + + const p = ( t - t0 ) / td; + const pp = p * p; + const ppp = pp * p; + + const offset1 = i1 * stride3; + const offset0 = offset1 - stride3; + + const s2 = -2 * ppp + 3 * pp; + const s3 = ppp - pp; + const s0 = 1 - s2; + const s1 = s3 - pp + p; + + // Layout of keyframe output values for CUBICSPLINE animations: + // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] + for ( let i = 0; i !== stride; i ++ ) { + + const p0 = values[ offset0 + i + stride ]; // splineVertex_k + const m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k) + const p1 = values[ offset1 + i + stride ]; // splineVertex_k+1 + const m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k) + + result[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + + } + + return result; + + } + +} + +const _q = new Quaternion(); + +class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant { + + interpolate_( i1, t0, t, t1 ) { + + const result = super.interpolate_( i1, t0, t, t1 ); + + _q.fromArray( result ).normalize().toArray( result ); + + return result; + + } + +} + + +/*********************************/ +/********** INTERNALS ************/ +/*********************************/ + +/* CONSTANTS */ + +const WEBGL_CONSTANTS$1 = { + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6}; + +const WEBGL_COMPONENT_TYPES = { + 5120: Int8Array, + 5121: Uint8Array, + 5122: Int16Array, + 5123: Uint16Array, + 5125: Uint32Array, + 5126: Float32Array +}; + +const WEBGL_FILTERS = { + 9728: NearestFilter, + 9729: LinearFilter, + 9984: NearestMipmapNearestFilter, + 9985: LinearMipmapNearestFilter, + 9986: NearestMipmapLinearFilter, + 9987: LinearMipmapLinearFilter +}; + +const WEBGL_WRAPPINGS = { + 33071: ClampToEdgeWrapping, + 33648: MirroredRepeatWrapping, + 10497: RepeatWrapping +}; + +const WEBGL_TYPE_SIZES = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4, + 'MAT2': 4, + 'MAT3': 9, + 'MAT4': 16 +}; + +const ATTRIBUTES = { + POSITION: 'position', + NORMAL: 'normal', + TANGENT: 'tangent', + TEXCOORD_0: 'uv', + TEXCOORD_1: 'uv1', + TEXCOORD_2: 'uv2', + TEXCOORD_3: 'uv3', + COLOR_0: 'color', + WEIGHTS_0: 'skinWeight', + JOINTS_0: 'skinIndex', +}; + +const PATH_PROPERTIES$1 = { + scale: 'scale', + translation: 'position', + rotation: 'quaternion', + weights: 'morphTargetInfluences' +}; + +const INTERPOLATION = { + CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each + // keyframe track will be initialized with a default interpolation type, then modified. + LINEAR: InterpolateLinear, + STEP: InterpolateDiscrete +}; + +const ALPHA_MODES = { + OPAQUE: 'OPAQUE', + MASK: 'MASK', + BLEND: 'BLEND' +}; + +/** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material + * + * @param {Object} cache + * @return {Material} + */ +function createDefaultMaterial( cache ) { + + if ( cache[ 'DefaultMaterial' ] === undefined ) { + + cache[ 'DefaultMaterial' ] = new MeshStandardMaterial( { + color: 0xFFFFFF, + emissive: 0x000000, + metalness: 1, + roughness: 1, + transparent: false, + depthTest: true, + side: FrontSide + } ); + + } + + return cache[ 'DefaultMaterial' ]; + +} + +function addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) { + + // Add unknown glTF extensions to an object's userData. + + for ( const name in objectDef.extensions ) { + + if ( knownExtensions[ name ] === undefined ) { + + object.userData.gltfExtensions = object.userData.gltfExtensions || {}; + object.userData.gltfExtensions[ name ] = objectDef.extensions[ name ]; + + } + + } + +} + +/** + * @param {Object3D|Material|BufferGeometry} object + * @param {GLTF.definition} gltfDef + */ +function assignExtrasToUserData( object, gltfDef ) { + + if ( gltfDef.extras !== undefined ) { + + if ( typeof gltfDef.extras === 'object' ) { + + Object.assign( object.userData, gltfDef.extras ); + + } else { + + console.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras ); + + } + + } + +} + +/** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets + * + * @param {BufferGeometry} geometry + * @param {Array} targets + * @param {GLTFParser} parser + * @return {Promise} + */ +function addMorphTargets( geometry, targets, parser ) { + + let hasMorphPosition = false; + let hasMorphNormal = false; + let hasMorphColor = false; + + for ( let i = 0, il = targets.length; i < il; i ++ ) { + + const target = targets[ i ]; + + if ( target.POSITION !== undefined ) hasMorphPosition = true; + if ( target.NORMAL !== undefined ) hasMorphNormal = true; + if ( target.COLOR_0 !== undefined ) hasMorphColor = true; + + if ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break; + + } + + if ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry ); + + const pendingPositionAccessors = []; + const pendingNormalAccessors = []; + const pendingColorAccessors = []; + + for ( let i = 0, il = targets.length; i < il; i ++ ) { + + const target = targets[ i ]; + + if ( hasMorphPosition ) { + + const pendingAccessor = target.POSITION !== undefined + ? parser.getDependency( 'accessor', target.POSITION ) + : geometry.attributes.position; + + pendingPositionAccessors.push( pendingAccessor ); + + } + + if ( hasMorphNormal ) { + + const pendingAccessor = target.NORMAL !== undefined + ? parser.getDependency( 'accessor', target.NORMAL ) + : geometry.attributes.normal; + + pendingNormalAccessors.push( pendingAccessor ); + + } + + if ( hasMorphColor ) { + + const pendingAccessor = target.COLOR_0 !== undefined + ? parser.getDependency( 'accessor', target.COLOR_0 ) + : geometry.attributes.color; + + pendingColorAccessors.push( pendingAccessor ); + + } + + } + + return Promise.all( [ + Promise.all( pendingPositionAccessors ), + Promise.all( pendingNormalAccessors ), + Promise.all( pendingColorAccessors ) + ] ).then( function ( accessors ) { + + const morphPositions = accessors[ 0 ]; + const morphNormals = accessors[ 1 ]; + const morphColors = accessors[ 2 ]; + + if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions; + if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals; + if ( hasMorphColor ) geometry.morphAttributes.color = morphColors; + geometry.morphTargetsRelative = true; + + return geometry; + + } ); + +} + +/** + * @param {Mesh} mesh + * @param {GLTF.Mesh} meshDef + */ +function updateMorphTargets( mesh, meshDef ) { + + mesh.updateMorphTargets(); + + if ( meshDef.weights !== undefined ) { + + for ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) { + + mesh.morphTargetInfluences[ i ] = meshDef.weights[ i ]; + + } + + } + + // .extras has user-defined data, so check that .extras.targetNames is an array. + if ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) { + + const targetNames = meshDef.extras.targetNames; + + if ( mesh.morphTargetInfluences.length === targetNames.length ) { + + mesh.morphTargetDictionary = {}; + + for ( let i = 0, il = targetNames.length; i < il; i ++ ) { + + mesh.morphTargetDictionary[ targetNames[ i ] ] = i; + + } + + } else { + + console.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' ); + + } + + } + +} + +function createPrimitiveKey( primitiveDef ) { + + let geometryKey; + + const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]; + + if ( dracoExtension ) { + + geometryKey = 'draco:' + dracoExtension.bufferView + + ':' + dracoExtension.indices + + ':' + createAttributesKey( dracoExtension.attributes ); + + } else { + + geometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode; + + } + + if ( primitiveDef.targets !== undefined ) { + + for ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) { + + geometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] ); + + } + + } + + return geometryKey; + +} + +function createAttributesKey( attributes ) { + + let attributesKey = ''; + + const keys = Object.keys( attributes ).sort(); + + for ( let i = 0, il = keys.length; i < il; i ++ ) { + + attributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';'; + + } + + return attributesKey; + +} + +function getNormalizedComponentScale( constructor ) { + + // Reference: + // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data + + switch ( constructor ) { + + case Int8Array: + return 1 / 127; + + case Uint8Array: + return 1 / 255; + + case Int16Array: + return 1 / 32767; + + case Uint16Array: + return 1 / 65535; + + default: + throw new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' ); + + } + +} + +function getImageURIMimeType( uri ) { + + if ( uri.search( /\.jpe?g($|\?)/i ) > 0 || uri.search( /^data\:image\/jpeg/ ) === 0 ) return 'image/jpeg'; + if ( uri.search( /\.webp($|\?)/i ) > 0 || uri.search( /^data\:image\/webp/ ) === 0 ) return 'image/webp'; + if ( uri.search( /\.ktx2($|\?)/i ) > 0 || uri.search( /^data\:image\/ktx2/ ) === 0 ) return 'image/ktx2'; + + return 'image/png'; + +} + +const _identityMatrix = new Matrix4(); + +/* GLTF PARSER */ + +class GLTFParser { + + constructor( json = {}, options = {} ) { + + this.json = json; + this.extensions = {}; + this.plugins = {}; + this.options = options; + + // loader object cache + this.cache = new GLTFRegistry(); + + // associations between Three.js objects and glTF elements + this.associations = new Map(); + + // BufferGeometry caching + this.primitiveCache = {}; + + // Node cache + this.nodeCache = {}; + + // Object3D instance caches + this.meshCache = { refs: {}, uses: {} }; + this.cameraCache = { refs: {}, uses: {} }; + this.lightCache = { refs: {}, uses: {} }; + + this.sourceCache = {}; + this.textureCache = {}; + + // Track node names, to ensure no duplicates + this.nodeNamesUsed = {}; + + // Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the + // expensive work of uploading a texture to the GPU off the main thread. + + let isSafari = false; + let safariVersion = -1; + let isFirefox = false; + let firefoxVersion = -1; + + if ( typeof navigator !== 'undefined' ) { + + const userAgent = navigator.userAgent; + + isSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true; + const safariMatch = userAgent.match( /Version\/(\d+)/ ); + safariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : -1; + + isFirefox = userAgent.indexOf( 'Firefox' ) > -1; + firefoxVersion = isFirefox ? userAgent.match( /Firefox\/([0-9]+)\./ )[ 1 ] : -1; + + } + + if ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) { + + this.textureLoader = new TextureLoader( this.options.manager ); + + } else { + + this.textureLoader = new ImageBitmapLoader( this.options.manager ); + + } + + this.textureLoader.setCrossOrigin( this.options.crossOrigin ); + this.textureLoader.setRequestHeader( this.options.requestHeader ); + + this.fileLoader = new FileLoader( this.options.manager ); + this.fileLoader.setResponseType( 'arraybuffer' ); + + if ( this.options.crossOrigin === 'use-credentials' ) { + + this.fileLoader.setWithCredentials( true ); + + } + + } + + setExtensions( extensions ) { + + this.extensions = extensions; + + } + + setPlugins( plugins ) { + + this.plugins = plugins; + + } + + parse( onLoad, onError ) { + + const parser = this; + const json = this.json; + const extensions = this.extensions; + + // Clear the loader cache + this.cache.removeAll(); + this.nodeCache = {}; + + // Mark the special nodes/meshes in json for efficient parse + this._invokeAll( function ( ext ) { + + return ext._markDefs && ext._markDefs(); + + } ); + + Promise.all( this._invokeAll( function ( ext ) { + + return ext.beforeRoot && ext.beforeRoot(); + + } ) ).then( function () { + + return Promise.all( [ + + parser.getDependencies( 'scene' ), + parser.getDependencies( 'animation' ), + parser.getDependencies( 'camera' ), + + ] ); + + } ).then( function ( dependencies ) { + + const result = { + scene: dependencies[ 0 ][ json.scene || 0 ], + scenes: dependencies[ 0 ], + animations: dependencies[ 1 ], + cameras: dependencies[ 2 ], + asset: json.asset, + parser: parser, + userData: {} + }; + + addUnknownExtensionsToUserData( extensions, result, json ); + + assignExtrasToUserData( result, json ); + + return Promise.all( parser._invokeAll( function ( ext ) { + + return ext.afterRoot && ext.afterRoot( result ); + + } ) ).then( function () { + + for ( const scene of result.scenes ) { + + scene.updateMatrixWorld(); + + } + + onLoad( result ); + + } ); + + } ).catch( onError ); + + } + + /** + * Marks the special nodes/meshes in json for efficient parse. + */ + _markDefs() { + + const nodeDefs = this.json.nodes || []; + const skinDefs = this.json.skins || []; + const meshDefs = this.json.meshes || []; + + // Nothing in the node definition indicates whether it is a Bone or an + // Object3D. Use the skins' joint references to mark bones. + for ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) { + + const joints = skinDefs[ skinIndex ].joints; + + for ( let i = 0, il = joints.length; i < il; i ++ ) { + + nodeDefs[ joints[ i ] ].isBone = true; + + } + + } + + // Iterate over all nodes, marking references to shared resources, + // as well as skeleton joints. + for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + const nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.mesh !== undefined ) { + + this._addNodeRef( this.meshCache, nodeDef.mesh ); + + // Nothing in the mesh definition indicates whether it is + // a SkinnedMesh or Mesh. Use the node's mesh reference + // to mark SkinnedMesh if node has skin. + if ( nodeDef.skin !== undefined ) { + + meshDefs[ nodeDef.mesh ].isSkinnedMesh = true; + + } + + } + + if ( nodeDef.camera !== undefined ) { + + this._addNodeRef( this.cameraCache, nodeDef.camera ); + + } + + } + + } + + /** + * Counts references to shared node / Object3D resources. These resources + * can be reused, or "instantiated", at multiple nodes in the scene + * hierarchy. Mesh, Camera, and Light instances are instantiated and must + * be marked. Non-scenegraph resources (like Materials, Geometries, and + * Textures) can be reused directly and are not marked here. + * + * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. + * + * @param {Object} cache + * @param {Object3D} index + */ + _addNodeRef( cache, index ) { + + if ( index === undefined ) return; + + if ( cache.refs[ index ] === undefined ) { + + cache.refs[ index ] = cache.uses[ index ] = 0; + + } + + cache.refs[ index ] ++; + + } + + /** + * Returns a reference to a shared resource, cloning it if necessary. + * + * @param {Object} cache + * @param {number} index + * @param {Object} object + * @return {Object} + */ + _getNodeRef( cache, index, object ) { + + if ( cache.refs[ index ] <= 1 ) return object; + + const ref = object.clone(); + + // Propagates mappings to the cloned object, prevents mappings on the + // original object from being lost. + const updateMappings = ( original, clone ) => { + + const mappings = this.associations.get( original ); + if ( mappings != null ) { + + this.associations.set( clone, mappings ); + + } + + for ( const [ i, child ] of original.children.entries() ) { + + updateMappings( child, clone.children[ i ] ); + + } + + }; + + updateMappings( object, ref ); + + ref.name += '_instance_' + ( cache.uses[ index ] ++ ); + + return ref; + + } + + _invokeOne( func ) { + + const extensions = Object.values( this.plugins ); + extensions.push( this ); + + for ( let i = 0; i < extensions.length; i ++ ) { + + const result = func( extensions[ i ] ); + + if ( result ) return result; + + } + + return null; + + } + + _invokeAll( func ) { + + const extensions = Object.values( this.plugins ); + extensions.unshift( this ); + + const pending = []; + + for ( let i = 0; i < extensions.length; i ++ ) { + + const result = func( extensions[ i ] ); + + if ( result ) pending.push( result ); + + } + + return pending; + + } + + /** + * Requests the specified dependency asynchronously, with caching. + * @param {string} type + * @param {number} index + * @return {Promise} + */ + getDependency( type, index ) { + + const cacheKey = type + ':' + index; + let dependency = this.cache.get( cacheKey ); + + if ( ! dependency ) { + + switch ( type ) { + + case 'scene': + dependency = this.loadScene( index ); + break; + + case 'node': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadNode && ext.loadNode( index ); + + } ); + break; + + case 'mesh': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMesh && ext.loadMesh( index ); + + } ); + break; + + case 'accessor': + dependency = this.loadAccessor( index ); + break; + + case 'bufferView': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadBufferView && ext.loadBufferView( index ); + + } ); + break; + + case 'buffer': + dependency = this.loadBuffer( index ); + break; + + case 'material': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMaterial && ext.loadMaterial( index ); + + } ); + break; + + case 'texture': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadTexture && ext.loadTexture( index ); + + } ); + break; + + case 'skin': + dependency = this.loadSkin( index ); + break; + + case 'animation': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadAnimation && ext.loadAnimation( index ); + + } ); + break; + + case 'camera': + dependency = this.loadCamera( index ); + break; + + default: + dependency = this._invokeOne( function ( ext ) { + + return ext != this && ext.getDependency && ext.getDependency( type, index ); + + } ); + + if ( ! dependency ) { + + throw new Error( 'Unknown type: ' + type ); + + } + + break; + + } + + this.cache.add( cacheKey, dependency ); + + } + + return dependency; + + } + + /** + * Requests all dependencies of the specified type asynchronously, with caching. + * @param {string} type + * @return {Promise>} + */ + getDependencies( type ) { + + let dependencies = this.cache.get( type ); + + if ( ! dependencies ) { + + const parser = this; + const defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || []; + + dependencies = Promise.all( defs.map( function ( def, index ) { + + return parser.getDependency( type, index ); + + } ) ); + + this.cache.add( type, dependencies ); + + } + + return dependencies; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferIndex + * @return {Promise} + */ + loadBuffer( bufferIndex ) { + + const bufferDef = this.json.buffers[ bufferIndex ]; + const loader = this.fileLoader; + + if ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) { + + throw new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' ); + + } + + // If present, GLB container is required to be the first buffer. + if ( bufferDef.uri === undefined && bufferIndex === 0 ) { + + return Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body ); + + } + + const options = this.options; + + return new Promise( function ( resolve, reject ) { + + loader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () { + + reject( new Error( 'THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".' ) ); + + } ); + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferViewIndex + * @return {Promise} + */ + loadBufferView( bufferViewIndex ) { + + const bufferViewDef = this.json.bufferViews[ bufferViewIndex ]; + + return this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) { + + const byteLength = bufferViewDef.byteLength || 0; + const byteOffset = bufferViewDef.byteOffset || 0; + return buffer.slice( byteOffset, byteOffset + byteLength ); + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors + * @param {number} accessorIndex + * @return {Promise} + */ + loadAccessor( accessorIndex ) { + + const parser = this; + const json = this.json; + + const accessorDef = this.json.accessors[ accessorIndex ]; + + if ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) { + + const itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; + const TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + const normalized = accessorDef.normalized === true; + + const array = new TypedArray( accessorDef.count * itemSize ); + return Promise.resolve( new BufferAttribute( array, itemSize, normalized ) ); + + } + + const pendingBufferViews = []; + + if ( accessorDef.bufferView !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) ); + + } else { + + pendingBufferViews.push( null ); + + } + + if ( accessorDef.sparse !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) ); + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) ); + + } + + return Promise.all( pendingBufferViews ).then( function ( bufferViews ) { + + const bufferView = bufferViews[ 0 ]; + + const itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; + const TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. + const elementBytes = TypedArray.BYTES_PER_ELEMENT; + const itemBytes = elementBytes * itemSize; + const byteOffset = accessorDef.byteOffset || 0; + const byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined; + const normalized = accessorDef.normalized === true; + let array, bufferAttribute; + + // The buffer is not interleaved if the stride is the item size in bytes. + if ( byteStride && byteStride !== itemBytes ) { + + // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer + // This makes sure that IBA.count reflects accessor.count properly + const ibSlice = Math.floor( byteOffset / byteStride ); + const ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count; + let ib = parser.cache.get( ibCacheKey ); + + if ( ! ib ) { + + array = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); + + // Integer parameters to IB/IBA are in array elements, not bytes. + ib = new InterleavedBuffer( array, byteStride / elementBytes ); + + parser.cache.add( ibCacheKey, ib ); + + } + + bufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized ); + + } else { + + if ( bufferView === null ) { + + array = new TypedArray( accessorDef.count * itemSize ); + + } else { + + array = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize ); + + } + + bufferAttribute = new BufferAttribute( array, itemSize, normalized ); + + } + + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors + if ( accessorDef.sparse !== undefined ) { + + const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; + const TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ]; + + const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; + const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; + + const sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices ); + const sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize ); + + if ( bufferView !== null ) { + + // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. + bufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized ); + + } + + // Ignore normalized since we copy from sparse + bufferAttribute.normalized = false; + + for ( let i = 0, il = sparseIndices.length; i < il; i ++ ) { + + const index = sparseIndices[ i ]; + + bufferAttribute.setX( index, sparseValues[ i * itemSize ] ); + if ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] ); + if ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] ); + if ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] ); + if ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' ); + + } + + bufferAttribute.normalized = normalized; + + } + + return bufferAttribute; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures + * @param {number} textureIndex + * @return {Promise} + */ + loadTexture( textureIndex ) { + + const json = this.json; + const options = this.options; + const textureDef = json.textures[ textureIndex ]; + const sourceIndex = textureDef.source; + const sourceDef = json.images[ sourceIndex ]; + + let loader = this.textureLoader; + + if ( sourceDef.uri ) { + + const handler = options.manager.getHandler( sourceDef.uri ); + if ( handler !== null ) loader = handler; + + } + + return this.loadTextureImage( textureIndex, sourceIndex, loader ); + + } + + loadTextureImage( textureIndex, sourceIndex, loader ) { + + const parser = this; + const json = this.json; + + const textureDef = json.textures[ textureIndex ]; + const sourceDef = json.images[ sourceIndex ]; + + const cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler; + + if ( this.textureCache[ cacheKey ] ) { + + // See https://github.com/mrdoob/three.js/issues/21559. + return this.textureCache[ cacheKey ]; + + } + + const promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) { + + texture.flipY = false; + + texture.name = textureDef.name || sourceDef.name || ''; + + if ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) { + + texture.name = sourceDef.uri; + + } + + const samplers = json.samplers || {}; + const sampler = samplers[ textureDef.sampler ] || {}; + + texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter; + texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter; + texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping; + texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping; + texture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + parser.associations.set( texture, { textures: textureIndex } ); + + return texture; + + } ).catch( function () { + + return null; + + } ); + + this.textureCache[ cacheKey ] = promise; + + return promise; + + } + + loadImageSource( sourceIndex, loader ) { + + const parser = this; + const json = this.json; + const options = this.options; + + if ( this.sourceCache[ sourceIndex ] !== undefined ) { + + return this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() ); + + } + + const sourceDef = json.images[ sourceIndex ]; + + const URL = self.URL || self.webkitURL; + + let sourceURI = sourceDef.uri || ''; + let isObjectURL = false; + + if ( sourceDef.bufferView !== undefined ) { + + // Load binary image data from bufferView, if provided. + + sourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) { + + isObjectURL = true; + const blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } ); + sourceURI = URL.createObjectURL( blob ); + return sourceURI; + + } ); + + } else if ( sourceDef.uri === undefined ) { + + throw new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' ); + + } + + const promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) { + + return new Promise( function ( resolve, reject ) { + + let onLoad = resolve; + + if ( loader.isImageBitmapLoader === true ) { + + onLoad = function ( imageBitmap ) { + + const texture = new Texture$1( imageBitmap ); + texture.needsUpdate = true; + + resolve( texture ); + + }; + + } + + loader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject ); + + } ); + + } ).then( function ( texture ) { + + // Clean up resources and configure Texture. + + if ( isObjectURL === true ) { + + URL.revokeObjectURL( sourceURI ); + + } + + assignExtrasToUserData( texture, sourceDef ); + + texture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri ); + + return texture; + + } ).catch( function ( error ) { + + console.error( 'THREE.GLTFLoader: Couldn\'t load texture', sourceURI ); + throw error; + + } ); + + this.sourceCache[ sourceIndex ] = promise; + return promise; + + } + + /** + * Asynchronously assigns a texture to the given material parameters. + * + * @param {Object} materialParams + * @param {string} mapName + * @param {Object} mapDef + * @param {string} colorSpace + * @return {Promise} + */ + assignTexture( materialParams, mapName, mapDef, colorSpace ) { + + const parser = this; + + return this.getDependency( 'texture', mapDef.index ).then( function ( texture ) { + + if ( ! texture ) return null; + + if ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) { + + texture = texture.clone(); + texture.channel = mapDef.texCoord; + + } + + if ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) { + + const transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined; + + if ( transform ) { + + const gltfReference = parser.associations.get( texture ); + texture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform ); + parser.associations.set( texture, gltfReference ); + + } + + } + + if ( colorSpace !== undefined ) { + + texture.colorSpace = colorSpace; + + } + + materialParams[ mapName ] = texture; + + return texture; + + } ); + + } + + /** + * Assigns final material to a Mesh, Line, or Points instance. The instance + * already has a material (generated from the glTF material options alone) + * but reuse of the same glTF material may require multiple threejs materials + * to accommodate different primitive types, defines, etc. New materials will + * be created if necessary, and reused from a cache. + * @param {Object3D} mesh Mesh, Line, or Points instance. + */ + assignFinalMaterial( mesh ) { + + const geometry = mesh.geometry; + let material = mesh.material; + + const useDerivativeTangents = geometry.attributes.tangent === undefined; + const useVertexColors = geometry.attributes.color !== undefined; + const useFlatShading = geometry.attributes.normal === undefined; + + if ( mesh.isPoints ) { + + const cacheKey = 'PointsMaterial:' + material.uuid; + + let pointsMaterial = this.cache.get( cacheKey ); + + if ( ! pointsMaterial ) { + + pointsMaterial = new PointsMaterial(); + Material$1.prototype.copy.call( pointsMaterial, material ); + pointsMaterial.color.copy( material.color ); + pointsMaterial.map = material.map; + pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px + + this.cache.add( cacheKey, pointsMaterial ); + + } + + material = pointsMaterial; + + } else if ( mesh.isLine ) { + + const cacheKey = 'LineBasicMaterial:' + material.uuid; + + let lineMaterial = this.cache.get( cacheKey ); + + if ( ! lineMaterial ) { + + lineMaterial = new LineBasicMaterial(); + Material$1.prototype.copy.call( lineMaterial, material ); + lineMaterial.color.copy( material.color ); + lineMaterial.map = material.map; + + this.cache.add( cacheKey, lineMaterial ); + + } + + material = lineMaterial; + + } + + // Clone the material if it will be modified + if ( useDerivativeTangents || useVertexColors || useFlatShading ) { + + let cacheKey = 'ClonedMaterial:' + material.uuid + ':'; + + if ( useDerivativeTangents ) cacheKey += 'derivative-tangents:'; + if ( useVertexColors ) cacheKey += 'vertex-colors:'; + if ( useFlatShading ) cacheKey += 'flat-shading:'; + + let cachedMaterial = this.cache.get( cacheKey ); + + if ( ! cachedMaterial ) { + + cachedMaterial = material.clone(); + + if ( useVertexColors ) cachedMaterial.vertexColors = true; + if ( useFlatShading ) cachedMaterial.flatShading = true; + + if ( useDerivativeTangents ) { + + // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 + if ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= -1; + if ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= -1; + + } + + this.cache.add( cacheKey, cachedMaterial ); + + this.associations.set( cachedMaterial, this.associations.get( material ) ); + + } + + material = cachedMaterial; + + } + + mesh.material = material; + + } + + getMaterialType( /* materialIndex */ ) { + + return MeshStandardMaterial; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials + * @param {number} materialIndex + * @return {Promise} + */ + loadMaterial( materialIndex ) { + + const parser = this; + const json = this.json; + const extensions = this.extensions; + const materialDef = json.materials[ materialIndex ]; + + let materialType; + const materialParams = {}; + const materialExtensions = materialDef.extensions || {}; + + const pending = []; + + if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) { + + const kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ]; + materialType = kmuExtension.getMaterialType(); + pending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) ); + + } else { + + // Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material + + const metallicRoughness = materialDef.pbrMetallicRoughness || {}; + + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + const array = metallicRoughness.baseColorFactor; + + materialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) ); + + } + + materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0; + materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0; + + if ( metallicRoughness.metallicRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) ); + pending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) ); + + } + + materialType = this._invokeOne( function ( ext ) { + + return ext.getMaterialType && ext.getMaterialType( materialIndex ); + + } ); + + pending.push( Promise.all( this._invokeAll( function ( ext ) { + + return ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams ); + + } ) ) ); + + } + + if ( materialDef.doubleSided === true ) { + + materialParams.side = DoubleSide; + + } + + const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; + + if ( alphaMode === ALPHA_MODES.BLEND ) { + + materialParams.transparent = true; + + // See: https://github.com/mrdoob/three.js/issues/17706 + materialParams.depthWrite = false; + + } else { + + materialParams.transparent = false; + + if ( alphaMode === ALPHA_MODES.MASK ) { + + materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5; + + } + + } + + if ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); + + materialParams.normalScale = new Vector2( 1, 1 ); + + if ( materialDef.normalTexture.scale !== undefined ) { + + const scale = materialDef.normalTexture.scale; + + materialParams.normalScale.set( scale, scale ); + + } + + } + + if ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) ); + + if ( materialDef.occlusionTexture.strength !== undefined ) { + + materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; + + } + + } + + if ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) { + + const emissiveFactor = materialDef.emissiveFactor; + materialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace ); + + } + + if ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) ); + + } + + return Promise.all( pending ).then( function () { + + const material = new materialType( materialParams ); + + if ( materialDef.name ) material.name = materialDef.name; + + assignExtrasToUserData( material, materialDef ); + + parser.associations.set( material, { materials: materialIndex } ); + + if ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef ); + + return material; + + } ); + + } + + /** + * When Object3D instances are targeted by animation, they need unique names. + * + * @param {string} originalName + * @return {string} + */ + createUniqueName( originalName ) { + + const sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' ); + + if ( sanitizedName in this.nodeNamesUsed ) { + + return sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] ); + + } else { + + this.nodeNamesUsed[ sanitizedName ] = 0; + + return sanitizedName; + + } + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry + * + * Creates BufferGeometries from primitives. + * + * @param {Array} primitives + * @return {Promise>} + */ + loadGeometries( primitives ) { + + const parser = this; + const extensions = this.extensions; + const cache = this.primitiveCache; + + function createDracoPrimitive( primitive ) { + + return extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] + .decodePrimitive( primitive, parser ) + .then( function ( geometry ) { + + return addPrimitiveAttributes( geometry, primitive, parser ); + + } ); + + } + + const pending = []; + + for ( let i = 0, il = primitives.length; i < il; i ++ ) { + + const primitive = primitives[ i ]; + const cacheKey = createPrimitiveKey( primitive ); + + // See if we've already created this geometry + const cached = cache[ cacheKey ]; + + if ( cached ) { + + // Use the cached geometry if it exists + pending.push( cached.promise ); + + } else { + + let geometryPromise; + + if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) { + + // Use DRACO geometry if available + geometryPromise = createDracoPrimitive( primitive ); + + } else { + + // Otherwise create a new geometry + geometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser ); + + } + + // Cache this geometry + cache[ cacheKey ] = { primitive: primitive, promise: geometryPromise }; + + pending.push( geometryPromise ); + + } + + } + + return Promise.all( pending ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes + * @param {number} meshIndex + * @return {Promise} + */ + loadMesh( meshIndex ) { + + const parser = this; + const json = this.json; + const extensions = this.extensions; + + const meshDef = json.meshes[ meshIndex ]; + const primitives = meshDef.primitives; + + const pending = []; + + for ( let i = 0, il = primitives.length; i < il; i ++ ) { + + const material = primitives[ i ].material === undefined + ? createDefaultMaterial( this.cache ) + : this.getDependency( 'material', primitives[ i ].material ); + + pending.push( material ); + + } + + pending.push( parser.loadGeometries( primitives ) ); + + return Promise.all( pending ).then( function ( results ) { + + const materials = results.slice( 0, results.length - 1 ); + const geometries = results[ results.length - 1 ]; + + const meshes = []; + + for ( let i = 0, il = geometries.length; i < il; i ++ ) { + + const geometry = geometries[ i ]; + const primitive = primitives[ i ]; + + // 1. create Mesh + + let mesh; + + const material = materials[ i ]; + + if ( primitive.mode === WEBGL_CONSTANTS$1.TRIANGLES || + primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_STRIP || + primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_FAN || + primitive.mode === undefined ) { + + // .isSkinnedMesh isn't in glTF spec. See ._markDefs() + mesh = meshDef.isSkinnedMesh === true + ? new SkinnedMesh( geometry, material ) + : new Mesh( geometry, material ); + + if ( mesh.isSkinnedMesh === true ) { + + // normalize skin weights to fix malformed assets (see #15319) + mesh.normalizeSkinWeights(); + + } + + if ( primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_STRIP ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode ); + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_FAN ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode ); + + } + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.LINES ) { + + mesh = new LineSegments( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.LINE_STRIP ) { + + mesh = new Line( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.LINE_LOOP ) { + + mesh = new LineLoop( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.POINTS ) { + + mesh = new Points( geometry, material ); + + } else { + + throw new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode ); + + } + + if ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) { + + updateMorphTargets( mesh, meshDef ); + + } + + mesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) ); + + assignExtrasToUserData( mesh, meshDef ); + + if ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive ); + + parser.assignFinalMaterial( mesh ); + + meshes.push( mesh ); + + } + + for ( let i = 0, il = meshes.length; i < il; i ++ ) { + + parser.associations.set( meshes[ i ], { + meshes: meshIndex, + primitives: i + } ); + + } + + if ( meshes.length === 1 ) { + + if ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef ); + + return meshes[ 0 ]; + + } + + const group = new Group(); + + if ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef ); + + parser.associations.set( group, { meshes: meshIndex } ); + + for ( let i = 0, il = meshes.length; i < il; i ++ ) { + + group.add( meshes[ i ] ); + + } + + return group; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras + * @param {number} cameraIndex + * @return {Promise} + */ + loadCamera( cameraIndex ) { + + let camera; + const cameraDef = this.json.cameras[ cameraIndex ]; + const params = cameraDef[ cameraDef.type ]; + + if ( ! params ) { + + console.warn( 'THREE.GLTFLoader: Missing camera parameters.' ); + return; + + } + + if ( cameraDef.type === 'perspective' ) { + + camera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 ); + + } else if ( cameraDef.type === 'orthographic' ) { + + camera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar ); + + } + + if ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name ); + + assignExtrasToUserData( camera, cameraDef ); + + return Promise.resolve( camera ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins + * @param {number} skinIndex + * @return {Promise} + */ + loadSkin( skinIndex ) { + + const skinDef = this.json.skins[ skinIndex ]; + + const pending = []; + + for ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) { + + pending.push( this._loadNodeShallow( skinDef.joints[ i ] ) ); + + } + + if ( skinDef.inverseBindMatrices !== undefined ) { + + pending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) ); + + } else { + + pending.push( null ); + + } + + return Promise.all( pending ).then( function ( results ) { + + const inverseBindMatrices = results.pop(); + const jointNodes = results; + + // Note that bones (joint nodes) may or may not be in the + // scene graph at this time. + + const bones = []; + const boneInverses = []; + + for ( let i = 0, il = jointNodes.length; i < il; i ++ ) { + + const jointNode = jointNodes[ i ]; + + if ( jointNode ) { + + bones.push( jointNode ); + + const mat = new Matrix4(); + + if ( inverseBindMatrices !== null ) { + + mat.fromArray( inverseBindMatrices.array, i * 16 ); + + } + + boneInverses.push( mat ); + + } else { + + console.warn( 'THREE.GLTFLoader: Joint "%s" could not be found.', skinDef.joints[ i ] ); + + } + + } + + return new Skeleton( bones, boneInverses ); + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations + * @param {number} animationIndex + * @return {Promise} + */ + loadAnimation( animationIndex ) { + + const json = this.json; + const parser = this; + + const animationDef = json.animations[ animationIndex ]; + const animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex; + + const pendingNodes = []; + const pendingInputAccessors = []; + const pendingOutputAccessors = []; + const pendingSamplers = []; + const pendingTargets = []; + + for ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) { + + const channel = animationDef.channels[ i ]; + const sampler = animationDef.samplers[ channel.sampler ]; + const target = channel.target; + const name = target.node; + const input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input; + const output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output; + + if ( target.node === undefined ) continue; + + pendingNodes.push( this.getDependency( 'node', name ) ); + pendingInputAccessors.push( this.getDependency( 'accessor', input ) ); + pendingOutputAccessors.push( this.getDependency( 'accessor', output ) ); + pendingSamplers.push( sampler ); + pendingTargets.push( target ); + + } + + return Promise.all( [ + + Promise.all( pendingNodes ), + Promise.all( pendingInputAccessors ), + Promise.all( pendingOutputAccessors ), + Promise.all( pendingSamplers ), + Promise.all( pendingTargets ) + + ] ).then( function ( dependencies ) { + + const nodes = dependencies[ 0 ]; + const inputAccessors = dependencies[ 1 ]; + const outputAccessors = dependencies[ 2 ]; + const samplers = dependencies[ 3 ]; + const targets = dependencies[ 4 ]; + + const tracks = []; + + for ( let i = 0, il = nodes.length; i < il; i ++ ) { + + const node = nodes[ i ]; + const inputAccessor = inputAccessors[ i ]; + const outputAccessor = outputAccessors[ i ]; + const sampler = samplers[ i ]; + const target = targets[ i ]; + + if ( node === undefined ) continue; + + if ( node.updateMatrix ) { + + node.updateMatrix(); + + } + + const createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ); + + if ( createdTracks ) { + + for ( let k = 0; k < createdTracks.length; k ++ ) { + + tracks.push( createdTracks[ k ] ); + + } + + } + + } + + return new AnimationClip( animationName, undefined, tracks ); + + } ); + + } + + createNodeMesh( nodeIndex ) { + + const json = this.json; + const parser = this; + const nodeDef = json.nodes[ nodeIndex ]; + + if ( nodeDef.mesh === undefined ) return null; + + return parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) { + + const node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); + + // if weights are provided on the node, override weights on the mesh. + if ( nodeDef.weights !== undefined ) { + + node.traverse( function ( o ) { + + if ( ! o.isMesh ) return; + + for ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) { + + o.morphTargetInfluences[ i ] = nodeDef.weights[ i ]; + + } + + } ); + + } + + return node; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy + * @param {number} nodeIndex + * @return {Promise} + */ + loadNode( nodeIndex ) { + + const json = this.json; + const parser = this; + + const nodeDef = json.nodes[ nodeIndex ]; + + const nodePending = parser._loadNodeShallow( nodeIndex ); + + const childPending = []; + const childrenDef = nodeDef.children || []; + + for ( let i = 0, il = childrenDef.length; i < il; i ++ ) { + + childPending.push( parser.getDependency( 'node', childrenDef[ i ] ) ); + + } + + const skeletonPending = nodeDef.skin === undefined + ? Promise.resolve( null ) + : parser.getDependency( 'skin', nodeDef.skin ); + + return Promise.all( [ + nodePending, + Promise.all( childPending ), + skeletonPending + ] ).then( function ( results ) { + + const node = results[ 0 ]; + const children = results[ 1 ]; + const skeleton = results[ 2 ]; + + if ( skeleton !== null ) { + + // This full traverse should be fine because + // child glTF nodes have not been added to this node yet. + node.traverse( function ( mesh ) { + + if ( ! mesh.isSkinnedMesh ) return; + + mesh.bind( skeleton, _identityMatrix ); + + } ); + + } + + for ( let i = 0, il = children.length; i < il; i ++ ) { + + node.add( children[ i ] ); + + } + + return node; + + } ); + + } + + // ._loadNodeShallow() parses a single node. + // skin and child nodes are created and added in .loadNode() (no '_' prefix). + _loadNodeShallow( nodeIndex ) { + + const json = this.json; + const extensions = this.extensions; + const parser = this; + + // This method is called from .loadNode() and .loadSkin(). + // Cache a node to avoid duplication. + + if ( this.nodeCache[ nodeIndex ] !== undefined ) { + + return this.nodeCache[ nodeIndex ]; + + } + + const nodeDef = json.nodes[ nodeIndex ]; + + // reserve node's name before its dependencies, so the root has the intended name. + const nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : ''; + + const pending = []; + + const meshPromise = parser._invokeOne( function ( ext ) { + + return ext.createNodeMesh && ext.createNodeMesh( nodeIndex ); + + } ); + + if ( meshPromise ) { + + pending.push( meshPromise ); + + } + + if ( nodeDef.camera !== undefined ) { + + pending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) { + + return parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera ); + + } ) ); + + } + + parser._invokeAll( function ( ext ) { + + return ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex ); + + } ).forEach( function ( promise ) { + + pending.push( promise ); + + } ); + + this.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) { + + let node; + + // .isBone isn't in glTF spec. See ._markDefs + if ( nodeDef.isBone === true ) { + + node = new Bone(); + + } else if ( objects.length > 1 ) { + + node = new Group(); + + } else if ( objects.length === 1 ) { + + node = objects[ 0 ]; + + } else { + + node = new Object3D(); + + } + + if ( node !== objects[ 0 ] ) { + + for ( let i = 0, il = objects.length; i < il; i ++ ) { + + node.add( objects[ i ] ); + + } + + } + + if ( nodeDef.name ) { + + node.userData.name = nodeDef.name; + node.name = nodeName; + + } + + assignExtrasToUserData( node, nodeDef ); + + if ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef ); + + if ( nodeDef.matrix !== undefined ) { + + const matrix = new Matrix4(); + matrix.fromArray( nodeDef.matrix ); + node.applyMatrix4( matrix ); + + } else { + + if ( nodeDef.translation !== undefined ) { + + node.position.fromArray( nodeDef.translation ); + + } + + if ( nodeDef.rotation !== undefined ) { + + node.quaternion.fromArray( nodeDef.rotation ); + + } + + if ( nodeDef.scale !== undefined ) { + + node.scale.fromArray( nodeDef.scale ); + + } + + } + + if ( ! parser.associations.has( node ) ) { + + parser.associations.set( node, {} ); + + } + + parser.associations.get( node ).nodes = nodeIndex; + + return node; + + } ); + + return this.nodeCache[ nodeIndex ]; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes + * @param {number} sceneIndex + * @return {Promise} + */ + loadScene( sceneIndex ) { + + const extensions = this.extensions; + const sceneDef = this.json.scenes[ sceneIndex ]; + const parser = this; + + // Loader returns Group, not Scene. + // See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172 + const scene = new Group(); + if ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name ); + + assignExtrasToUserData( scene, sceneDef ); + + if ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef ); + + const nodeIds = sceneDef.nodes || []; + + const pending = []; + + for ( let i = 0, il = nodeIds.length; i < il; i ++ ) { + + pending.push( parser.getDependency( 'node', nodeIds[ i ] ) ); + + } + + return Promise.all( pending ).then( function ( nodes ) { + + for ( let i = 0, il = nodes.length; i < il; i ++ ) { + + scene.add( nodes[ i ] ); + + } + + // Removes dangling associations, associations that reference a node that + // didn't make it into the scene. + const reduceAssociations = ( node ) => { + + const reducedAssociations = new Map(); + + for ( const [ key, value ] of parser.associations ) { + + if ( key instanceof Material$1 || key instanceof Texture$1 ) { + + reducedAssociations.set( key, value ); + + } + + } + + node.traverse( ( node ) => { + + const mappings = parser.associations.get( node ); + + if ( mappings != null ) { + + reducedAssociations.set( node, mappings ); + + } + + } ); + + return reducedAssociations; + + }; + + parser.associations = reduceAssociations( scene ); + + return scene; + + } ); + + } + + _createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) { + + const tracks = []; + + const targetName = node.name ? node.name : node.uuid; + const targetNames = []; + + if ( PATH_PROPERTIES$1[ target.path ] === PATH_PROPERTIES$1.weights ) { + + node.traverse( function ( object ) { + + if ( object.morphTargetInfluences ) { + + targetNames.push( object.name ? object.name : object.uuid ); + + } + + } ); + + } else { + + targetNames.push( targetName ); + + } + + let TypedKeyframeTrack; + + switch ( PATH_PROPERTIES$1[ target.path ] ) { + + case PATH_PROPERTIES$1.weights: + + TypedKeyframeTrack = NumberKeyframeTrack; + break; + + case PATH_PROPERTIES$1.rotation: + + TypedKeyframeTrack = QuaternionKeyframeTrack; + break; + + case PATH_PROPERTIES$1.position: + case PATH_PROPERTIES$1.scale: + + TypedKeyframeTrack = VectorKeyframeTrack; + break; + + default: + + switch ( outputAccessor.itemSize ) { + + case 1: + TypedKeyframeTrack = NumberKeyframeTrack; + break; + case 2: + case 3: + default: + TypedKeyframeTrack = VectorKeyframeTrack; + break; + + } + + break; + + } + + const interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear; + + + const outputArray = this._getArrayFromAccessor( outputAccessor ); + + for ( let j = 0, jl = targetNames.length; j < jl; j ++ ) { + + const track = new TypedKeyframeTrack( + targetNames[ j ] + '.' + PATH_PROPERTIES$1[ target.path ], + inputAccessor.array, + outputArray, + interpolation + ); + + // Override interpolation with custom factory method. + if ( sampler.interpolation === 'CUBICSPLINE' ) { + + this._createCubicSplineTrackInterpolant( track ); + + } + + tracks.push( track ); + + } + + return tracks; + + } + + _getArrayFromAccessor( accessor ) { + + let outputArray = accessor.array; + + if ( accessor.normalized ) { + + const scale = getNormalizedComponentScale( outputArray.constructor ); + const scaled = new Float32Array( outputArray.length ); + + for ( let j = 0, jl = outputArray.length; j < jl; j ++ ) { + + scaled[ j ] = outputArray[ j ] * scale; + + } + + outputArray = scaled; + + } + + return outputArray; + + } + + _createCubicSplineTrackInterpolant( track ) { + + track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) { + + // A CUBICSPLINE keyframe in glTF has three output values for each input value, + // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() + // must be divided by three to get the interpolant's sampleSize argument. + + const interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant; + + return new interpolantType( this.times, this.values, this.getValueSize() / 3, result ); + + }; + + // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants. + track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; + + } + +} + +/** + * @param {BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + */ +function computeBounds( geometry, primitiveDef, parser ) { + + const attributes = primitiveDef.attributes; + + const box = new Box3(); + + if ( attributes.POSITION !== undefined ) { + + const accessor = parser.json.accessors[ attributes.POSITION ]; + + const min = accessor.min; + const max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + box.set( + new Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), + new Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) + ); + + if ( accessor.normalized ) { + + const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); + box.min.multiplyScalar( boxScale ); + box.max.multiplyScalar( boxScale ); + + } + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + return; + + } + + } else { + + return; + + } + + const targets = primitiveDef.targets; + + if ( targets !== undefined ) { + + const maxDisplacement = new Vector3(); + const vector = new Vector3(); + + for ( let i = 0, il = targets.length; i < il; i ++ ) { + + const target = targets[ i ]; + + if ( target.POSITION !== undefined ) { + + const accessor = parser.json.accessors[ target.POSITION ]; + const min = accessor.min; + const max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + // we need to get max of absolute components because target weight is [-1,1] + vector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) ); + vector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) ); + vector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) ); + + + if ( accessor.normalized ) { + + const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); + vector.multiplyScalar( boxScale ); + + } + + // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative + // to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets + // are used to implement key-frame animations and as such only two are active at a time - this results in very large + // boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size. + maxDisplacement.max( vector ); + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + } + + } + + } + + // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets. + box.expandByVector( maxDisplacement ); + + } + + geometry.boundingBox = box; + + const sphere = new Sphere(); + + box.getCenter( sphere.center ); + sphere.radius = box.min.distanceTo( box.max ) / 2; + + geometry.boundingSphere = sphere; + +} + +/** + * @param {BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + * @return {Promise} + */ +function addPrimitiveAttributes( geometry, primitiveDef, parser ) { + + const attributes = primitiveDef.attributes; + + const pending = []; + + function assignAttributeAccessor( accessorIndex, attributeName ) { + + return parser.getDependency( 'accessor', accessorIndex ) + .then( function ( accessor ) { + + geometry.setAttribute( attributeName, accessor ); + + } ); + + } + + for ( const gltfAttributeName in attributes ) { + + const threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); + + // Skip attributes already provided by e.g. Draco extension. + if ( threeAttributeName in geometry.attributes ) continue; + + pending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) ); + + } + + if ( primitiveDef.indices !== undefined && ! geometry.index ) { + + const accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) { + + geometry.setIndex( accessor ); + + } ); + + pending.push( accessor ); + + } + + if ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) { + + console.warn( `THREE.GLTFLoader: Converting vertex colors from "srgb-linear" to "${ColorManagement.workingColorSpace}" not supported.` ); + + } + + assignExtrasToUserData( geometry, primitiveDef ); + + computeBounds( geometry, primitiveDef, parser ); + + return Promise.all( pending ).then( function () { + + return primitiveDef.targets !== undefined + ? addMorphTargets( geometry, primitiveDef.targets, parser ) + : geometry; + + } ); + +} + +/** + * @author Deepkolos / https://github.com/deepkolos + */ + +class WorkerPool { + + constructor( pool = 4 ) { + + this.pool = pool; + this.queue = []; + this.workers = []; + this.workersResolve = []; + this.workerStatus = 0; + + } + + _initWorker( workerId ) { + + if ( ! this.workers[ workerId ] ) { + + const worker = this.workerCreator(); + worker.addEventListener( 'message', this._onMessage.bind( this, workerId ) ); + this.workers[ workerId ] = worker; + + } + + } + + _getIdleWorker() { + + for ( let i = 0; i < this.pool; i ++ ) + if ( ! ( this.workerStatus & ( 1 << i ) ) ) return i; + + return -1; + + } + + _onMessage( workerId, msg ) { + + const resolve = this.workersResolve[ workerId ]; + resolve && resolve( msg ); + + if ( this.queue.length ) { + + const { resolve, msg, transfer } = this.queue.shift(); + this.workersResolve[ workerId ] = resolve; + this.workers[ workerId ].postMessage( msg, transfer ); + + } else { + + this.workerStatus ^= 1 << workerId; + + } + + } + + setWorkerCreator( workerCreator ) { + + this.workerCreator = workerCreator; + + } + + setWorkerLimit( pool ) { + + this.pool = pool; + + } + + postMessage( msg, transfer ) { + + return new Promise( ( resolve ) => { + + const workerId = this._getIdleWorker(); + + if ( workerId !== -1 ) { + + this._initWorker( workerId ); + this.workerStatus |= 1 << workerId; + this.workersResolve[ workerId ] = resolve; + this.workers[ workerId ].postMessage( msg, transfer ); + + } else { + + this.queue.push( { resolve, msg, transfer } ); + + } + + } ); + + } + + dispose() { + + this.workers.forEach( ( worker ) => worker.terminate() ); + this.workersResolve.length = 0; + this.workers.length = 0; + this.queue.length = 0; + this.workerStatus = 0; + + } + +} + +const t=0,n=2,g$1=1,u=2,T=0,C$1=1,R=10,it=0,ct=9,yt=15,xt=16,wt=22,Ft=37,Ct=43,te$1=76,ae=83,ge=97,ue=100,we=103,Ae=109,In=165,Sn=166,pi=1000066e3;class Ii{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null;}}class Si{constructor(t,e,n,i){this._dataView=void 0,this._littleEndian=void 0,this._offset=void 0,this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0;}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint8Array(t){const e=new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+this._offset,t);return this._offset+=t,e}_skip(t){return this._offset+=t,this}_scan(t,e){ void 0===e&&(e=0);const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&iA.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,"base64"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0);}decode(A,g=0){if(!I)throw new Error("ZSTDDecoder: Await .init() before decoding.");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C="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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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"; + +const DisplayP3ColorSpace = 'display-p3'; +const LinearDisplayP3ColorSpace = 'display-p3-linear'; + +/** + * Loader for KTX 2.0 GPU Texture containers. + * + * KTX 2.0 is a container format for various GPU texture formats. The loader + * supports Basis Universal GPU textures, which can be quickly transcoded to + * a wide variety of GPU texture compression formats, as well as some + * uncompressed DataTexture and Data3DTexture formats. + * + * References: + * - KTX: http://github.khronos.org/KTX-Specification/ + * - DFD: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor + * - BasisU HDR: https://github.com/BinomialLLC/basis_universal/wiki/UASTC-HDR-Texture-Specification-v1.0 + */ + + +const _taskCache = new WeakMap(); + +let _activeLoaders = 0; + +let _zstd; + +class KTX2Loader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.transcoderPath = ''; + this.transcoderBinary = null; + this.transcoderPending = null; + + this.workerPool = new WorkerPool(); + this.workerSourceURL = ''; + this.workerConfig = null; + + if ( typeof MSC_TRANSCODER !== 'undefined' ) { + + console.warn( + + 'THREE.KTX2Loader: Please update to latest "basis_transcoder".' + + ' "msc_basis_transcoder" is no longer supported in three.js r125+.' + + ); + + } + + } + + setTranscoderPath( path ) { + + this.transcoderPath = path; + + return this; + + } + + setWorkerLimit( num ) { + + this.workerPool.setWorkerLimit( num ); + + return this; + + } + + async detectSupportAsync( renderer ) { + + this.workerConfig = { + astcSupported: await renderer.hasFeatureAsync( 'texture-compression-astc' ), + astcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856 + etc1Supported: await renderer.hasFeatureAsync( 'texture-compression-etc1' ), + etc2Supported: await renderer.hasFeatureAsync( 'texture-compression-etc2' ), + dxtSupported: await renderer.hasFeatureAsync( 'texture-compression-bc' ), + bptcSupported: await renderer.hasFeatureAsync( 'texture-compression-bptc' ), + pvrtcSupported: await renderer.hasFeatureAsync( 'texture-compression-pvrtc' ) + }; + + return this; + + } + + detectSupport( renderer ) { + + if ( renderer.isWebGPURenderer === true ) { + + this.workerConfig = { + astcSupported: renderer.hasFeature( 'texture-compression-astc' ), + astcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856 + etc1Supported: renderer.hasFeature( 'texture-compression-etc1' ), + etc2Supported: renderer.hasFeature( 'texture-compression-etc2' ), + dxtSupported: renderer.hasFeature( 'texture-compression-bc' ), + bptcSupported: renderer.hasFeature( 'texture-compression-bptc' ), + pvrtcSupported: renderer.hasFeature( 'texture-compression-pvrtc' ) + }; + + } else { + + this.workerConfig = { + astcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ), + astcHDRSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ) + && renderer.extensions.get( 'WEBGL_compressed_texture_astc' ).getSupportedProfiles().includes( 'hdr' ), + etc1Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc1' ), + etc2Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc' ), + dxtSupported: renderer.extensions.has( 'WEBGL_compressed_texture_s3tc' ), + bptcSupported: renderer.extensions.has( 'EXT_texture_compression_bptc' ), + pvrtcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_pvrtc' ) + || renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ) + }; + + } + + return this; + + } + + init() { + + if ( ! this.transcoderPending ) { + + // Load transcoder wrapper. + const jsLoader = new FileLoader( this.manager ); + jsLoader.setPath( this.transcoderPath ); + jsLoader.setWithCredentials( this.withCredentials ); + const jsContent = jsLoader.loadAsync( 'basis_transcoder.js' ); + + // Load transcoder WASM binary. + const binaryLoader = new FileLoader( this.manager ); + binaryLoader.setPath( this.transcoderPath ); + binaryLoader.setResponseType( 'arraybuffer' ); + binaryLoader.setWithCredentials( this.withCredentials ); + const binaryContent = binaryLoader.loadAsync( 'basis_transcoder.wasm' ); + + this.transcoderPending = Promise.all( [ jsContent, binaryContent ] ) + .then( ( [ jsContent, binaryContent ] ) => { + + const fn = KTX2Loader.BasisWorker.toString(); + + const body = [ + '/* constants */', + 'let _EngineFormat = ' + JSON.stringify( KTX2Loader.EngineFormat ), + 'let _EngineType = ' + JSON.stringify( KTX2Loader.EngineType ), + 'let _TranscoderFormat = ' + JSON.stringify( KTX2Loader.TranscoderFormat ), + 'let _BasisFormat = ' + JSON.stringify( KTX2Loader.BasisFormat ), + '/* basis_transcoder.js */', + jsContent, + '/* worker */', + fn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) ) + ].join( '\n' ); + + this.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) ); + this.transcoderBinary = binaryContent; + + this.workerPool.setWorkerCreator( () => { + + const worker = new Worker( this.workerSourceURL ); + const transcoderBinary = this.transcoderBinary.slice( 0 ); + + worker.postMessage( { type: 'init', config: this.workerConfig, transcoderBinary }, [ transcoderBinary ] ); + + return worker; + + } ); + + } ); + + if ( _activeLoaders > 0 ) { + + // Each instance loads a transcoder and allocates workers, increasing network and memory cost. + + console.warn( + + 'THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.' + + ' Use a single KTX2Loader instance, or call .dispose() on old instances.' + + ); + + } + + _activeLoaders ++; + + } + + return this.transcoderPending; + + } + + load( url, onLoad, onProgress, onError ) { + + if ( this.workerConfig === null ) { + + throw new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' ); + + } + + const loader = new FileLoader( this.manager ); + + loader.setResponseType( 'arraybuffer' ); + loader.setWithCredentials( this.withCredentials ); + + loader.load( url, ( buffer ) => { + + this.parse( buffer, onLoad, onError ); + + }, onProgress, onError ); + + } + + parse( buffer, onLoad, onError ) { + + if ( this.workerConfig === null ) { + + throw new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' ); + + } + + // Check for an existing task using this buffer. A transferred buffer cannot be transferred + // again from this thread. + if ( _taskCache.has( buffer ) ) { + + const cachedTask = _taskCache.get( buffer ); + + return cachedTask.promise.then( onLoad ).catch( onError ); + + } + + this._createTexture( buffer ) + .then( ( texture ) => onLoad ? onLoad( texture ) : null ) + .catch( onError ); + + } + + _createTextureFrom( transcodeResult, container ) { + + const { type: messageType, error, data: { faces, width, height, format, type, dfdFlags } } = transcodeResult; + + if ( messageType === 'error' ) return Promise.reject( error ); + + let texture; + + if ( container.faceCount === 6 ) { + + texture = new CompressedCubeTexture( faces, format, type ); + + } else { + + const mipmaps = faces[ 0 ].mipmaps; + + texture = container.layerCount > 1 + ? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, type ) + : new CompressedTexture( mipmaps, width, height, format, type ); + + } + + texture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter; + texture.magFilter = LinearFilter; + texture.generateMipmaps = false; + + texture.needsUpdate = true; + texture.colorSpace = parseColorSpace( container ); + texture.premultiplyAlpha = !! ( dfdFlags & g$1 ); + + return texture; + + } + + /** + * @param {ArrayBuffer} buffer + * @param {?Object} config + * @return {Promise} + */ + async _createTexture( buffer, config = {} ) { + + const container = Pi( new Uint8Array( buffer ) ); + + // Basis UASTC HDR is a subset of ASTC, which can be transcoded efficiently + // to BC6H. To detect whether a KTX2 file uses Basis UASTC HDR, or default + // ASTC, inspect the DFD color model. + // + // Source: https://github.com/BinomialLLC/basis_universal/issues/381 + const isBasisHDR = container.vkFormat === pi + && container.dataFormatDescriptor[ 0 ].colorModel === 0xA7; + + // If the device supports ASTC, Basis UASTC HDR requires no transcoder. + const needsTranscoder = container.vkFormat === it + || isBasisHDR && ! this.workerConfig.astcHDRSupported; + + if ( ! needsTranscoder ) { + + return createRawTexture( container ); + + } + + // + const taskConfig = config; + const texturePending = this.init().then( () => { + + return this.workerPool.postMessage( { type: 'transcode', buffer, taskConfig: taskConfig }, [ buffer ] ); + + } ).then( ( e ) => this._createTextureFrom( e.data, container ) ); + + // Cache the task result. + _taskCache.set( buffer, { promise: texturePending } ); + + return texturePending; + + } + + dispose() { + + this.workerPool.dispose(); + if ( this.workerSourceURL ) URL.revokeObjectURL( this.workerSourceURL ); + + _activeLoaders --; + + return this; + + } + +} + + +/* CONSTANTS */ + +KTX2Loader.BasisFormat = { + ETC1S: 0, + UASTC: 1, + UASTC_HDR: 2, +}; + +// Source: https://github.com/BinomialLLC/basis_universal/blob/master/webgl/texture_test/index.html +KTX2Loader.TranscoderFormat = { + ETC1: 0, + ETC2: 1, + BC1: 2, + BC3: 3, + BC4: 4, + BC5: 5, + BC7_M6_OPAQUE_ONLY: 6, + BC7_M5: 7, + PVRTC1_4_RGB: 8, + PVRTC1_4_RGBA: 9, + ASTC_4x4: 10, + ATC_RGB: 11, + ATC_RGBA_INTERPOLATED_ALPHA: 12, + RGBA32: 13, + RGB565: 14, + BGR565: 15, + RGBA4444: 16, + BC6H: 22, + RGB_HALF: 24, + RGBA_HALF: 25, +}; + +KTX2Loader.EngineFormat = { + RGBAFormat: RGBAFormat, + RGBA_ASTC_4x4_Format: RGBA_ASTC_4x4_Format, + RGB_BPTC_UNSIGNED_Format: RGB_BPTC_UNSIGNED_Format, + RGBA_BPTC_Format: RGBA_BPTC_Format, + RGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format, + RGBA_PVRTC_4BPPV1_Format: RGBA_PVRTC_4BPPV1_Format, + RGBA_S3TC_DXT5_Format: RGBA_S3TC_DXT5_Format, + RGB_ETC1_Format: RGB_ETC1_Format, + RGB_ETC2_Format: RGB_ETC2_Format, + RGB_PVRTC_4BPPV1_Format: RGB_PVRTC_4BPPV1_Format, + RGBA_S3TC_DXT1_Format: RGBA_S3TC_DXT1_Format, +}; + +KTX2Loader.EngineType = { + UnsignedByteType: UnsignedByteType, + HalfFloatType: HalfFloatType, + FloatType: FloatType, +}; + +/* WEB WORKER */ + +KTX2Loader.BasisWorker = function () { + + let config; + let transcoderPending; + let BasisModule; + + const EngineFormat = _EngineFormat; // eslint-disable-line no-undef + const EngineType = _EngineType; // eslint-disable-line no-undef + const TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef + const BasisFormat = _BasisFormat; // eslint-disable-line no-undef + + self.addEventListener( 'message', function ( e ) { + + const message = e.data; + + switch ( message.type ) { + + case 'init': + config = message.config; + init( message.transcoderBinary ); + break; + + case 'transcode': + transcoderPending.then( () => { + + try { + + const { faces, buffers, width, height, hasAlpha, format, type, dfdFlags } = transcode( message.buffer ); + + self.postMessage( { type: 'transcode', id: message.id, data: { faces, width, height, hasAlpha, format, type, dfdFlags } }, buffers ); + + } catch ( error ) { + + console.error( error ); + + self.postMessage( { type: 'error', id: message.id, error: error.message } ); + + } + + } ); + break; + + } + + } ); + + function init( wasmBinary ) { + + transcoderPending = new Promise( ( resolve ) => { + + BasisModule = { wasmBinary, onRuntimeInitialized: resolve }; + BASIS( BasisModule ); // eslint-disable-line no-undef + + } ).then( () => { + + BasisModule.initializeBasis(); + + if ( BasisModule.KTX2File === undefined ) { + + console.warn( 'THREE.KTX2Loader: Please update Basis Universal transcoder.' ); + + } + + } ); + + } + + function transcode( buffer ) { + + const ktx2File = new BasisModule.KTX2File( new Uint8Array( buffer ) ); + + function cleanup() { + + ktx2File.close(); + ktx2File.delete(); + + } + + if ( ! ktx2File.isValid() ) { + + cleanup(); + throw new Error( 'THREE.KTX2Loader: Invalid or unsupported .ktx2 file' ); + + } + + let basisFormat; + + if ( ktx2File.isUASTC() ) { + + basisFormat = BasisFormat.UASTC; + + } else if ( ktx2File.isETC1S() ) { + + basisFormat = BasisFormat.ETC1S; + + } else if ( ktx2File.isHDR() ) { + + basisFormat = BasisFormat.UASTC_HDR; + + } else { + + throw new Error( 'THREE.KTX2Loader: Unknown Basis encoding' ); + + } + + const width = ktx2File.getWidth(); + const height = ktx2File.getHeight(); + const layerCount = ktx2File.getLayers() || 1; + const levelCount = ktx2File.getLevels(); + const faceCount = ktx2File.getFaces(); + const hasAlpha = ktx2File.getHasAlpha(); + const dfdFlags = ktx2File.getDFDFlags(); + + const { transcoderFormat, engineFormat, engineType } = getTranscoderFormat( basisFormat, width, height, hasAlpha ); + + if ( ! width || ! height || ! levelCount ) { + + cleanup(); + throw new Error( 'THREE.KTX2Loader: Invalid texture' ); + + } + + if ( ! ktx2File.startTranscoding() ) { + + cleanup(); + throw new Error( 'THREE.KTX2Loader: .startTranscoding failed' ); + + } + + const faces = []; + const buffers = []; + + for ( let face = 0; face < faceCount; face ++ ) { + + const mipmaps = []; + + for ( let mip = 0; mip < levelCount; mip ++ ) { + + const layerMips = []; + + let mipWidth, mipHeight; + + for ( let layer = 0; layer < layerCount; layer ++ ) { + + const levelInfo = ktx2File.getImageLevelInfo( mip, layer, face ); + + if ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) { + + console.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' ); + + } + + if ( levelCount > 1 ) { + + mipWidth = levelInfo.origWidth; + mipHeight = levelInfo.origHeight; + + } else { + + // Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with + // mipmaps must use multiple-of-four dimensions, for some texture formats and APIs. + // See mrdoob/three.js#25908. + mipWidth = levelInfo.width; + mipHeight = levelInfo.height; + + } + + let dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) ); + const status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, -1, -1 ); + + if ( engineType === EngineType.HalfFloatType ) { + + dst = new Uint16Array( dst.buffer, dst.byteOffset, dst.byteLength / Uint16Array.BYTES_PER_ELEMENT ); + + } + + if ( ! status ) { + + cleanup(); + throw new Error( 'THREE.KTX2Loader: .transcodeImage failed.' ); + + } + + layerMips.push( dst ); + + } + + const mipData = concat( layerMips ); + + mipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } ); + buffers.push( mipData.buffer ); + + } + + faces.push( { mipmaps, width, height, format: engineFormat, type: engineType } ); + + } + + cleanup(); + + return { faces, buffers, width, height, hasAlpha, dfdFlags, format: engineFormat, type: engineType }; + + } + + // + + // Optimal choice of a transcoder target format depends on the Basis format (ETC1S, UASTC, or + // UASTC HDR), device capabilities, and texture dimensions. The list below ranks the formats + // separately for each format. Currently, priority is assigned based on: + // + // high quality > low quality > uncompressed + // + // Prioritization may be revisited, or exposed for configuration, in the future. + // + // Reference: https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXDeveloperGuide.md + const FORMAT_OPTIONS = [ + { + if: 'astcSupported', + basisFormat: [ BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4 ], + engineFormat: [ EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: Infinity, + priorityUASTC: 1, + needsPowerOfTwo: false, + }, + { + if: 'bptcSupported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5 ], + engineFormat: [ EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 3, + priorityUASTC: 2, + needsPowerOfTwo: false, + }, + { + if: 'dxtSupported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.BC1, TranscoderFormat.BC3 ], + engineFormat: [ EngineFormat.RGBA_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 4, + priorityUASTC: 5, + needsPowerOfTwo: false, + }, + { + if: 'etc2Supported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.ETC1, TranscoderFormat.ETC2 ], + engineFormat: [ EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 1, + priorityUASTC: 3, + needsPowerOfTwo: false, + }, + { + if: 'etc1Supported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.ETC1 ], + engineFormat: [ EngineFormat.RGB_ETC1_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 2, + priorityUASTC: 4, + needsPowerOfTwo: false, + }, + { + if: 'pvrtcSupported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA ], + engineFormat: [ EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 5, + priorityUASTC: 6, + needsPowerOfTwo: true, + }, + { + if: 'bptcSupported', + basisFormat: [ BasisFormat.UASTC_HDR ], + transcoderFormat: [ TranscoderFormat.BC6H ], + engineFormat: [ EngineFormat.RGB_BPTC_UNSIGNED_Format ], + engineType: [ EngineType.HalfFloatType ], + priorityHDR: 1, + needsPowerOfTwo: false, + }, + + // Uncompressed fallbacks. + + { + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.RGBA32, TranscoderFormat.RGBA32 ], + engineFormat: [ EngineFormat.RGBAFormat, EngineFormat.RGBAFormat ], + engineType: [ EngineType.UnsignedByteType, EngineType.UnsignedByteType ], + priorityETC1S: 100, + priorityUASTC: 100, + needsPowerOfTwo: false, + }, + { + basisFormat: [ BasisFormat.UASTC_HDR ], + transcoderFormat: [ TranscoderFormat.RGBA_HALF ], + engineFormat: [ EngineFormat.RGBAFormat ], + engineType: [ EngineType.HalfFloatType ], + priorityHDR: 100, + needsPowerOfTwo: false, + } + ]; + + const OPTIONS = { + // TODO: For ETC1S we intentionally sort by _UASTC_ priority, preserving + // a historical accident shown to avoid performance pitfalls for Linux with + // Firefox & AMD GPU (RadeonSI). Further work needed. + // See https://github.com/mrdoob/three.js/pull/29730. + [ BasisFormat.ETC1S ]: FORMAT_OPTIONS + .filter( ( opt ) => opt.basisFormat.includes( BasisFormat.ETC1S ) ) + .sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ), + + [ BasisFormat.UASTC ]: FORMAT_OPTIONS + .filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC ) ) + .sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ), + + [ BasisFormat.UASTC_HDR ]: FORMAT_OPTIONS + .filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC_HDR ) ) + .sort( ( a, b ) => a.priorityHDR - b.priorityHDR ), + }; + + function getTranscoderFormat( basisFormat, width, height, hasAlpha ) { + + const options = OPTIONS[ basisFormat ]; + + for ( let i = 0; i < options.length; i ++ ) { + + const opt = options[ i ]; + + if ( opt.if && ! config[ opt.if ] ) continue; + if ( ! opt.basisFormat.includes( basisFormat ) ) continue; + if ( hasAlpha && opt.transcoderFormat.length < 2 ) continue; + if ( opt.needsPowerOfTwo && ! ( isPowerOfTwo( width ) && isPowerOfTwo( height ) ) ) continue; + + const transcoderFormat = opt.transcoderFormat[ hasAlpha ? 1 : 0 ]; + const engineFormat = opt.engineFormat[ hasAlpha ? 1 : 0 ]; + const engineType = opt.engineType[ 0 ]; + + return { transcoderFormat, engineFormat, engineType }; + + } + + throw new Error( 'THREE.KTX2Loader: Failed to identify transcoding target.' ); + + } + + function isPowerOfTwo( value ) { + + if ( value <= 2 ) return true; + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + } + + /** + * Concatenates N byte arrays. + * + * @param {Uint8Array[]} arrays + * @return {Uint8Array} + */ + function concat( arrays ) { + + if ( arrays.length === 1 ) return arrays[ 0 ]; + + let totalByteLength = 0; + + for ( let i = 0; i < arrays.length; i ++ ) { + + const array = arrays[ i ]; + totalByteLength += array.byteLength; + + } + + const result = new Uint8Array( totalByteLength ); + + let byteOffset = 0; + + for ( let i = 0; i < arrays.length; i ++ ) { + + const array = arrays[ i ]; + result.set( array, byteOffset ); + + byteOffset += array.byteLength; + + } + + return result; + + } + +}; + +// Parsing for non-Basis textures. These textures may have supercompression +// like Zstd, but they do not require transcoding. + +const UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGFormat, RedFormat ] ); + +const FORMAT_MAP = { + + [ Ae ]: RGBAFormat, + [ ge ]: RGBAFormat, + [ Ft ]: RGBAFormat, + [ Ct ]: RGBAFormat, + + [ we ]: RGFormat, + [ ae ]: RGFormat, + [ xt ]: RGFormat, + [ wt ]: RGFormat, + + [ ue ]: RedFormat, + [ te$1 ]: RedFormat, + [ yt ]: RedFormat, + [ ct ]: RedFormat, + + [ pi ]: RGBA_ASTC_4x4_Format, + [ Sn ]: RGBA_ASTC_6x6_Format, + [ In ]: RGBA_ASTC_6x6_Format, + +}; + +const TYPE_MAP = { + + [ Ae ]: FloatType, + [ ge ]: HalfFloatType, + [ Ft ]: UnsignedByteType, + [ Ct ]: UnsignedByteType, + + [ we ]: FloatType, + [ ae ]: HalfFloatType, + [ xt ]: UnsignedByteType, + [ wt ]: UnsignedByteType, + + [ ue ]: FloatType, + [ te$1 ]: HalfFloatType, + [ yt ]: UnsignedByteType, + [ ct ]: UnsignedByteType, + + [ pi ]: HalfFloatType, + [ Sn ]: UnsignedByteType, + [ In ]: UnsignedByteType, + +}; + +async function createRawTexture( container ) { + + const { vkFormat } = container; + + if ( FORMAT_MAP[ vkFormat ] === undefined ) { + + throw new Error( 'THREE.KTX2Loader: Unsupported vkFormat.' ); + + } + + // + + let zstd; + + if ( container.supercompressionScheme === n ) { + + if ( ! _zstd ) { + + _zstd = new Promise( async ( resolve ) => { + + const zstd = new Q(); + await zstd.init(); + resolve( zstd ); + + } ); + + } + + zstd = await _zstd; + + } + + // + + const mipmaps = []; + + + for ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) { + + const levelWidth = Math.max( 1, container.pixelWidth >> levelIndex ); + const levelHeight = Math.max( 1, container.pixelHeight >> levelIndex ); + const levelDepth = container.pixelDepth ? Math.max( 1, container.pixelDepth >> levelIndex ) : 0; + + const level = container.levels[ levelIndex ]; + + let levelData; + + if ( container.supercompressionScheme === t ) { + + levelData = level.levelData; + + } else if ( container.supercompressionScheme === n ) { + + levelData = zstd.decode( level.levelData, level.uncompressedByteLength ); + + } else { + + throw new Error( 'THREE.KTX2Loader: Unsupported supercompressionScheme.' ); + + } + + let data; + + if ( TYPE_MAP[ vkFormat ] === FloatType ) { + + data = new Float32Array( + + levelData.buffer, + levelData.byteOffset, + levelData.byteLength / Float32Array.BYTES_PER_ELEMENT + + ); + + } else if ( TYPE_MAP[ vkFormat ] === HalfFloatType ) { + + data = new Uint16Array( + + levelData.buffer, + levelData.byteOffset, + levelData.byteLength / Uint16Array.BYTES_PER_ELEMENT + + ); + + } else { + + data = levelData; + + } + + mipmaps.push( { + + data: data, + width: levelWidth, + height: levelHeight, + depth: levelDepth, + + } ); + + } + + let texture; + + if ( UNCOMPRESSED_FORMATS.has( FORMAT_MAP[ vkFormat ] ) ) { + + texture = container.pixelDepth === 0 + ? new DataTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight ) + : new Data3DTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight, container.pixelDepth ); + + } else { + + if ( container.pixelDepth > 0 ) throw new Error( 'THREE.KTX2Loader: Unsupported pixelDepth.' ); + + texture = new CompressedTexture( mipmaps, container.pixelWidth, container.pixelHeight ); + + texture.minFilter = mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter; + texture.magFilter = LinearFilter; + + } + + texture.mipmaps = mipmaps; + + texture.type = TYPE_MAP[ vkFormat ]; + texture.format = FORMAT_MAP[ vkFormat ]; + texture.colorSpace = parseColorSpace( container ); + texture.needsUpdate = true; + + // + + return Promise.resolve( texture ); + +} + +function parseColorSpace( container ) { + + const dfd = container.dataFormatDescriptor[ 0 ]; + + if ( dfd.colorPrimaries === C$1 ) { + + return dfd.transferFunction === u ? SRGBColorSpace : LinearSRGBColorSpace; + + } else if ( dfd.colorPrimaries === R ) { + + return dfd.transferFunction === u ? DisplayP3ColorSpace : LinearDisplayP3ColorSpace; + + } else if ( dfd.colorPrimaries === T ) { + + return NoColorSpace; + + } else { + + console.warn( `THREE.KTX2Loader: Unsupported color primaries, "${ dfd.colorPrimaries }"` ); + return NoColorSpace; + + } + +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$9, _b$9; +const $retainerCount = Symbol('retainerCount'); +const $recentlyUsed = Symbol('recentlyUsed'); +const $evict = Symbol('evict'); +const $evictionThreshold = Symbol('evictionThreshold'); +const $cache = Symbol('cache'); +/** + * The CacheEvictionPolicy manages the lifecycle for items in a cache, + * evicting any items outside some threshold bounds in "recently used" order, + * if they are evictable. + * + * Items are considered cached as they are retained. When all retainers + * of an item release it, that item is considered evictable. + */ +class CacheEvictionPolicy { + constructor(cache, evictionThreshold = 5) { + this[_a$9] = new Map(); + this[_b$9] = []; + this[$cache] = cache; + this[$evictionThreshold] = evictionThreshold; + } + /** + * The eviction threshold is the maximum number of items to hold + * in cache indefinitely. Items within the threshold (in recently + * used order) will continue to be cached even if they have zero + * retainers. + */ + set evictionThreshold(value) { + this[$evictionThreshold] = value; + this[$evict](); + } + get evictionThreshold() { + return this[$evictionThreshold]; + } + /** + * A reference to the cache that operates under this policy + */ + get cache() { + return this[$cache]; + } + /** + * Given an item key, returns the number of retainers of that item + */ + retainerCount(key) { + return this[$retainerCount].get(key) || 0; + } + /** + * Resets the internal tracking of cache item retainers. Use only in cases + * where it is certain that all retained cache items have been accounted for! + */ + reset() { + this[$retainerCount].clear(); + this[$recentlyUsed] = []; + } + /** + * Mark a given cache item as retained, where the item is represented + * by its key. An item can have any number of retainers. + */ + retain(key) { + if (!this[$retainerCount].has(key)) { + this[$retainerCount].set(key, 0); + } + this[$retainerCount].set(key, this[$retainerCount].get(key) + 1); + const recentlyUsedIndex = this[$recentlyUsed].indexOf(key); + if (recentlyUsedIndex !== -1) { + this[$recentlyUsed].splice(recentlyUsedIndex, 1); + } + this[$recentlyUsed].unshift(key); + // Evict, in case retaining a new item pushed an evictable item beyond the + // eviction threshold + this[$evict](); + } + /** + * Mark a given cache item as released by one of its retainers, where the item + * is represented by its key. When all retainers of an item have released it, + * the item is considered evictable. + */ + release(key) { + if (this[$retainerCount].has(key)) { + this[$retainerCount].set(key, Math.max(this[$retainerCount].get(key) - 1, 0)); + } + this[$evict](); + } + [(_a$9 = $retainerCount, _b$9 = $recentlyUsed, $evict)]() { + if (this[$recentlyUsed].length < this[$evictionThreshold]) { + return; + } + for (let i = this[$recentlyUsed].length - 1; i >= this[$evictionThreshold]; --i) { + const key = this[$recentlyUsed][i]; + const retainerCount = this[$retainerCount].get(key); + if (retainerCount === 0) { + this[$cache].delete(key); + this[$recentlyUsed].splice(i, 1); + } + } + } +} + +/* @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * KHR_materials_variants specification allows duplicated variant names + * but it makes handling the extension complex. + * We ensure tha names and make it easier. + * If you want to export the extension with the original names + * you are recommended to write GLTFExporter plugin to restore the names. + * + * @param variantNames {Array} + * @return {Array} + */ +const ensureUniqueNames = (variantNames) => { + const uniqueNames = []; + const knownNames = new Set(); + for (const name of variantNames) { + let uniqueName = name; + let suffix = 0; + // @TODO: An easy solution. + // O(N^2) in the worst scenario where N is variantNames.length. + // Fix me if needed. + while (knownNames.has(uniqueName)) { + uniqueName = name + '.' + (++suffix); + } + knownNames.add(uniqueName); + uniqueNames.push(uniqueName); + } + return uniqueNames; +}; +/** + * Convert mappings array to table object to make handling the extension easier. + * + * @param + * extensionDef {glTF.meshes[n].primitive.extensions.KHR_materials_variants} + * @param variantNames {Array} Required to be unique names + * @return {Map} + */ +const mappingsArrayToTable = (extensionDef) => { + const table = new Map(); + for (const mapping of extensionDef.mappings) { + for (const variant of mapping.variants) { + table.set(variant, { material: null, gltfMaterialIndex: mapping.material }); + } + } + return table; +}; +class GLTFMaterialsVariantsExtension { + constructor(parser) { + this.parser = parser; + this.name = 'KHR_materials_variants'; + } + // Note that the following properties will be overridden even if they are + // pre-defined + // - gltf.userData.variants + // - mesh.userData.variantMaterials + afterRoot(gltf) { + const parser = this.parser; + const json = parser.json; + if (json.extensions === undefined || + json.extensions[this.name] === undefined) { + return null; + } + const extensionDef = json.extensions[this.name]; + const variantsDef = extensionDef.variants || []; + const variants = ensureUniqueNames(variantsDef.map((v) => v.name)); + for (const scene of gltf.scenes) { + // Save the variants data under associated mesh.userData + scene.traverse(object => { + const mesh = object; + if (!mesh.material) { + return; + } + const association = parser.associations.get(mesh); + if (association == null || association.meshes == null || + association.primitives == null) { + return; + } + const meshDef = json.meshes[association.meshes]; + const primitivesDef = meshDef.primitives; + const primitiveDef = primitivesDef[association.primitives]; + const extensionsDef = primitiveDef.extensions; + if (!extensionsDef || !extensionsDef[this.name]) { + return; + } + mesh.userData.variantMaterials = + mappingsArrayToTable(extensionsDef[this.name]); + }); + } + gltf.userData.variants = variants; + return Promise.resolve(); + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$8, _b$8; +Texture$1.DEFAULT_ANISOTROPY = 4; +/** + * A helper to Promise-ify a Three.js GLTFLoader + */ +const loadWithLoader = (url, loader, progressCallback = () => { }) => { + const onProgress = (event) => { + const fraction = event.loaded / event.total; + progressCallback(Math.max(0, Math.min(1, isFinite(fraction) ? fraction : 1))); + }; + return new Promise((resolve, reject) => { + loader.load(url, resolve, onProgress, reject); + }); +}; +/** Helper to load a script tag. */ +const fetchScript = (src) => { + return new Promise((resolve, reject) => { + const script = document.createElement('script'); + document.body.appendChild(script); + script.onload = resolve; + script.onerror = reject; + script.async = true; + script.src = src; + }); +}; +const cache = new Map(); +const preloaded = new Map(); +let dracoDecoderLocation; +const dracoLoader = new DRACOLoader(); +let ktx2TranscoderLocation; +const ktx2Loader = new KTX2Loader(); +let meshoptDecoderLocation; +let meshoptDecoder; +const $loader = Symbol('loader'); +const $evictionPolicy = Symbol('evictionPolicy'); +const $GLTFInstance = Symbol('GLTFInstance'); +class CachingGLTFLoader extends EventDispatcher { + static setDRACODecoderLocation(url) { + dracoDecoderLocation = url; + dracoLoader.setDecoderPath(url); + } + static getDRACODecoderLocation() { + return dracoDecoderLocation; + } + static setKTX2TranscoderLocation(url) { + ktx2TranscoderLocation = url; + ktx2Loader.setTranscoderPath(url); + } + static getKTX2TranscoderLocation() { + return ktx2TranscoderLocation; + } + static setMeshoptDecoderLocation(url) { + if (meshoptDecoderLocation !== url) { + meshoptDecoderLocation = url; + meshoptDecoder = fetchScript(url) + .then(() => MeshoptDecoder.ready) + .then(() => MeshoptDecoder); + } + } + static getMeshoptDecoderLocation() { + return meshoptDecoderLocation; + } + static initializeKTX2Loader(renderer) { + ktx2Loader.detectSupport(renderer); + } + static get cache() { + return cache; + } + /** @nocollapse */ + static clearCache() { + cache.forEach((_value, url) => { + this.delete(url); + }); + this[$evictionPolicy].reset(); + } + static has(url) { + return cache.has(url); + } + /** @nocollapse */ + static async delete(url) { + if (!this.has(url)) { + return; + } + const gltfLoads = cache.get(url); + preloaded.delete(url); + cache.delete(url); + const gltf = await gltfLoads; + // Dispose of the cached glTF's materials and geometries: + gltf.dispose(); + } + /** + * Returns true if the model that corresponds to the specified url is + * available in our local cache. + */ + static hasFinishedLoading(url) { + return !!preloaded.get(url); + } + constructor(GLTFInstance) { + super(); + this[_b$8] = new GLTFLoader().register(parser => new GLTFMaterialsVariantsExtension(parser)); + this[$GLTFInstance] = GLTFInstance; + this[$loader].setDRACOLoader(dracoLoader); + this[$loader].setKTX2Loader(ktx2Loader); + } + get [(_a$8 = $evictionPolicy, _b$8 = $loader, $evictionPolicy)]() { + return this.constructor[$evictionPolicy]; + } + /** + * Preloads a glTF, populating the cache. Returns a promise that resolves + * when the cache is populated. + */ + async preload(url, element, progressCallback = () => { }) { + this[$loader].setWithCredentials(element.withCredentials); + this.dispatchEvent({ type: 'preload', element: element, src: url }); + if (!cache.has(url)) { + if (meshoptDecoder != null) { + this[$loader].setMeshoptDecoder(await meshoptDecoder); + } + const rawGLTFLoads = loadWithLoader(url, this[$loader], (progress) => { + progressCallback(progress * 0.8); + }); + const GLTFInstance = this[$GLTFInstance]; + const gltfInstanceLoads = rawGLTFLoads + .then((rawGLTF) => { + return GLTFInstance.prepare(rawGLTF); + }) + .then((preparedGLTF) => { + progressCallback(0.9); + return new GLTFInstance(preparedGLTF); + }) + .catch((reason => { + console.error(reason); + return new GLTFInstance(); + })); + cache.set(url, gltfInstanceLoads); + } + await cache.get(url); + preloaded.set(url, true); + if (progressCallback) { + progressCallback(1.0); + } + } + /** + * Loads a glTF from the specified url and resolves a unique clone of the + * glTF. If the glTF has already been loaded, makes a clone of the cached + * copy. + */ + async load(url, element, progressCallback = () => { }) { + await this.preload(url, element, progressCallback); + const gltf = await cache.get(url); + const clone = await gltf.clone(); + this[$evictionPolicy].retain(url); + // Patch dispose so that we can properly account for instance use + // in the caching layer: + clone.dispose = () => { + this[$evictionPolicy].release(url); + }; + return clone; + } +} +CachingGLTFLoader[_a$8] = new CacheEvictionPolicy(CachingGLTFLoader); + +class CSS2DObject extends Object3D { + + constructor( element = document.createElement( 'div' ) ) { + + super(); + + this.isCSS2DObject = true; + + this.element = element; + + this.element.style.position = 'absolute'; + this.element.style.userSelect = 'none'; + + this.element.setAttribute( 'draggable', false ); + + this.center = new Vector2( 0.5, 0.5 ); // ( 0, 0 ) is the lower left; ( 1, 1 ) is the top right + + this.addEventListener( 'removed', function () { + + this.traverse( function ( object ) { + + if ( + object.element instanceof object.element.ownerDocument.defaultView.Element && + object.element.parentNode !== null + ) { + + object.element.remove(); + + } + + } ); + + } ); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.element = source.element.cloneNode( true ); + + this.center = source.center; + + return this; + + } + +} + +// + +const _vector = new Vector3(); +const _viewMatrix = new Matrix4(); +const _viewProjectionMatrix = new Matrix4(); +const _a$7 = new Vector3(); +const _b$7 = new Vector3(); + +class CSS2DRenderer { + + constructor( parameters = {} ) { + + const _this = this; + + let _width, _height; + let _widthHalf, _heightHalf; + + const cache = { + objects: new WeakMap() + }; + + const domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' ); + + domElement.style.overflow = 'hidden'; + + this.domElement = domElement; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.render = function ( scene, camera ) { + + if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld(); + if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld(); + + _viewMatrix.copy( camera.matrixWorldInverse ); + _viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix ); + + renderObject( scene, scene, camera ); + zOrder( scene ); + + }; + + this.setSize = function ( width, height ) { + + _width = width; + _height = height; + + _widthHalf = _width / 2; + _heightHalf = _height / 2; + + domElement.style.width = width + 'px'; + domElement.style.height = height + 'px'; + + }; + + function hideObject( object ) { + + if ( object.isCSS2DObject ) object.element.style.display = 'none'; + + for ( let i = 0, l = object.children.length; i < l; i ++ ) { + + hideObject( object.children[ i ] ); + + } + + } + + function renderObject( object, scene, camera ) { + + if ( object.visible === false ) { + + hideObject( object ); + + return; + + } + + if ( object.isCSS2DObject ) { + + _vector.setFromMatrixPosition( object.matrixWorld ); + _vector.applyMatrix4( _viewProjectionMatrix ); + + const visible = ( _vector.z >= -1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true ); + + const element = object.element; + element.style.display = visible === true ? '' : 'none'; + + if ( visible === true ) { + + object.onBeforeRender( _this, scene, camera ); + + element.style.transform = 'translate(' + ( -100 * object.center.x ) + '%,' + ( -100 * object.center.y ) + '%)' + 'translate(' + ( _vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - _vector.y * _heightHalf + _heightHalf ) + 'px)'; + + if ( element.parentNode !== domElement ) { + + domElement.appendChild( element ); + + } + + object.onAfterRender( _this, scene, camera ); + + } + + const objectData = { + distanceToCameraSquared: getDistanceToSquared( camera, object ) + }; + + cache.objects.set( object, objectData ); + + } + + for ( let i = 0, l = object.children.length; i < l; i ++ ) { + + renderObject( object.children[ i ], scene, camera ); + + } + + } + + function getDistanceToSquared( object1, object2 ) { + + _a$7.setFromMatrixPosition( object1.matrixWorld ); + _b$7.setFromMatrixPosition( object2.matrixWorld ); + + return _a$7.distanceToSquared( _b$7 ); + + } + + function filterAndFlatten( scene ) { + + const result = []; + + scene.traverseVisible( function ( object ) { + + if ( object.isCSS2DObject ) result.push( object ); + + } ); + + return result; + + } + + function zOrder( scene ) { + + const sorted = filterAndFlatten( scene ).sort( function ( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return b.renderOrder - a.renderOrder; + + } + + const distanceA = cache.objects.get( a ).distanceToCameraSquared; + const distanceB = cache.objects.get( b ).distanceToCameraSquared; + + return distanceA - distanceB; + + } ); + + const zMax = sorted.length; + + for ( let i = 0, l = sorted.length; i < l; i ++ ) { + + sorted[ i ].element.style.zIndex = zMax - i; + + } + + } + + } + +} + +function reduceVertices( object, func, initialValue ) { + + let value = initialValue; + const vertex = new Vector3(); + + object.updateWorldMatrix( true, true ); + + object.traverseVisible( ( child ) => { + + const { geometry } = child; + + if ( geometry !== undefined ) { + + const { position } = geometry.attributes; + + if ( position !== undefined ) { + + for ( let i = 0, l = position.count; i < l; i ++ ) { + + if ( child.isMesh ) { + + child.getVertexPosition( i, vertex ); + + } else { + + vertex.fromBufferAttribute( position, i ); + + } + + if ( ! child.isSkinnedMesh ) { + + vertex.applyMatrix4( child.matrixWorld ); + + } + + value = func( value, vertex ); + + } + + } + + } + + } ); + + return value; + +} + +/** + * The KHR_mesh_quantization extension allows these extra attribute component types + * + * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md#extending-mesh-attributes + */ +const KHR_mesh_quantization_ExtraAttrTypes = { + POSITION: [ + 'byte', + 'byte normalized', + 'unsigned byte', + 'unsigned byte normalized', + 'short', + 'short normalized', + 'unsigned short', + 'unsigned short normalized', + ], + NORMAL: [ + 'byte normalized', + 'short normalized', + ], + TANGENT: [ + 'byte normalized', + 'short normalized', + ], + TEXCOORD: [ + 'byte', + 'byte normalized', + 'unsigned byte', + 'short', + 'short normalized', + 'unsigned short', + ], +}; + + +class GLTFExporter { + + constructor() { + + this.textureUtils = null; + + this.pluginCallbacks = []; + + this.register( function ( writer ) { + + return new GLTFLightExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsUnlitExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsTransmissionExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsVolumeExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsIorExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsSpecularExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsClearcoatExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsDispersionExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsIridescenceExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsSheenExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsAnisotropyExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsEmissiveStrengthExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsBumpExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMeshGpuInstancing( writer ); + + } ); + + } + + register( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) === -1 ) { + + this.pluginCallbacks.push( callback ); + + } + + return this; + + } + + unregister( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) !== -1 ) { + + this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 ); + + } + + return this; + + } + + setTextureUtils( utils ) { + + this.textureUtils = utils; + + return this; + + } + + /** + * Parse scenes and generate GLTF output + * + * @param {Scene|Array} input Scene or Array of THREE.Scenes + * @param {Function} onDone Callback on completed + * @param {Function} onError Callback on errors + * @param {Object} options options + */ + parse( input, onDone, onError, options ) { + + const writer = new GLTFWriter(); + const plugins = []; + + for ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) { + + plugins.push( this.pluginCallbacks[ i ]( writer ) ); + + } + + writer.setPlugins( plugins ); + writer.setTextureUtils( this.textureUtils ); + writer.writeAsync( input, onDone, options ).catch( onError ); + + } + + parseAsync( input, options ) { + + const scope = this; + + return new Promise( function ( resolve, reject ) { + + scope.parse( input, resolve, reject, options ); + + } ); + + } + +} + +//------------------------------------------------------------------------------ +// Constants +//------------------------------------------------------------------------------ + +const WEBGL_CONSTANTS = { + POINTS: 0x0000, + LINES: 0x0001, + LINE_LOOP: 0x0002, + LINE_STRIP: 0x0003, + TRIANGLES: 0x0004, + BYTE: 0x1400, + UNSIGNED_BYTE: 0x1401, + SHORT: 0x1402, + UNSIGNED_SHORT: 0x1403, + INT: 0x1404, + UNSIGNED_INT: 0x1405, + FLOAT: 0x1406, + + ARRAY_BUFFER: 0x8892, + ELEMENT_ARRAY_BUFFER: 0x8893, + + NEAREST: 0x2600, + LINEAR: 0x2601, + NEAREST_MIPMAP_NEAREST: 0x2700, + LINEAR_MIPMAP_NEAREST: 0x2701, + NEAREST_MIPMAP_LINEAR: 0x2702, + LINEAR_MIPMAP_LINEAR: 0x2703, + + CLAMP_TO_EDGE: 33071, + MIRRORED_REPEAT: 33648, + REPEAT: 10497 +}; + +const KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization'; + +const THREE_TO_WEBGL = {}; + +THREE_TO_WEBGL[ NearestFilter ] = WEBGL_CONSTANTS.NEAREST; +THREE_TO_WEBGL[ NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST; +THREE_TO_WEBGL[ NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR; +THREE_TO_WEBGL[ LinearFilter ] = WEBGL_CONSTANTS.LINEAR; +THREE_TO_WEBGL[ LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST; +THREE_TO_WEBGL[ LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR; + +THREE_TO_WEBGL[ ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE; +THREE_TO_WEBGL[ RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT; +THREE_TO_WEBGL[ MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT; + +const PATH_PROPERTIES = { + scale: 'scale', + position: 'translation', + quaternion: 'rotation', + morphTargetInfluences: 'weights' +}; + +const DEFAULT_SPECULAR_COLOR = new Color(); + +// GLB constants +// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification + +const GLB_HEADER_BYTES = 12; +const GLB_HEADER_MAGIC = 0x46546C67; +const GLB_VERSION = 2; + +const GLB_CHUNK_PREFIX_BYTES = 8; +const GLB_CHUNK_TYPE_JSON = 0x4E4F534A; +const GLB_CHUNK_TYPE_BIN = 0x004E4942; + +//------------------------------------------------------------------------------ +// Utility functions +//------------------------------------------------------------------------------ + +/** + * Compare two arrays + * @param {Array} array1 Array 1 to compare + * @param {Array} array2 Array 2 to compare + * @return {boolean} Returns true if both arrays are equal + */ +function equalArray( array1, array2 ) { + + return ( array1.length === array2.length ) && array1.every( function ( element, index ) { + + return element === array2[ index ]; + + } ); + +} + +/** + * Converts a string to an ArrayBuffer. + * @param {string} text + * @return {ArrayBuffer} + */ +function stringToArrayBuffer( text ) { + + return new TextEncoder().encode( text ).buffer; + +} + +/** + * Is identity matrix + * + * @param {Matrix4} matrix + * @returns {boolean} Returns true, if parameter is identity matrix + */ +function isIdentityMatrix( matrix ) { + + return equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] ); + +} + +/** + * Get the min and max vectors from the given attribute + * + * @param {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count + * @param {number} start Start index + * @param {number} count Range to cover + * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components) + */ +function getMinMax( attribute, start, count ) { + + const output = { + + min: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ), + max: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY ) + + }; + + for ( let i = start; i < start + count; i ++ ) { + + for ( let a = 0; a < attribute.itemSize; a ++ ) { + + let value; + + if ( attribute.itemSize > 4 ) { + + // no support for interleaved data for itemSize > 4 + + value = attribute.array[ i * attribute.itemSize + a ]; + + } else { + + if ( a === 0 ) value = attribute.getX( i ); + else if ( a === 1 ) value = attribute.getY( i ); + else if ( a === 2 ) value = attribute.getZ( i ); + else if ( a === 3 ) value = attribute.getW( i ); + + if ( attribute.normalized === true ) { + + value = MathUtils.normalize( value, attribute.array ); + + } + + } + + output.min[ a ] = Math.min( output.min[ a ], value ); + output.max[ a ] = Math.max( output.max[ a ], value ); + + } + + } + + return output; + +} + +/** + * Get the required size + padding for a buffer, rounded to the next 4-byte boundary. + * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment + * + * @param {number} bufferSize The size the original buffer. Should be an integer. + * @returns {number} new buffer size with required padding as an integer. + * + */ +function getPaddedBufferSize( bufferSize ) { + + return Math.ceil( bufferSize / 4 ) * 4; + +} + +/** + * Returns a buffer aligned to 4-byte boundary. + * + * @param {ArrayBuffer} arrayBuffer Buffer to pad + * @param {number} [paddingByte=0] Should be an integer + * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer + */ +function getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) { + + const paddedLength = getPaddedBufferSize( arrayBuffer.byteLength ); + + if ( paddedLength !== arrayBuffer.byteLength ) { + + const array = new Uint8Array( paddedLength ); + array.set( new Uint8Array( arrayBuffer ) ); + + if ( paddingByte !== 0 ) { + + for ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) { + + array[ i ] = paddingByte; + + } + + } + + return array.buffer; + + } + + return arrayBuffer; + +} + +function getCanvas() { + + if ( typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined' ) { + + return new OffscreenCanvas( 1, 1 ); + + } + + return document.createElement( 'canvas' ); + +} + +function getToBlobPromise( canvas, mimeType ) { + + if ( canvas.toBlob !== undefined ) { + + return new Promise( ( resolve ) => canvas.toBlob( resolve, mimeType ) ); + + } + + let quality; + + // Blink's implementation of convertToBlob seems to default to a quality level of 100% + // Use the Blink default quality levels of toBlob instead so that file sizes are comparable. + if ( mimeType === 'image/jpeg' ) { + + quality = 0.92; + + } else if ( mimeType === 'image/webp' ) { + + quality = 0.8; + + } + + return canvas.convertToBlob( { + + type: mimeType, + quality: quality + + } ); + +} + +/** + * Writer + */ +class GLTFWriter { + + constructor() { + + this.plugins = []; + + this.options = {}; + this.pending = []; + this.buffers = []; + + this.byteOffset = 0; + this.buffers = []; + this.nodeMap = new Map(); + this.skins = []; + + this.extensionsUsed = {}; + this.extensionsRequired = {}; + + this.uids = new Map(); + this.uid = 0; + + this.json = { + asset: { + version: '2.0', + generator: 'THREE.GLTFExporter r' + REVISION + } + }; + + this.cache = { + meshes: new Map(), + attributes: new Map(), + attributesNormalized: new Map(), + materials: new Map(), + textures: new Map(), + images: new Map() + }; + + this.textureUtils = null; + + } + + setPlugins( plugins ) { + + this.plugins = plugins; + + } + + setTextureUtils( utils ) { + + this.textureUtils = utils; + + } + + /** + * Parse scenes and generate GLTF output + * + * @param {Scene|Array} input Scene or Array of THREE.Scenes + * @param {Function} onDone Callback on completed + * @param {Object} options options + */ + async writeAsync( input, onDone, options = {} ) { + + this.options = Object.assign( { + // default options + binary: false, + trs: false, + onlyVisible: true, + maxTextureSize: Infinity, + animations: [], + includeCustomExtensions: false + }, options ); + + if ( this.options.animations.length > 0 ) { + + // Only TRS properties, and not matrices, may be targeted by animation. + this.options.trs = true; + + } + + await this.processInputAsync( input ); + + await Promise.all( this.pending ); + + const writer = this; + const buffers = writer.buffers; + const json = writer.json; + options = writer.options; + + const extensionsUsed = writer.extensionsUsed; + const extensionsRequired = writer.extensionsRequired; + + // Merge buffers. + const blob = new Blob( buffers, { type: 'application/octet-stream' } ); + + // Declare extensions. + const extensionsUsedList = Object.keys( extensionsUsed ); + const extensionsRequiredList = Object.keys( extensionsRequired ); + + if ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList; + if ( extensionsRequiredList.length > 0 ) json.extensionsRequired = extensionsRequiredList; + + // Update bytelength of the single buffer. + if ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size; + + if ( options.binary === true ) { + + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification + + const reader = new FileReader(); + reader.readAsArrayBuffer( blob ); + reader.onloadend = function () { + + // Binary chunk. + const binaryChunk = getPaddedArrayBuffer( reader.result ); + const binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) ); + binaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true ); + binaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true ); + + // JSON chunk. + const jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 ); + const jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) ); + jsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true ); + jsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true ); + + // GLB header. + const header = new ArrayBuffer( GLB_HEADER_BYTES ); + const headerView = new DataView( header ); + headerView.setUint32( 0, GLB_HEADER_MAGIC, true ); + headerView.setUint32( 4, GLB_VERSION, true ); + const totalByteLength = GLB_HEADER_BYTES + + jsonChunkPrefix.byteLength + jsonChunk.byteLength + + binaryChunkPrefix.byteLength + binaryChunk.byteLength; + headerView.setUint32( 8, totalByteLength, true ); + + const glbBlob = new Blob( [ + header, + jsonChunkPrefix, + jsonChunk, + binaryChunkPrefix, + binaryChunk + ], { type: 'application/octet-stream' } ); + + const glbReader = new FileReader(); + glbReader.readAsArrayBuffer( glbBlob ); + glbReader.onloadend = function () { + + onDone( glbReader.result ); + + }; + + }; + + } else { + + if ( json.buffers && json.buffers.length > 0 ) { + + const reader = new FileReader(); + reader.readAsDataURL( blob ); + reader.onloadend = function () { + + const base64data = reader.result; + json.buffers[ 0 ].uri = base64data; + onDone( json ); + + }; + + } else { + + onDone( json ); + + } + + } + + + } + + /** + * Serializes a userData. + * + * @param {THREE.Object3D|THREE.Material} object + * @param {Object} objectDef + */ + serializeUserData( object, objectDef ) { + + if ( Object.keys( object.userData ).length === 0 ) return; + + const options = this.options; + const extensionsUsed = this.extensionsUsed; + + try { + + const json = JSON.parse( JSON.stringify( object.userData ) ); + + if ( options.includeCustomExtensions && json.gltfExtensions ) { + + if ( objectDef.extensions === undefined ) objectDef.extensions = {}; + + for ( const extensionName in json.gltfExtensions ) { + + objectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ]; + extensionsUsed[ extensionName ] = true; + + } + + delete json.gltfExtensions; + + } + + if ( Object.keys( json ).length > 0 ) objectDef.extras = json; + + } catch ( error ) { + + console.warn( 'THREE.GLTFExporter: userData of \'' + object.name + '\' ' + + 'won\'t be serialized because of JSON.stringify error - ' + error.message ); + + } + + } + + /** + * Returns ids for buffer attributes. + * + * @param {Object} attribute + * @param {boolean} [isRelativeCopy=false] + * @return {number} An integer + */ + getUID( attribute, isRelativeCopy = false ) { + + if ( this.uids.has( attribute ) === false ) { + + const uids = new Map(); + + uids.set( true, this.uid ++ ); + uids.set( false, this.uid ++ ); + + this.uids.set( attribute, uids ); + + } + + const uids = this.uids.get( attribute ); + + return uids.get( isRelativeCopy ); + + } + + /** + * Checks if normal attribute values are normalized. + * + * @param {BufferAttribute} normal + * @returns {boolean} + */ + isNormalizedNormalAttribute( normal ) { + + const cache = this.cache; + + if ( cache.attributesNormalized.has( normal ) ) return false; + + const v = new Vector3(); + + for ( let i = 0, il = normal.count; i < il; i ++ ) { + + // 0.0005 is from glTF-validator + if ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false; + + } + + return true; + + } + + /** + * Creates normalized normal buffer attribute. + * + * @param {BufferAttribute} normal + * @returns {BufferAttribute} + * + */ + createNormalizedNormalAttribute( normal ) { + + const cache = this.cache; + + if ( cache.attributesNormalized.has( normal ) ) return cache.attributesNormalized.get( normal ); + + const attribute = normal.clone(); + const v = new Vector3(); + + for ( let i = 0, il = attribute.count; i < il; i ++ ) { + + v.fromBufferAttribute( attribute, i ); + + if ( v.x === 0 && v.y === 0 && v.z === 0 ) { + + // if values can't be normalized set (1, 0, 0) + v.setX( 1.0 ); + + } else { + + v.normalize(); + + } + + attribute.setXYZ( i, v.x, v.y, v.z ); + + } + + cache.attributesNormalized.set( normal, attribute ); + + return attribute; + + } + + /** + * Applies a texture transform, if present, to the map definition. Requires + * the KHR_texture_transform extension. + * + * @param {Object} mapDef + * @param {THREE.Texture} texture + */ + applyTextureTransform( mapDef, texture ) { + + let didTransform = false; + const transformDef = {}; + + if ( texture.offset.x !== 0 || texture.offset.y !== 0 ) { + + transformDef.offset = texture.offset.toArray(); + didTransform = true; + + } + + if ( texture.rotation !== 0 ) { + + transformDef.rotation = texture.rotation; + didTransform = true; + + } + + if ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) { + + transformDef.scale = texture.repeat.toArray(); + didTransform = true; + + } + + if ( didTransform ) { + + mapDef.extensions = mapDef.extensions || {}; + mapDef.extensions[ 'KHR_texture_transform' ] = transformDef; + this.extensionsUsed[ 'KHR_texture_transform' ] = true; + + } + + } + + async buildMetalRoughTextureAsync( metalnessMap, roughnessMap ) { + + if ( metalnessMap === roughnessMap ) return metalnessMap; + + function getEncodingConversion( map ) { + + if ( map.colorSpace === SRGBColorSpace ) { + + return function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + + }; + + } + + return function LinearToLinear( c ) { + + return c; + + }; + + } + + if ( metalnessMap instanceof CompressedTexture ) { + + metalnessMap = await this.decompressTextureAsync( metalnessMap ); + + } + + if ( roughnessMap instanceof CompressedTexture ) { + + roughnessMap = await this.decompressTextureAsync( roughnessMap ); + + } + + const metalness = metalnessMap ? metalnessMap.image : null; + const roughness = roughnessMap ? roughnessMap.image : null; + + const width = Math.max( metalness ? metalness.width : 0, roughness ? roughness.width : 0 ); + const height = Math.max( metalness ? metalness.height : 0, roughness ? roughness.height : 0 ); + + const canvas = getCanvas(); + canvas.width = width; + canvas.height = height; + + const context = canvas.getContext( '2d', { + willReadFrequently: true, + } ); + context.fillStyle = '#00ffff'; + context.fillRect( 0, 0, width, height ); + + const composite = context.getImageData( 0, 0, width, height ); + + if ( metalness ) { + + context.drawImage( metalness, 0, 0, width, height ); + + const convert = getEncodingConversion( metalnessMap ); + const data = context.getImageData( 0, 0, width, height ).data; + + for ( let i = 2; i < data.length; i += 4 ) { + + composite.data[ i ] = convert( data[ i ] / 256 ) * 256; + + } + + } + + if ( roughness ) { + + context.drawImage( roughness, 0, 0, width, height ); + + const convert = getEncodingConversion( roughnessMap ); + const data = context.getImageData( 0, 0, width, height ).data; + + for ( let i = 1; i < data.length; i += 4 ) { + + composite.data[ i ] = convert( data[ i ] / 256 ) * 256; + + } + + } + + context.putImageData( composite, 0, 0 ); + + // + + const reference = metalnessMap || roughnessMap; + + const texture = reference.clone(); + + texture.source = new Source( canvas ); + texture.colorSpace = NoColorSpace; + texture.channel = ( metalnessMap || roughnessMap ).channel; + + if ( metalnessMap && roughnessMap && metalnessMap.channel !== roughnessMap.channel ) { + + console.warn( 'THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match.' ); + + } + + console.warn( 'THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.' ); + + return texture; + + } + + + async decompressTextureAsync( texture, maxTextureSize = Infinity ) { + + if ( this.textureUtils === null ) { + + throw new Error( 'THREE.GLTFExporter: setTextureUtils() must be called to process compressed textures.' ); + + } + + return await this.textureUtils.decompress( texture, maxTextureSize ); + + } + + /** + * Process a buffer to append to the default one. + * @param {ArrayBuffer} buffer + * @return {0} + */ + processBuffer( buffer ) { + + const json = this.json; + const buffers = this.buffers; + + if ( ! json.buffers ) json.buffers = [ { byteLength: 0 } ]; + + // All buffers are merged before export. + buffers.push( buffer ); + + return 0; + + } + + /** + * Process and generate a BufferView + * @param {BufferAttribute} attribute + * @param {number} componentType + * @param {number} start + * @param {number} count + * @param {?number} target Target usage of the BufferView + * @return {Object} + */ + processBufferView( attribute, componentType, start, count, target ) { + + const json = this.json; + + if ( ! json.bufferViews ) json.bufferViews = []; + + // Create a new dataview and dump the attribute's array into it + + let componentSize; + + switch ( componentType ) { + + case WEBGL_CONSTANTS.BYTE: + case WEBGL_CONSTANTS.UNSIGNED_BYTE: + + componentSize = 1; + + break; + + case WEBGL_CONSTANTS.SHORT: + case WEBGL_CONSTANTS.UNSIGNED_SHORT: + + componentSize = 2; + + break; + + default: + + componentSize = 4; + + } + + let byteStride = attribute.itemSize * componentSize; + + if ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) { + + // Each element of a vertex attribute MUST be aligned to 4-byte boundaries + // inside a bufferView + byteStride = Math.ceil( byteStride / 4 ) * 4; + + } + + const byteLength = getPaddedBufferSize( count * byteStride ); + const dataView = new DataView( new ArrayBuffer( byteLength ) ); + let offset = 0; + + for ( let i = start; i < start + count; i ++ ) { + + for ( let a = 0; a < attribute.itemSize; a ++ ) { + + let value; + + if ( attribute.itemSize > 4 ) { + + // no support for interleaved data for itemSize > 4 + + value = attribute.array[ i * attribute.itemSize + a ]; + + } else { + + if ( a === 0 ) value = attribute.getX( i ); + else if ( a === 1 ) value = attribute.getY( i ); + else if ( a === 2 ) value = attribute.getZ( i ); + else if ( a === 3 ) value = attribute.getW( i ); + + if ( attribute.normalized === true ) { + + value = MathUtils.normalize( value, attribute.array ); + + } + + } + + if ( componentType === WEBGL_CONSTANTS.FLOAT ) { + + dataView.setFloat32( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.INT ) { + + dataView.setInt32( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) { + + dataView.setUint32( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.SHORT ) { + + dataView.setInt16( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) { + + dataView.setUint16( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.BYTE ) { + + dataView.setInt8( offset, value ); + + } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) { + + dataView.setUint8( offset, value ); + + } + + offset += componentSize; + + } + + if ( ( offset % byteStride ) !== 0 ) { + + offset += byteStride - ( offset % byteStride ); + + } + + } + + const bufferViewDef = { + + buffer: this.processBuffer( dataView.buffer ), + byteOffset: this.byteOffset, + byteLength: byteLength + + }; + + if ( target !== undefined ) bufferViewDef.target = target; + + if ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) { + + // Only define byteStride for vertex attributes. + bufferViewDef.byteStride = byteStride; + + } + + this.byteOffset += byteLength; + + json.bufferViews.push( bufferViewDef ); + + // @TODO Merge bufferViews where possible. + const output = { + + id: json.bufferViews.length - 1, + byteLength: 0 + + }; + + return output; + + } + + /** + * Process and generate a BufferView from an image Blob. + * @param {Blob} blob + * @return {Promise} An integer + */ + processBufferViewImage( blob ) { + + const writer = this; + const json = writer.json; + + if ( ! json.bufferViews ) json.bufferViews = []; + + return new Promise( function ( resolve ) { + + const reader = new FileReader(); + reader.readAsArrayBuffer( blob ); + reader.onloadend = function () { + + const buffer = getPaddedArrayBuffer( reader.result ); + + const bufferViewDef = { + buffer: writer.processBuffer( buffer ), + byteOffset: writer.byteOffset, + byteLength: buffer.byteLength + }; + + writer.byteOffset += buffer.byteLength; + resolve( json.bufferViews.push( bufferViewDef ) - 1 ); + + }; + + } ); + + } + + /** + * Process attribute to generate an accessor + * @param {BufferAttribute} attribute Attribute to process + * @param {?BufferGeometry} geometry Geometry used for truncated draw range + * @param {number} [start=0] + * @param {number} [count=Infinity] + * @return {?number} Index of the processed accessor on the "accessors" array + */ + processAccessor( attribute, geometry, start, count ) { + + const json = this.json; + + const types = { + + 1: 'SCALAR', + 2: 'VEC2', + 3: 'VEC3', + 4: 'VEC4', + 9: 'MAT3', + 16: 'MAT4' + + }; + + let componentType; + + // Detect the component type of the attribute array + if ( attribute.array.constructor === Float32Array ) { + + componentType = WEBGL_CONSTANTS.FLOAT; + + } else if ( attribute.array.constructor === Int32Array ) { + + componentType = WEBGL_CONSTANTS.INT; + + } else if ( attribute.array.constructor === Uint32Array ) { + + componentType = WEBGL_CONSTANTS.UNSIGNED_INT; + + } else if ( attribute.array.constructor === Int16Array ) { + + componentType = WEBGL_CONSTANTS.SHORT; + + } else if ( attribute.array.constructor === Uint16Array ) { + + componentType = WEBGL_CONSTANTS.UNSIGNED_SHORT; + + } else if ( attribute.array.constructor === Int8Array ) { + + componentType = WEBGL_CONSTANTS.BYTE; + + } else if ( attribute.array.constructor === Uint8Array ) { + + componentType = WEBGL_CONSTANTS.UNSIGNED_BYTE; + + } else { + + throw new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type: ' + attribute.array.constructor.name ); + + } + + if ( start === undefined ) start = 0; + if ( count === undefined || count === Infinity ) count = attribute.count; + + // Skip creating an accessor if the attribute doesn't have data to export + if ( count === 0 ) return null; + + const minMax = getMinMax( attribute, start, count ); + let bufferViewTarget; + + // If geometry isn't provided, don't infer the target usage of the bufferView. For + // animation samplers, target must not be set. + if ( geometry !== undefined ) { + + bufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER; + + } + + const bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget ); + + const accessorDef = { + + bufferView: bufferView.id, + byteOffset: bufferView.byteOffset, + componentType: componentType, + count: count, + max: minMax.max, + min: minMax.min, + type: types[ attribute.itemSize ] + + }; + + if ( attribute.normalized === true ) accessorDef.normalized = true; + if ( ! json.accessors ) json.accessors = []; + + return json.accessors.push( accessorDef ) - 1; + + } + + /** + * Process image + * @param {Image} image to process + * @param {number} format Identifier of the format (RGBAFormat) + * @param {boolean} flipY before writing out the image + * @param {string} mimeType export format + * @return {number} Index of the processed texture in the "images" array + */ + processImage( image, format, flipY, mimeType = 'image/png' ) { + + if ( image !== null ) { + + const writer = this; + const cache = writer.cache; + const json = writer.json; + const options = writer.options; + const pending = writer.pending; + + if ( ! cache.images.has( image ) ) cache.images.set( image, {} ); + + const cachedImages = cache.images.get( image ); + + const key = mimeType + ':flipY/' + flipY.toString(); + + if ( cachedImages[ key ] !== undefined ) return cachedImages[ key ]; + + if ( ! json.images ) json.images = []; + + const imageDef = { mimeType: mimeType }; + + const canvas = getCanvas(); + + canvas.width = Math.min( image.width, options.maxTextureSize ); + canvas.height = Math.min( image.height, options.maxTextureSize ); + + const ctx = canvas.getContext( '2d', { + willReadFrequently: true, + } ); + + if ( flipY === true ) { + + ctx.translate( 0, canvas.height ); + ctx.scale( 1, -1 ); + + } + + if ( image.data !== undefined ) { // THREE.DataTexture + + if ( format !== RGBAFormat ) { + + console.error( 'GLTFExporter: Only RGBAFormat is supported.', format ); + + } + + if ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) { + + console.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image ); + + } + + const data = new Uint8ClampedArray( image.height * image.width * 4 ); + + for ( let i = 0; i < data.length; i += 4 ) { + + data[ i + 0 ] = image.data[ i + 0 ]; + data[ i + 1 ] = image.data[ i + 1 ]; + data[ i + 2 ] = image.data[ i + 2 ]; + data[ i + 3 ] = image.data[ i + 3 ]; + + } + + ctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 ); + + } else { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) || + ( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ) { + + ctx.drawImage( image, 0, 0, canvas.width, canvas.height ); + + } else { + + throw new Error( 'THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.' ); + + } + + } + + if ( options.binary === true ) { + + pending.push( + + getToBlobPromise( canvas, mimeType ) + .then( blob => writer.processBufferViewImage( blob ) ) + .then( bufferViewIndex => { + + imageDef.bufferView = bufferViewIndex; + + } ) + + ); + + } else { + + if ( canvas.toDataURL !== undefined ) { + + imageDef.uri = canvas.toDataURL( mimeType ); + + } else { + + pending.push( + + getToBlobPromise( canvas, mimeType ) + .then( blob => new FileReader().readAsDataURL( blob ) ) + .then( dataURL => { + + imageDef.uri = dataURL; + + } ) + + ); + + } + + } + + const index = json.images.push( imageDef ) - 1; + cachedImages[ key ] = index; + return index; + + } else { + + throw new Error( 'THREE.GLTFExporter: No valid image data found. Unable to process texture.' ); + + } + + } + + /** + * Process sampler + * @param {Texture} map Texture to process + * @return {number} Index of the processed texture in the "samplers" array + */ + processSampler( map ) { + + const json = this.json; + + if ( ! json.samplers ) json.samplers = []; + + const samplerDef = { + magFilter: THREE_TO_WEBGL[ map.magFilter ], + minFilter: THREE_TO_WEBGL[ map.minFilter ], + wrapS: THREE_TO_WEBGL[ map.wrapS ], + wrapT: THREE_TO_WEBGL[ map.wrapT ] + }; + + return json.samplers.push( samplerDef ) - 1; + + } + + /** + * Process texture + * @param {Texture} map Map to process + * @return {Promise} Index of the processed texture in the "textures" array + */ + async processTextureAsync( map ) { + + const writer = this; + const options = writer.options; + const cache = this.cache; + const json = this.json; + + if ( cache.textures.has( map ) ) return cache.textures.get( map ); + + if ( ! json.textures ) json.textures = []; + + // make non-readable textures (e.g. CompressedTexture) readable by blitting them into a new texture + if ( map instanceof CompressedTexture ) { + + map = await this.decompressTextureAsync( map, options.maxTextureSize ); + + } + + let mimeType = map.userData.mimeType; + + if ( mimeType === 'image/webp' ) mimeType = 'image/png'; + + const textureDef = { + sampler: this.processSampler( map ), + source: this.processImage( map.image, map.format, map.flipY, mimeType ) + }; + + if ( map.name ) textureDef.name = map.name; + + await this._invokeAllAsync( async function ( ext ) { + + ext.writeTexture && await ext.writeTexture( map, textureDef ); + + } ); + + const index = json.textures.push( textureDef ) - 1; + cache.textures.set( map, index ); + return index; + + } + + /** + * Process material + * @param {THREE.Material} material Material to process + * @return {Promise} Index of the processed material in the "materials" array + */ + async processMaterialAsync( material ) { + + const cache = this.cache; + const json = this.json; + + if ( cache.materials.has( material ) ) return cache.materials.get( material ); + + if ( material.isShaderMaterial ) { + + console.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' ); + return null; + + } + + if ( ! json.materials ) json.materials = []; + + // @QUESTION Should we avoid including any attribute that has the default value? + const materialDef = { pbrMetallicRoughness: {} }; + + if ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) { + + console.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' ); + + } + + // pbrMetallicRoughness.baseColorFactor + const color = material.color.toArray().concat( [ material.opacity ] ); + + if ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) { + + materialDef.pbrMetallicRoughness.baseColorFactor = color; + + } + + if ( material.isMeshStandardMaterial ) { + + materialDef.pbrMetallicRoughness.metallicFactor = material.metalness; + materialDef.pbrMetallicRoughness.roughnessFactor = material.roughness; + + } else { + + materialDef.pbrMetallicRoughness.metallicFactor = 0; + materialDef.pbrMetallicRoughness.roughnessFactor = 1; + + } + + // pbrMetallicRoughness.metallicRoughnessTexture + if ( material.metalnessMap || material.roughnessMap ) { + + const metalRoughTexture = await this.buildMetalRoughTextureAsync( material.metalnessMap, material.roughnessMap ); + + const metalRoughMapDef = { + index: await this.processTextureAsync( metalRoughTexture ), + texCoord: metalRoughTexture.channel + }; + this.applyTextureTransform( metalRoughMapDef, metalRoughTexture ); + materialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef; + + } + + // pbrMetallicRoughness.baseColorTexture + if ( material.map ) { + + const baseColorMapDef = { + index: await this.processTextureAsync( material.map ), + texCoord: material.map.channel + }; + this.applyTextureTransform( baseColorMapDef, material.map ); + materialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef; + + } + + if ( material.emissive ) { + + const emissive = material.emissive; + const maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b ); + + if ( maxEmissiveComponent > 0 ) { + + materialDef.emissiveFactor = material.emissive.toArray(); + + } + + // emissiveTexture + if ( material.emissiveMap ) { + + const emissiveMapDef = { + index: await this.processTextureAsync( material.emissiveMap ), + texCoord: material.emissiveMap.channel + }; + this.applyTextureTransform( emissiveMapDef, material.emissiveMap ); + materialDef.emissiveTexture = emissiveMapDef; + + } + + } + + // normalTexture + if ( material.normalMap ) { + + const normalMapDef = { + index: await this.processTextureAsync( material.normalMap ), + texCoord: material.normalMap.channel + }; + + if ( material.normalScale && material.normalScale.x !== 1 ) { + + // glTF normal scale is univariate. Ignore `y`, which may be flipped. + // Context: https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 + normalMapDef.scale = material.normalScale.x; + + } + + this.applyTextureTransform( normalMapDef, material.normalMap ); + materialDef.normalTexture = normalMapDef; + + } + + // occlusionTexture + if ( material.aoMap ) { + + const occlusionMapDef = { + index: await this.processTextureAsync( material.aoMap ), + texCoord: material.aoMap.channel + }; + + if ( material.aoMapIntensity !== 1.0 ) { + + occlusionMapDef.strength = material.aoMapIntensity; + + } + + this.applyTextureTransform( occlusionMapDef, material.aoMap ); + materialDef.occlusionTexture = occlusionMapDef; + + } + + // alphaMode + if ( material.transparent ) { + + materialDef.alphaMode = 'BLEND'; + + } else { + + if ( material.alphaTest > 0.0 ) { + + materialDef.alphaMode = 'MASK'; + materialDef.alphaCutoff = material.alphaTest; + + } + + } + + // doubleSided + if ( material.side === DoubleSide ) materialDef.doubleSided = true; + if ( material.name !== '' ) materialDef.name = material.name; + + this.serializeUserData( material, materialDef ); + + await this._invokeAllAsync( async function ( ext ) { + + ext.writeMaterialAsync && await ext.writeMaterialAsync( material, materialDef ); + + } ); + + const index = json.materials.push( materialDef ) - 1; + cache.materials.set( material, index ); + return index; + + } + + /** + * Process mesh + * @param {THREE.Mesh} mesh Mesh to process + * @return {Promise} Index of the processed mesh in the "meshes" array + */ + async processMeshAsync( mesh ) { + + const cache = this.cache; + const json = this.json; + + const meshCacheKeyParts = [ mesh.geometry.uuid ]; + + if ( Array.isArray( mesh.material ) ) { + + for ( let i = 0, l = mesh.material.length; i < l; i ++ ) { + + meshCacheKeyParts.push( mesh.material[ i ].uuid ); + + } + + } else { + + meshCacheKeyParts.push( mesh.material.uuid ); + + } + + const meshCacheKey = meshCacheKeyParts.join( ':' ); + + if ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey ); + + const geometry = mesh.geometry; + + let mode; + + // Use the correct mode + if ( mesh.isLineSegments ) { + + mode = WEBGL_CONSTANTS.LINES; + + } else if ( mesh.isLineLoop ) { + + mode = WEBGL_CONSTANTS.LINE_LOOP; + + } else if ( mesh.isLine ) { + + mode = WEBGL_CONSTANTS.LINE_STRIP; + + } else if ( mesh.isPoints ) { + + mode = WEBGL_CONSTANTS.POINTS; + + } else { + + mode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES; + + } + + const meshDef = {}; + const attributes = {}; + const primitives = []; + const targets = []; + + // Conversion between attributes names in threejs and gltf spec + const nameConversion = { + uv: 'TEXCOORD_0', + uv1: 'TEXCOORD_1', + uv2: 'TEXCOORD_2', + uv3: 'TEXCOORD_3', + color: 'COLOR_0', + skinWeight: 'WEIGHTS_0', + skinIndex: 'JOINTS_0' + }; + + const originalNormal = geometry.getAttribute( 'normal' ); + + if ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) { + + console.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' ); + + geometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) ); + + } + + // @QUESTION Detect if .vertexColors = true? + // For every attribute create an accessor + let modifiedAttribute = null; + + for ( let attributeName in geometry.attributes ) { + + // Ignore morph target attributes, which are exported later. + if ( attributeName.slice( 0, 5 ) === 'morph' ) continue; + + const attribute = geometry.attributes[ attributeName ]; + attributeName = nameConversion[ attributeName ] || attributeName.toUpperCase(); + + // Prefix all geometry attributes except the ones specifically + // listed in the spec; non-spec attributes are considered custom. + const validVertexAttributes = + /^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/; + + if ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName; + + if ( cache.attributes.has( this.getUID( attribute ) ) ) { + + attributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) ); + continue; + + } + + // Enforce glTF vertex attribute requirements: + // - JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT + // - Only custom attributes may be INT or UNSIGNED_INT + modifiedAttribute = null; + const array = attribute.array; + + if ( attributeName === 'JOINTS_0' && + ! ( array instanceof Uint16Array ) && + ! ( array instanceof Uint8Array ) ) { + + console.warn( 'GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.' ); + modifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized ); + + } else if ( ( array instanceof Uint32Array || array instanceof Int32Array ) && ! attributeName.startsWith( '_' ) ) { + + console.warn( `GLTFExporter: Attribute "${ attributeName }" converted to type FLOAT.` ); + modifiedAttribute = GLTFExporter.Utils.toFloat32BufferAttribute( attribute ); + + } + + const accessor = this.processAccessor( modifiedAttribute || attribute, geometry ); + + if ( accessor !== null ) { + + if ( ! attributeName.startsWith( '_' ) ) { + + this.detectMeshQuantization( attributeName, attribute ); + + } + + attributes[ attributeName ] = accessor; + cache.attributes.set( this.getUID( attribute ), accessor ); + + } + + } + + if ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal ); + + // Skip if no exportable attributes found + if ( Object.keys( attributes ).length === 0 ) return null; + + // Morph targets + if ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) { + + const weights = []; + const targetNames = []; + const reverseDictionary = {}; + + if ( mesh.morphTargetDictionary !== undefined ) { + + for ( const key in mesh.morphTargetDictionary ) { + + reverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key; + + } + + } + + for ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) { + + const target = {}; + let warned = false; + + for ( const attributeName in geometry.morphAttributes ) { + + // glTF 2.0 morph supports only POSITION/NORMAL/TANGENT. + // Three.js doesn't support TANGENT yet. + + if ( attributeName !== 'position' && attributeName !== 'normal' ) { + + if ( ! warned ) { + + console.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' ); + warned = true; + + } + + continue; + + } + + const attribute = geometry.morphAttributes[ attributeName ][ i ]; + const gltfAttributeName = attributeName.toUpperCase(); + + // Three.js morph attribute has absolute values while the one of glTF has relative values. + // + // glTF 2.0 Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets + + const baseAttribute = geometry.attributes[ attributeName ]; + + if ( cache.attributes.has( this.getUID( attribute, true ) ) ) { + + target[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute, true ) ); + continue; + + } + + // Clones attribute not to override + const relativeAttribute = attribute.clone(); + + if ( ! geometry.morphTargetsRelative ) { + + for ( let j = 0, jl = attribute.count; j < jl; j ++ ) { + + for ( let a = 0; a < attribute.itemSize; a ++ ) { + + if ( a === 0 ) relativeAttribute.setX( j, attribute.getX( j ) - baseAttribute.getX( j ) ); + if ( a === 1 ) relativeAttribute.setY( j, attribute.getY( j ) - baseAttribute.getY( j ) ); + if ( a === 2 ) relativeAttribute.setZ( j, attribute.getZ( j ) - baseAttribute.getZ( j ) ); + if ( a === 3 ) relativeAttribute.setW( j, attribute.getW( j ) - baseAttribute.getW( j ) ); + + } + + } + + } + + target[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry ); + cache.attributes.set( this.getUID( baseAttribute, true ), target[ gltfAttributeName ] ); + + } + + targets.push( target ); + + weights.push( mesh.morphTargetInfluences[ i ] ); + + if ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] ); + + } + + meshDef.weights = weights; + + if ( targetNames.length > 0 ) { + + meshDef.extras = {}; + meshDef.extras.targetNames = targetNames; + + } + + } + + const isMultiMaterial = Array.isArray( mesh.material ); + + if ( isMultiMaterial && geometry.groups.length === 0 ) return null; + + let didForceIndices = false; + + if ( isMultiMaterial && geometry.index === null ) { + + const indices = []; + + for ( let i = 0, il = geometry.attributes.position.count; i < il; i ++ ) { + + indices[ i ] = i; + + } + + geometry.setIndex( indices ); + + didForceIndices = true; + + } + + const materials = isMultiMaterial ? mesh.material : [ mesh.material ]; + const groups = isMultiMaterial ? geometry.groups : [ { materialIndex: 0, start: undefined, count: undefined } ]; + + for ( let i = 0, il = groups.length; i < il; i ++ ) { + + const primitive = { + mode: mode, + attributes: attributes, + }; + + this.serializeUserData( geometry, primitive ); + + if ( targets.length > 0 ) primitive.targets = targets; + + if ( geometry.index !== null ) { + + let cacheKey = this.getUID( geometry.index ); + + if ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) { + + cacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count; + + } + + if ( cache.attributes.has( cacheKey ) ) { + + primitive.indices = cache.attributes.get( cacheKey ); + + } else { + + primitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count ); + cache.attributes.set( cacheKey, primitive.indices ); + + } + + if ( primitive.indices === null ) delete primitive.indices; + + } + + const material = await this.processMaterialAsync( materials[ groups[ i ].materialIndex ] ); + + if ( material !== null ) primitive.material = material; + + primitives.push( primitive ); + + } + + if ( didForceIndices === true ) { + + geometry.setIndex( null ); + + } + + meshDef.primitives = primitives; + + if ( ! json.meshes ) json.meshes = []; + + await this._invokeAllAsync( function ( ext ) { + + ext.writeMesh && ext.writeMesh( mesh, meshDef ); + + } ); + + const index = json.meshes.push( meshDef ) - 1; + cache.meshes.set( meshCacheKey, index ); + return index; + + } + + /** + * If a vertex attribute with a + * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview) + * is used, it is checked whether it is a valid data type according to the + * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md) + * extension. + * In this case the extension is automatically added to the list of used extensions. + * + * @param {string} attributeName + * @param {THREE.BufferAttribute} attribute + */ + detectMeshQuantization( attributeName, attribute ) { + + if ( this.extensionsUsed[ KHR_MESH_QUANTIZATION ] ) return; + + let attrType = undefined; + + switch ( attribute.array.constructor ) { + + case Int8Array: + + attrType = 'byte'; + + break; + + case Uint8Array: + + attrType = 'unsigned byte'; + + break; + + case Int16Array: + + attrType = 'short'; + + break; + + case Uint16Array: + + attrType = 'unsigned short'; + + break; + + default: + + return; + + } + + if ( attribute.normalized ) attrType += ' normalized'; + + const attrNamePrefix = attributeName.split( '_', 1 )[ 0 ]; + + if ( KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ] && KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ].includes( attrType ) ) { + + this.extensionsUsed[ KHR_MESH_QUANTIZATION ] = true; + this.extensionsRequired[ KHR_MESH_QUANTIZATION ] = true; + + } + + } + + /** + * Process camera + * @param {THREE.Camera} camera Camera to process + * @return {number} Index of the processed mesh in the "camera" array + */ + processCamera( camera ) { + + const json = this.json; + + if ( ! json.cameras ) json.cameras = []; + + const isOrtho = camera.isOrthographicCamera; + + const cameraDef = { + type: isOrtho ? 'orthographic' : 'perspective' + }; + + if ( isOrtho ) { + + cameraDef.orthographic = { + xmag: camera.right * 2, + ymag: camera.top * 2, + zfar: camera.far <= 0 ? 0.001 : camera.far, + znear: camera.near < 0 ? 0 : camera.near + }; + + } else { + + cameraDef.perspective = { + aspectRatio: camera.aspect, + yfov: MathUtils.degToRad( camera.fov ), + zfar: camera.far <= 0 ? 0.001 : camera.far, + znear: camera.near < 0 ? 0 : camera.near + }; + + } + + // Question: Is saving "type" as name intentional? + if ( camera.name !== '' ) cameraDef.name = camera.type; + + return json.cameras.push( cameraDef ) - 1; + + } + + /** + * Creates glTF animation entry from AnimationClip object. + * + * Status: + * - Only properties listed in PATH_PROPERTIES may be animated. + * + * @param {THREE.AnimationClip} clip + * @param {THREE.Object3D} root + * @return {number|null} + */ + processAnimation( clip, root ) { + + const json = this.json; + const nodeMap = this.nodeMap; + + if ( ! json.animations ) json.animations = []; + + clip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root ); + + const tracks = clip.tracks; + const channels = []; + const samplers = []; + + for ( let i = 0; i < tracks.length; ++ i ) { + + const track = tracks[ i ]; + const trackBinding = PropertyBinding.parseTrackName( track.name ); + let trackNode = PropertyBinding.findNode( root, trackBinding.nodeName ); + const trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ]; + + if ( trackBinding.objectName === 'bones' ) { + + if ( trackNode.isSkinnedMesh === true ) { + + trackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex ); + + } else { + + trackNode = undefined; + + } + + } + + if ( ! trackNode || ! trackProperty ) { + + console.warn( 'THREE.GLTFExporter: Could not export animation track "%s".', track.name ); + continue; + + } + + const inputItemSize = 1; + let outputItemSize = track.values.length / track.times.length; + + if ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) { + + outputItemSize /= trackNode.morphTargetInfluences.length; + + } + + let interpolation; + + // @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE + + // Detecting glTF cubic spline interpolant by checking factory method's special property + // GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return + // valid value from .getInterpolation(). + if ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) { + + interpolation = 'CUBICSPLINE'; + + // itemSize of CUBICSPLINE keyframe is 9 + // (VEC3 * 3: inTangent, splineVertex, and outTangent) + // but needs to be stored as VEC3 so dividing by 3 here. + outputItemSize /= 3; + + } else if ( track.getInterpolation() === InterpolateDiscrete ) { + + interpolation = 'STEP'; + + } else { + + interpolation = 'LINEAR'; + + } + + samplers.push( { + input: this.processAccessor( new BufferAttribute( track.times, inputItemSize ) ), + output: this.processAccessor( new BufferAttribute( track.values, outputItemSize ) ), + interpolation: interpolation + } ); + + channels.push( { + sampler: samplers.length - 1, + target: { + node: nodeMap.get( trackNode ), + path: trackProperty + } + } ); + + } + + json.animations.push( { + name: clip.name || 'clip_' + json.animations.length, + samplers: samplers, + channels: channels + } ); + + return json.animations.length - 1; + + } + + /** + * @param {THREE.Object3D} object + * @return {number|null} + */ + processSkin( object ) { + + const json = this.json; + const nodeMap = this.nodeMap; + + const node = json.nodes[ nodeMap.get( object ) ]; + + const skeleton = object.skeleton; + + if ( skeleton === undefined ) return null; + + const rootJoint = object.skeleton.bones[ 0 ]; + + if ( rootJoint === undefined ) return null; + + const joints = []; + const inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 ); + const temporaryBoneInverse = new Matrix4(); + + for ( let i = 0; i < skeleton.bones.length; ++ i ) { + + joints.push( nodeMap.get( skeleton.bones[ i ] ) ); + temporaryBoneInverse.copy( skeleton.boneInverses[ i ] ); + temporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 ); + + } + + if ( json.skins === undefined ) json.skins = []; + + json.skins.push( { + inverseBindMatrices: this.processAccessor( new BufferAttribute( inverseBindMatrices, 16 ) ), + joints: joints, + skeleton: nodeMap.get( rootJoint ) + } ); + + const skinIndex = node.skin = json.skins.length - 1; + + return skinIndex; + + } + + /** + * Process Object3D node + * @param {THREE.Object3D} object Object3D to processNodeAsync + * @return {Promise} Index of the node in the nodes list + */ + async processNodeAsync( object ) { + + const json = this.json; + const options = this.options; + const nodeMap = this.nodeMap; + + if ( ! json.nodes ) json.nodes = []; + + const nodeDef = {}; + + if ( options.trs ) { + + const rotation = object.quaternion.toArray(); + const position = object.position.toArray(); + const scale = object.scale.toArray(); + + if ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) { + + nodeDef.rotation = rotation; + + } + + if ( ! equalArray( position, [ 0, 0, 0 ] ) ) { + + nodeDef.translation = position; + + } + + if ( ! equalArray( scale, [ 1, 1, 1 ] ) ) { + + nodeDef.scale = scale; + + } + + } else { + + if ( object.matrixAutoUpdate ) { + + object.updateMatrix(); + + } + + if ( isIdentityMatrix( object.matrix ) === false ) { + + nodeDef.matrix = object.matrix.elements; + + } + + } + + // We don't export empty strings name because it represents no-name in Three.js. + if ( object.name !== '' ) nodeDef.name = String( object.name ); + + this.serializeUserData( object, nodeDef ); + + if ( object.isMesh || object.isLine || object.isPoints ) { + + const meshIndex = await this.processMeshAsync( object ); + + if ( meshIndex !== null ) nodeDef.mesh = meshIndex; + + } else if ( object.isCamera ) { + + nodeDef.camera = this.processCamera( object ); + + } + + if ( object.isSkinnedMesh ) this.skins.push( object ); + + if ( object.children.length > 0 ) { + + const children = []; + + for ( let i = 0, l = object.children.length; i < l; i ++ ) { + + const child = object.children[ i ]; + + if ( child.visible || options.onlyVisible === false ) { + + const nodeIndex = await this.processNodeAsync( child ); + + if ( nodeIndex !== null ) children.push( nodeIndex ); + + } + + } + + if ( children.length > 0 ) nodeDef.children = children; + + } + + await this._invokeAllAsync( function ( ext ) { + + ext.writeNode && ext.writeNode( object, nodeDef ); + + } ); + + const nodeIndex = json.nodes.push( nodeDef ) - 1; + nodeMap.set( object, nodeIndex ); + return nodeIndex; + + } + + /** + * Process Scene + * @param {Scene} scene Scene to process + */ + async processSceneAsync( scene ) { + + const json = this.json; + const options = this.options; + + if ( ! json.scenes ) { + + json.scenes = []; + json.scene = 0; + + } + + const sceneDef = {}; + + if ( scene.name !== '' ) sceneDef.name = scene.name; + + json.scenes.push( sceneDef ); + + const nodes = []; + + for ( let i = 0, l = scene.children.length; i < l; i ++ ) { + + const child = scene.children[ i ]; + + if ( child.visible || options.onlyVisible === false ) { + + const nodeIndex = await this.processNodeAsync( child ); + + if ( nodeIndex !== null ) nodes.push( nodeIndex ); + + } + + } + + if ( nodes.length > 0 ) sceneDef.nodes = nodes; + + this.serializeUserData( scene, sceneDef ); + + } + + /** + * Creates a Scene to hold a list of objects and parse it + * @param {Array} objects List of objects to process + */ + async processObjectsAsync( objects ) { + + const scene = new Scene(); + scene.name = 'AuxScene'; + + for ( let i = 0; i < objects.length; i ++ ) { + + // We push directly to children instead of calling `add` to prevent + // modify the .parent and break its original scene and hierarchy + scene.children.push( objects[ i ] ); + + } + + await this.processSceneAsync( scene ); + + } + + /** + * @param {THREE.Object3D|Array} input + */ + async processInputAsync( input ) { + + const options = this.options; + + input = input instanceof Array ? input : [ input ]; + + await this._invokeAllAsync( function ( ext ) { + + ext.beforeParse && ext.beforeParse( input ); + + } ); + + const objectsWithoutScene = []; + + for ( let i = 0; i < input.length; i ++ ) { + + if ( input[ i ] instanceof Scene ) { + + await this.processSceneAsync( input[ i ] ); + + } else { + + objectsWithoutScene.push( input[ i ] ); + + } + + } + + if ( objectsWithoutScene.length > 0 ) { + + await this.processObjectsAsync( objectsWithoutScene ); + + } + + for ( let i = 0; i < this.skins.length; ++ i ) { + + this.processSkin( this.skins[ i ] ); + + } + + for ( let i = 0; i < options.animations.length; ++ i ) { + + this.processAnimation( options.animations[ i ], input[ 0 ] ); + + } + + await this._invokeAllAsync( function ( ext ) { + + ext.afterParse && ext.afterParse( input ); + + } ); + + } + + async _invokeAllAsync( func ) { + + for ( let i = 0, il = this.plugins.length; i < il; i ++ ) { + + await func( this.plugins[ i ] ); + + } + + } + +} + +/** + * Punctual Lights Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual + */ +class GLTFLightExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_lights_punctual'; + + } + + writeNode( light, nodeDef ) { + + if ( ! light.isLight ) return; + + if ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) { + + console.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light ); + return; + + } + + const writer = this.writer; + const json = writer.json; + const extensionsUsed = writer.extensionsUsed; + + const lightDef = {}; + + if ( light.name ) lightDef.name = light.name; + + lightDef.color = light.color.toArray(); + + lightDef.intensity = light.intensity; + + if ( light.isDirectionalLight ) { + + lightDef.type = 'directional'; + + } else if ( light.isPointLight ) { + + lightDef.type = 'point'; + + if ( light.distance > 0 ) lightDef.range = light.distance; + + } else if ( light.isSpotLight ) { + + lightDef.type = 'spot'; + + if ( light.distance > 0 ) lightDef.range = light.distance; + + lightDef.spot = {}; + lightDef.spot.innerConeAngle = ( 1.0 - light.penumbra ) * light.angle; + lightDef.spot.outerConeAngle = light.angle; + + } + + if ( light.decay !== undefined && light.decay !== 2 ) { + + console.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, ' + + 'and expects light.decay=2.' ); + + } + + if ( light.target + && ( light.target.parent !== light + || light.target.position.x !== 0 + || light.target.position.y !== 0 + || light.target.position.z !== -1 ) ) { + + console.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, ' + + 'make light.target a child of the light with position 0,0,-1.' ); + + } + + if ( ! extensionsUsed[ this.name ] ) { + + json.extensions = json.extensions || {}; + json.extensions[ this.name ] = { lights: [] }; + extensionsUsed[ this.name ] = true; + + } + + const lights = json.extensions[ this.name ].lights; + lights.push( lightDef ); + + nodeDef.extensions = nodeDef.extensions || {}; + nodeDef.extensions[ this.name ] = { light: lights.length - 1 }; + + } + +} + +/** + * Unlit Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit + */ +class GLTFMaterialsUnlitExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_unlit'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshBasicMaterial ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = {}; + + extensionsUsed[ this.name ] = true; + + materialDef.pbrMetallicRoughness.metallicFactor = 0.0; + materialDef.pbrMetallicRoughness.roughnessFactor = 0.9; + + } + +} + +/** + * Clearcoat Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat + */ +class GLTFMaterialsClearcoatExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_clearcoat'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.clearcoat === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.clearcoatFactor = material.clearcoat; + + if ( material.clearcoatMap ) { + + const clearcoatMapDef = { + index: await writer.processTextureAsync( material.clearcoatMap ), + texCoord: material.clearcoatMap.channel + }; + writer.applyTextureTransform( clearcoatMapDef, material.clearcoatMap ); + extensionDef.clearcoatTexture = clearcoatMapDef; + + } + + extensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness; + + if ( material.clearcoatRoughnessMap ) { + + const clearcoatRoughnessMapDef = { + index: await writer.processTextureAsync( material.clearcoatRoughnessMap ), + texCoord: material.clearcoatRoughnessMap.channel + }; + writer.applyTextureTransform( clearcoatRoughnessMapDef, material.clearcoatRoughnessMap ); + extensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef; + + } + + if ( material.clearcoatNormalMap ) { + + const clearcoatNormalMapDef = { + index: await writer.processTextureAsync( material.clearcoatNormalMap ), + texCoord: material.clearcoatNormalMap.channel + }; + + if ( material.clearcoatNormalScale.x !== 1 ) clearcoatNormalMapDef.scale = material.clearcoatNormalScale.x; + + writer.applyTextureTransform( clearcoatNormalMapDef, material.clearcoatNormalMap ); + extensionDef.clearcoatNormalTexture = clearcoatNormalMapDef; + + } + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + + } + +} + +/** + * Materials dispersion Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_dispersion + */ +class GLTFMaterialsDispersionExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_dispersion'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.dispersion === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.dispersion = material.dispersion; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Iridescence Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence + */ +class GLTFMaterialsIridescenceExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_iridescence'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.iridescence === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.iridescenceFactor = material.iridescence; + + if ( material.iridescenceMap ) { + + const iridescenceMapDef = { + index: await writer.processTextureAsync( material.iridescenceMap ), + texCoord: material.iridescenceMap.channel + }; + writer.applyTextureTransform( iridescenceMapDef, material.iridescenceMap ); + extensionDef.iridescenceTexture = iridescenceMapDef; + + } + + extensionDef.iridescenceIor = material.iridescenceIOR; + extensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[ 0 ]; + extensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[ 1 ]; + + if ( material.iridescenceThicknessMap ) { + + const iridescenceThicknessMapDef = { + index: await writer.processTextureAsync( material.iridescenceThicknessMap ), + texCoord: material.iridescenceThicknessMap.channel + }; + writer.applyTextureTransform( iridescenceThicknessMapDef, material.iridescenceThicknessMap ); + extensionDef.iridescenceThicknessTexture = iridescenceThicknessMapDef; + + } + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Transmission Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission + */ +class GLTFMaterialsTransmissionExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_transmission'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.transmissionFactor = material.transmission; + + if ( material.transmissionMap ) { + + const transmissionMapDef = { + index: await writer.processTextureAsync( material.transmissionMap ), + texCoord: material.transmissionMap.channel + }; + writer.applyTextureTransform( transmissionMapDef, material.transmissionMap ); + extensionDef.transmissionTexture = transmissionMapDef; + + } + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Materials Volume Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume + */ +class GLTFMaterialsVolumeExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_volume'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.thicknessFactor = material.thickness; + + if ( material.thicknessMap ) { + + const thicknessMapDef = { + index: await writer.processTextureAsync( material.thicknessMap ), + texCoord: material.thicknessMap.channel + }; + writer.applyTextureTransform( thicknessMapDef, material.thicknessMap ); + extensionDef.thicknessTexture = thicknessMapDef; + + } + + if ( material.attenuationDistance !== Infinity ) { + + extensionDef.attenuationDistance = material.attenuationDistance; + + } + + extensionDef.attenuationColor = material.attenuationColor.toArray(); + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Materials ior Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior + */ +class GLTFMaterialsIorExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_ior'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.ior === 1.5 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.ior = material.ior; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Materials specular Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular + */ +class GLTFMaterialsSpecularExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_specular'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || ( material.specularIntensity === 1.0 && + material.specularColor.equals( DEFAULT_SPECULAR_COLOR ) && + ! material.specularIntensityMap && ! material.specularColorMap ) ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + if ( material.specularIntensityMap ) { + + const specularIntensityMapDef = { + index: await writer.processTextureAsync( material.specularIntensityMap ), + texCoord: material.specularIntensityMap.channel + }; + writer.applyTextureTransform( specularIntensityMapDef, material.specularIntensityMap ); + extensionDef.specularTexture = specularIntensityMapDef; + + } + + if ( material.specularColorMap ) { + + const specularColorMapDef = { + index: await writer.processTextureAsync( material.specularColorMap ), + texCoord: material.specularColorMap.channel + }; + writer.applyTextureTransform( specularColorMapDef, material.specularColorMap ); + extensionDef.specularColorTexture = specularColorMapDef; + + } + + extensionDef.specularFactor = material.specularIntensity; + extensionDef.specularColorFactor = material.specularColor.toArray(); + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Sheen Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen + */ +class GLTFMaterialsSheenExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_sheen'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.sheen == 0.0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + if ( material.sheenRoughnessMap ) { + + const sheenRoughnessMapDef = { + index: await writer.processTextureAsync( material.sheenRoughnessMap ), + texCoord: material.sheenRoughnessMap.channel + }; + writer.applyTextureTransform( sheenRoughnessMapDef, material.sheenRoughnessMap ); + extensionDef.sheenRoughnessTexture = sheenRoughnessMapDef; + + } + + if ( material.sheenColorMap ) { + + const sheenColorMapDef = { + index: await writer.processTextureAsync( material.sheenColorMap ), + texCoord: material.sheenColorMap.channel + }; + writer.applyTextureTransform( sheenColorMapDef, material.sheenColorMap ); + extensionDef.sheenColorTexture = sheenColorMapDef; + + } + + extensionDef.sheenRoughnessFactor = material.sheenRoughness; + extensionDef.sheenColorFactor = material.sheenColor.toArray(); + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Anisotropy Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy + */ +class GLTFMaterialsAnisotropyExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_anisotropy'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.anisotropy == 0.0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + if ( material.anisotropyMap ) { + + const anisotropyMapDef = { index: await writer.processTextureAsync( material.anisotropyMap ) }; + writer.applyTextureTransform( anisotropyMapDef, material.anisotropyMap ); + extensionDef.anisotropyTexture = anisotropyMapDef; + + } + + extensionDef.anisotropyStrength = material.anisotropy; + extensionDef.anisotropyRotation = material.anisotropyRotation; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Materials Emissive Strength Extension + * + * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md + */ +class GLTFMaterialsEmissiveStrengthExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_emissive_strength'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshStandardMaterial || material.emissiveIntensity === 1.0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.emissiveStrength = material.emissiveIntensity; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + + +/** + * Materials bump Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump + */ +class GLTFMaterialsBumpExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'EXT_materials_bump'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshStandardMaterial || ( + material.bumpScale === 1 && + ! material.bumpMap ) ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + if ( material.bumpMap ) { + + const bumpMapDef = { + index: await writer.processTextureAsync( material.bumpMap ), + texCoord: material.bumpMap.channel + }; + writer.applyTextureTransform( bumpMapDef, material.bumpMap ); + extensionDef.bumpTexture = bumpMapDef; + + } + + extensionDef.bumpFactor = material.bumpScale; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * GPU Instancing Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing + */ +class GLTFMeshGpuInstancing { + + constructor( writer ) { + + this.writer = writer; + this.name = 'EXT_mesh_gpu_instancing'; + + } + + writeNode( object, nodeDef ) { + + if ( ! object.isInstancedMesh ) return; + + const writer = this.writer; + + const mesh = object; + + const translationAttr = new Float32Array( mesh.count * 3 ); + const rotationAttr = new Float32Array( mesh.count * 4 ); + const scaleAttr = new Float32Array( mesh.count * 3 ); + + const matrix = new Matrix4(); + const position = new Vector3(); + const quaternion = new Quaternion(); + const scale = new Vector3(); + + for ( let i = 0; i < mesh.count; i ++ ) { + + mesh.getMatrixAt( i, matrix ); + matrix.decompose( position, quaternion, scale ); + + position.toArray( translationAttr, i * 3 ); + quaternion.toArray( rotationAttr, i * 4 ); + scale.toArray( scaleAttr, i * 3 ); + + } + + const attributes = { + TRANSLATION: writer.processAccessor( new BufferAttribute( translationAttr, 3 ) ), + ROTATION: writer.processAccessor( new BufferAttribute( rotationAttr, 4 ) ), + SCALE: writer.processAccessor( new BufferAttribute( scaleAttr, 3 ) ), + }; + + if ( mesh.instanceColor ) + attributes._COLOR_0 = writer.processAccessor( mesh.instanceColor ); + + nodeDef.extensions = nodeDef.extensions || {}; + nodeDef.extensions[ this.name ] = { attributes }; + + writer.extensionsUsed[ this.name ] = true; + writer.extensionsRequired[ this.name ] = true; + + } + +} + +/** + * Static utility functions + */ +GLTFExporter.Utils = { + + insertKeyframe: function ( track, time ) { + + const tolerance = 0.001; // 1ms + const valueSize = track.getValueSize(); + + const times = new track.TimeBufferType( track.times.length + 1 ); + const values = new track.ValueBufferType( track.values.length + valueSize ); + const interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) ); + + let index; + + if ( track.times.length === 0 ) { + + times[ 0 ] = time; + + for ( let i = 0; i < valueSize; i ++ ) { + + values[ i ] = 0; + + } + + index = 0; + + } else if ( time < track.times[ 0 ] ) { + + if ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0; + + times[ 0 ] = time; + times.set( track.times, 1 ); + + values.set( interpolant.evaluate( time ), 0 ); + values.set( track.values, valueSize ); + + index = 0; + + } else if ( time > track.times[ track.times.length - 1 ] ) { + + if ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) { + + return track.times.length - 1; + + } + + times[ times.length - 1 ] = time; + times.set( track.times, 0 ); + + values.set( track.values, 0 ); + values.set( interpolant.evaluate( time ), track.values.length ); + + index = times.length - 1; + + } else { + + for ( let i = 0; i < track.times.length; i ++ ) { + + if ( Math.abs( track.times[ i ] - time ) < tolerance ) return i; + + if ( track.times[ i ] < time && track.times[ i + 1 ] > time ) { + + times.set( track.times.slice( 0, i + 1 ), 0 ); + times[ i + 1 ] = time; + times.set( track.times.slice( i + 1 ), i + 2 ); + + values.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 ); + values.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize ); + values.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize ); + + index = i + 1; + + break; + + } + + } + + } + + track.times = times; + track.values = values; + + return index; + + }, + + mergeMorphTargetTracks: function ( clip, root ) { + + const tracks = []; + const mergedTracks = {}; + const sourceTracks = clip.tracks; + + for ( let i = 0; i < sourceTracks.length; ++ i ) { + + let sourceTrack = sourceTracks[ i ]; + const sourceTrackBinding = PropertyBinding.parseTrackName( sourceTrack.name ); + const sourceTrackNode = PropertyBinding.findNode( root, sourceTrackBinding.nodeName ); + + if ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) { + + // Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is. + tracks.push( sourceTrack ); + continue; + + } + + if ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete + && sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) { + + if ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) { + + // This should never happen, because glTF morph target animations + // affect all targets already. + throw new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' ); + + } + + console.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' ); + + sourceTrack = sourceTrack.clone(); + sourceTrack.setInterpolation( InterpolateLinear ); + + } + + const targetCount = sourceTrackNode.morphTargetInfluences.length; + const targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ]; + + if ( targetIndex === undefined ) { + + throw new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex ); + + } + + let mergedTrack; + + // If this is the first time we've seen this object, create a new + // track to store merged keyframe data for each morph target. + if ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) { + + mergedTrack = sourceTrack.clone(); + + const values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length ); + + for ( let j = 0; j < mergedTrack.times.length; j ++ ) { + + values[ j * targetCount + targetIndex ] = mergedTrack.values[ j ]; + + } + + // We need to take into consideration the intended target node + // of our original un-merged morphTarget animation. + mergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences'; + mergedTrack.values = values; + + mergedTracks[ sourceTrackNode.uuid ] = mergedTrack; + tracks.push( mergedTrack ); + + continue; + + } + + const sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) ); + + mergedTrack = mergedTracks[ sourceTrackNode.uuid ]; + + // For every existing keyframe of the merged track, write a (possibly + // interpolated) value from the source track. + for ( let j = 0; j < mergedTrack.times.length; j ++ ) { + + mergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] ); + + } + + // For every existing keyframe of the source track, write a (possibly + // new) keyframe to the merged track. Values from the previous loop may + // be written again, but keyframes are de-duplicated. + for ( let j = 0; j < sourceTrack.times.length; j ++ ) { + + const keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] ); + mergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ]; + + } + + } + + clip.tracks = tracks; + + return clip; + + }, + + toFloat32BufferAttribute: function ( srcAttribute ) { + + const dstAttribute = new BufferAttribute( new Float32Array( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false ); + + if ( ! srcAttribute.normalized && ! srcAttribute.isInterleavedBufferAttribute ) { + + dstAttribute.array.set( srcAttribute.array ); + + return dstAttribute; + + } + + for ( let i = 0, il = srcAttribute.count; i < il; i ++ ) { + + for ( let j = 0; j < srcAttribute.itemSize; j ++ ) { + + dstAttribute.setComponent( i, j, srcAttribute.getComponent( i, j ) ); + + } + + } + + return dstAttribute; + + } + +}; + +/* @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @param object {THREE.Object3D} + * @return {boolean} + */ +const compatibleObject = (object) => { + // @TODO: Need properer variantMaterials format validation? + return object.material !== + undefined && // easier than (!object.isMesh && !object.isLine && + // !object.isPoints) + object.userData && // just in case + object.userData.variantMaterials && + // Is this line costly? + !!Array + .from(object.userData.variantMaterials + .values()) + .filter(m => compatibleMaterial(m.material)); +}; +/** + * @param material {THREE.Material} + * @return {boolean} + */ +const compatibleMaterial = (material) => { + // @TODO: support multi materials? + return material && material.isMaterial && !Array.isArray(material); +}; +class GLTFExporterMaterialsVariantsExtension { + constructor(writer) { + this.writer = writer; + this.name = 'KHR_materials_variants'; + this.variantNames = []; + } + beforeParse(objects) { + // Find all variant names and store them to the table + const variantNameSet = new Set(); + const addVariantNames = (o) => { + if (!compatibleObject(o)) { + return; + } + const variantMaterials = o.userData.variantMaterials; + const variantDataMap = o.userData.variantData; + for (const [variantName, variantData] of variantDataMap) { + const variantMaterial = variantMaterials.get(variantData.index); + // Ignore unloaded variant materials + if (variantMaterial && compatibleMaterial(variantMaterial.material)) { + variantNameSet.add(variantName); + } + } + }; + if (Array.isArray(objects)) { + for (const object of objects) { + object.traverse(addVariantNames); + } + } + else { + objects.traverse(addVariantNames); + } + // We may want to sort? + variantNameSet.forEach(name => this.variantNames.push(name)); + } + async writeMesh(mesh, meshDef) { + if (!compatibleObject(mesh)) { + return; + } + const userData = mesh.userData; + const variantMaterials = userData.variantMaterials; + const variantDataMap = userData.variantData; + const mappingTable = new Map(); + // Removes gaps in the variant indices list (caused by deleting variants). + const reIndexedVariants = new Map(); + const variants = Array.from(variantDataMap.values()).sort((a, b) => { + return a.index - b.index; + }); + for (const [i, variantData] of variants.entries()) { + reIndexedVariants.set(variantData.index, i); + } + for (const variantData of variantDataMap.values()) { + const variantInstance = variantMaterials.get(variantData.index); + if (!variantInstance || !compatibleMaterial(variantInstance.material)) { + continue; + } + const materialIndex = await this.writer.processMaterialAsync(variantInstance.material); + if (!mappingTable.has(materialIndex)) { + mappingTable.set(materialIndex, { material: materialIndex, variants: [] }); + } + mappingTable.get(materialIndex).variants.push(reIndexedVariants.get(variantData.index)); + } + const mappingsDef = Array.from(mappingTable.values()) + .map((m => { return m.variants.sort((a, b) => a - b) && m; })) + .sort((a, b) => a.material - b.material); + if (mappingsDef.length === 0) { + return; + } + const originalMaterialIndex = compatibleMaterial(userData.originalMaterial) ? + await this.writer.processMaterialAsync(userData.originalMaterial) : + -1; + for (const primitiveDef of meshDef.primitives) { + // Override primitiveDef.material with original material. + if (originalMaterialIndex >= 0) { + primitiveDef.material = originalMaterialIndex; + } + primitiveDef.extensions = primitiveDef.extensions || {}; + primitiveDef.extensions[this.name] = { mappings: mappingsDef }; + } + } + afterParse() { + if (this.variantNames.length === 0) { + return; + } + const root = this.writer.json; + root.extensions = root.extensions || {}; + const variantsDef = this.variantNames.map(n => { + return { name: n }; + }); + root.extensions[this.name] = { variants: variantsDef }; + this.writer.extensionsUsed[this.name] = true; + } +} + +class SessionLightProbe { + + constructor( xrLight, renderer, lightProbe, environmentEstimation, estimationStartCallback ) { + + this.xrLight = xrLight; + this.renderer = renderer; + this.lightProbe = lightProbe; + this.xrWebGLBinding = null; + this.estimationStartCallback = estimationStartCallback; + this.frameCallback = this.onXRFrame.bind( this ); + + const session = renderer.xr.getSession(); + + // If the XRWebGLBinding class is available then we can also query an + // estimated reflection cube map. + if ( environmentEstimation && 'XRWebGLBinding' in window ) { + + // This is the simplest way I know of to initialize a WebGL cubemap in Three. + const cubeRenderTarget = new WebGLCubeRenderTarget( 16 ); + xrLight.environment = cubeRenderTarget.texture; + + const gl = renderer.getContext(); + + // Ensure that we have any extensions needed to use the preferred cube map format. + switch ( session.preferredReflectionFormat ) { + + case 'srgba8': + gl.getExtension( 'EXT_sRGB' ); + break; + + case 'rgba16f': + gl.getExtension( 'OES_texture_half_float' ); + break; + + } + + this.xrWebGLBinding = new XRWebGLBinding( session, gl ); + + this.lightProbe.addEventListener( 'reflectionchange', () => { + + this.updateReflection(); + + } ); + + } + + // Start monitoring the XR animation frame loop to look for lighting + // estimation changes. + session.requestAnimationFrame( this.frameCallback ); + + } + + updateReflection() { + + const textureProperties = this.renderer.properties.get( this.xrLight.environment ); + + if ( textureProperties ) { + + const cubeMap = this.xrWebGLBinding.getReflectionCubeMap( this.lightProbe ); + + if ( cubeMap ) { + + textureProperties.__webglTexture = cubeMap; + + this.xrLight.environment.needsPMREMUpdate = true; + + } + + } + + } + + onXRFrame( time, xrFrame ) { + + // If either this object or the XREstimatedLight has been destroyed, stop + // running the frame loop. + if ( ! this.xrLight ) { + + return; + + } + + const session = xrFrame.session; + session.requestAnimationFrame( this.frameCallback ); + + const lightEstimate = xrFrame.getLightEstimate( this.lightProbe ); + if ( lightEstimate ) { + + // We can copy the estimate's spherical harmonics array directly into the light probe. + this.xrLight.lightProbe.sh.fromArray( lightEstimate.sphericalHarmonicsCoefficients ); + this.xrLight.lightProbe.intensity = 1.0; + + // For the directional light we have to normalize the color and set the scalar as the + // intensity, since WebXR can return color values that exceed 1.0. + const intensityScalar = Math.max( 1.0, + Math.max( lightEstimate.primaryLightIntensity.x, + Math.max( lightEstimate.primaryLightIntensity.y, + lightEstimate.primaryLightIntensity.z ) ) ); + + this.xrLight.directionalLight.color.setRGB( + lightEstimate.primaryLightIntensity.x / intensityScalar, + lightEstimate.primaryLightIntensity.y / intensityScalar, + lightEstimate.primaryLightIntensity.z / intensityScalar ); + this.xrLight.directionalLight.intensity = intensityScalar; + this.xrLight.directionalLight.position.copy( lightEstimate.primaryLightDirection ); + + if ( this.estimationStartCallback ) { + + this.estimationStartCallback(); + this.estimationStartCallback = null; + + } + + } + + } + + dispose() { + + this.xrLight = null; + this.renderer = null; + this.lightProbe = null; + this.xrWebGLBinding = null; + + } + +} + +class XREstimatedLight extends Group { + + constructor( renderer, environmentEstimation = true ) { + + super(); + + this.lightProbe = new LightProbe(); + this.lightProbe.intensity = 0; + this.add( this.lightProbe ); + + this.directionalLight = new DirectionalLight(); + this.directionalLight.intensity = 0; + this.add( this.directionalLight ); + + // Will be set to a cube map in the SessionLightProbe if environment estimation is + // available and requested. + this.environment = null; + + let sessionLightProbe = null; + let estimationStarted = false; + renderer.xr.addEventListener( 'sessionstart', () => { + + const session = renderer.xr.getSession(); + + if ( 'requestLightProbe' in session ) { + + session.requestLightProbe( { + + reflectionFormat: session.preferredReflectionFormat + + } ).then( ( probe ) => { + + sessionLightProbe = new SessionLightProbe( this, renderer, probe, environmentEstimation, () => { + + estimationStarted = true; + + // Fired to indicate that the estimated lighting values are now being updated. + this.dispatchEvent( { type: 'estimationstart' } ); + + } ); + + } ); + + } + + } ); + + renderer.xr.addEventListener( 'sessionend', () => { + + if ( sessionLightProbe ) { + + sessionLightProbe.dispose(); + sessionLightProbe = null; + + } + + if ( estimationStarted ) { + + // Fired to indicate that the estimated lighting values are no longer being updated. + this.dispatchEvent( { type: 'estimationend' } ); + + } + + } ); + + // Done inline to provide access to sessionLightProbe. + this.dispose = () => { + + if ( sessionLightProbe ) { + + sessionLightProbe.dispose(); + sessionLightProbe = null; + + } + + this.remove( this.lightProbe ); + this.lightProbe = null; + + this.remove( this.directionalLight ); + this.directionalLight = null; + + this.environment = null; + + }; + + } + +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const SETTLING_TIME = 10000; // plenty long enough +const MIN_DECAY_MILLISECONDS = 0.001; +const DECAY_MILLISECONDS = 50; +/** + * The Damper class is a generic second-order critically damped system that does + * one linear step of the desired length of time. The only parameter is + * DECAY_MILLISECONDS. This common parameter makes all states converge at the + * same rate regardless of scale. xNormalization is a number to provide the + * rough scale of x, such that NIL_SPEED clamping also happens at roughly the + * same convergence for all states. + */ +class Damper { + constructor(decayMilliseconds = DECAY_MILLISECONDS) { + this.velocity = 0; + this.naturalFrequency = 0; + this.setDecayTime(decayMilliseconds); + } + setDecayTime(decayMilliseconds) { + this.naturalFrequency = + 1 / Math.max(MIN_DECAY_MILLISECONDS, decayMilliseconds); + } + update(x, xGoal, timeStepMilliseconds, xNormalization) { + const nilSpeed = 0.0002 * this.naturalFrequency; + if (x == null || xNormalization === 0) { + return xGoal; + } + if (x === xGoal && this.velocity === 0) { + return xGoal; + } + if (timeStepMilliseconds < 0) { + return x; + } + // Exact solution to a critically damped second-order system, where: + // acceleration = this.naturalFrequency * this.naturalFrequency * (xGoal + // - x) - 2 * this.naturalFrequency * this.velocity; + const deltaX = (x - xGoal); + const intermediateVelocity = this.velocity + this.naturalFrequency * deltaX; + const intermediateX = deltaX + timeStepMilliseconds * intermediateVelocity; + const decay = Math.exp(-this.naturalFrequency * timeStepMilliseconds); + const newVelocity = (intermediateVelocity - this.naturalFrequency * intermediateX) * decay; + const acceleration = -this.naturalFrequency * (newVelocity + intermediateVelocity * decay); + if (Math.abs(newVelocity) < nilSpeed * Math.abs(xNormalization) && + acceleration * deltaX >= 0) { + // This ensures the controls settle and stop calling this function instead + // of asymptotically approaching their goal. + this.velocity = 0; + return xGoal; + } + else { + this.velocity = newVelocity; + return xGoal + intermediateX * decay; + } + } +} + +/* @license +* Copyright 2020 Google LLC. All Rights Reserved. +* Licensed under the Apache License, Version 2.0 (the 'License'); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an 'AS IS' BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +// Enhanced configuration for dynamic sizing and visual design +const CONFIG = { + // Dynamic sizing - slightly bigger + MIN_TOUCH_AREA: 0.05, // minimum touch area + BASE_RADIUS: 0.15, // base radius + LINE_WIDTH: 0.02, // line width + SEGMENTS: 16, // segments for smoother curves + DELTA_PHI: Math.PI / (2 * 16), + // Enhanced visual design with more vibrant colors + COLORS: { + EDGE_FALLOFF: new Color(0.98, 0.98, 0.98), // Brighter light gray + EDGE_CUTOFF: new Color(0.8, 0.8, 0.8), // Brighter medium gray + FILL_FALLOFF: new Color(0.4, 0.4, 0.4), // Brighter dark gray + FILL_CUTOFF: new Color(0.4, 0.4, 0.4), // Brighter dark gray + ACTIVE_EDGE: new Color(1.0, 1.0, 1.0), // Pure white when active + ACTIVE_FILL: new Color(0.6, 0.6, 0.6), // Brighter fill when active + }, + // Opacity settings - now configurable + MAX_OPACITY: 0.75, + FILL_OPACITY_MULTIPLIER: 0.5, // Fill opacity relative to edge opacity + INTERACTIVE_OPACITY_MULTIPLIER: 1.2, // Edge opacity multiplier when interactive + // Distance-based scaling (similar to Footprint) + MIN_DISTANCE: 0.5, + MAX_DISTANCE: 10.0, + BASE_SCALE: 1.0, + DISTANCE_SCALE_FACTOR: 0.3, + COLOR_LERP_FACTOR: 0.15, // Color transition speed + // Screen space scaling - now configurable + SCREEN_SPACE_SCALE: 1.2, // Scale factor for screen space mode + // Performance optimization thresholds + SIZE_UPDATE_THRESHOLD: 0.001, // Minimum size change to trigger geometry update + GEOMETRY_UPDATE_DEBOUNCE: 100, // ms to debounce geometry updates +}; +const vector2$1 = new Vector2(); +/** +* Adds a quarter-annulus of vertices to the array, centered on cornerX, +* cornerY. +*/ +const addCorner = (vertices, cornerX, cornerY, radius, lineWidth) => { + let phi = cornerX > 0 ? (cornerY > 0 ? 0 : -Math.PI / 2) : + (cornerY > 0 ? Math.PI / 2 : Math.PI); + for (let i = 0; i <= CONFIG.SEGMENTS; ++i) { + vertices.push(cornerX + (radius - lineWidth) * Math.cos(phi), cornerY + (radius - lineWidth) * Math.sin(phi), 0, cornerX + radius * Math.cos(phi), cornerY + radius * Math.sin(phi), 0); + phi += CONFIG.DELTA_PHI; + } +}; +/** +* Enhanced PlacementBox that dynamically updates based on model size changes +* and features improved visual design inspired by Footprint. +*/ +class PlacementBox extends Mesh { + constructor(scene, side) { + const geometry = new BufferGeometry(); + super(geometry); + this.shadowHeight = 0; + // Visual state + this.isActive = false; + this.isHovered = false; + // Performance optimization + this.lastGeometryUpdateTime = 0; + this.needsGeometryUpdate = false; + this.scene = scene; + this.side = side; + this.currentSize = new Vector3(); + this.goalSize = new Vector3(); + this.sizeDamper = new Damper(); + // Initialize with current scene size + this.updateSizeFromScene(); + // Create enhanced materials with better visual properties + this.edgeMaterial = new MeshBasicMaterial({ + color: CONFIG.COLORS.EDGE_FALLOFF, + transparent: true, + opacity: 0, + side: DoubleSide, + depthWrite: false, // Better transparency handling + blending: AdditiveBlending // Subtle glow effect + }); + this.fillMaterial = new MeshBasicMaterial({ + color: CONFIG.COLORS.FILL_FALLOFF, + transparent: true, + opacity: 0, + side: DoubleSide, + depthWrite: false, // Better transparency handling + blending: NormalBlending + }); + this.material = this.edgeMaterial; + this.goalOpacity = 0; + this.opacityDamper = new Damper(); + // Create hit testing meshes + this.createHitMeshes(); + // Position based on scene + this.updatePositionFromScene(); + // Add to scene + scene.target.add(this); + scene.target.add(this.hitBox); + this.offsetHeight = 0; + } + updateSizeFromScene() { + const { size } = this.scene; + this.goalSize.copy(size); + // Apply proportional minimum size constraints + // For small models, use a smaller minimum size + const modelDiagonal = Math.sqrt(size.x * size.x + size.z * size.z); + const proportionalMinSize = Math.max(CONFIG.MIN_TOUCH_AREA, modelDiagonal * 0.4); // Increased from 0.3 to 0.4 + // Only apply minimum size if the model is very small + if (this.goalSize.x < proportionalMinSize) { + this.goalSize.x = proportionalMinSize; + } + if (this.goalSize.z < proportionalMinSize) { + this.goalSize.z = proportionalMinSize; + } + // Update geometry with new size + this.updateGeometry(); + } + updateGeometry() { + const geometry = this.geometry; + const triangles = []; + const vertices = []; + const x = this.goalSize.x / 2; + const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2; + // Use dynamic radius based on size - slightly bigger for better visibility + const modelSize = Math.min(x, y); + const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2); // Increased multipliers + const lineWidth = Math.max(CONFIG.LINE_WIDTH * 0.7, modelSize * 0.025); // Increased line width + addCorner(vertices, x, y, radius, lineWidth); + addCorner(vertices, -x, y, radius, lineWidth); + addCorner(vertices, -x, -y, radius, lineWidth); + addCorner(vertices, x, -y, radius, lineWidth); + const numVertices = vertices.length / 3; + for (let i = 0; i < numVertices - 2; i += 2) { + triangles.push(i, i + 1, i + 3, i, i + 3, i + 2); + } + const i = numVertices - 2; + triangles.push(i, i + 1, 1, i, 1, 0); + geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3)); + geometry.setIndex(triangles); + geometry.computeBoundingSphere(); + } + createHitMeshes() { + const x = this.goalSize.x / 2; + const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2; + const modelSize = Math.min(x, y); + const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2); + this.hitPlane = new Mesh(new PlaneGeometry(2 * (x + radius), 2 * (y + radius))); + this.hitPlane.visible = false; + this.hitPlane.material.side = DoubleSide; + this.add(this.hitPlane); + this.hitBox = new Mesh(new BoxGeometry(this.goalSize.x + 2 * radius, this.goalSize.y + radius, this.goalSize.z + 2 * radius)); + this.hitBox.visible = false; + this.hitBox.material.side = DoubleSide; + this.add(this.hitBox); + } + updatePositionFromScene() { + const { boundingBox } = this.scene; + boundingBox.getCenter(this.position); + // Reset rotation to ensure proper orientation + this.rotation.set(0, 0, 0); + switch (this.side) { + case 'bottom': + // Ensure the placement box is horizontal for floor placement + this.rotateX(-Math.PI / 2); + this.shadowHeight = boundingBox.min.y; + this.position.y = this.shadowHeight; + break; + case 'back': + // For wall placement, keep it vertical but ensure proper orientation + this.shadowHeight = boundingBox.min.z; + this.position.z = this.shadowHeight; + break; + case 'top': + // move placement box to the top of the model + this.rotateX(-Math.PI / 2); + this.shadowHeight = boundingBox.max.y; + this.position.y = this.shadowHeight; + break; + } + // Update hit box position with proper offset + if (this.hitBox) { + const offset = this.side === 'back' ? + (this.goalSize.y + CONFIG.BASE_RADIUS) / 2 : + (this.goalSize.y + CONFIG.BASE_RADIUS) / 2; + this.hitBox.position.y = offset + boundingBox.min.y; + } + } + /** + * Update the placement box when model size changes + * Optimized to batch updates and reduce performance impact + */ + updateFromModelChanges() { + this.updateSizeFromScene(); + this.updatePositionFromScene(); + // Force immediate geometry update for model changes + this.updateGeometry(); + this.updateHitMeshes(); + this.ensureProperOrientation(); + // Reset performance tracking + this.needsGeometryUpdate = false; + this.lastGeometryUpdateTime = performance.now(); + } + /** + * Ensure the placement box is properly oriented for the current mode + */ + ensureProperOrientation() { + // Force proper orientation based on side + if (this.side === 'bottom') { + // For floor placement, ensure it's horizontal + this.rotation.x = -Math.PI / 2; + this.rotation.y = 0; + this.rotation.z = 0; + } + else if (this.side === 'back') { + // For wall placement, ensure it's vertical + this.rotation.x = 0; + this.rotation.y = 0; + this.rotation.z = 0; + } + } + /** + * Set screen space mode to adjust positioning for mobile AR + */ + setScreenSpaceMode(isScreenSpace) { + if (isScreenSpace) { + // In screen space mode, ensure the placement box is more visible + // and properly positioned for touch interaction + this.scale.set(CONFIG.SCREEN_SPACE_SCALE, CONFIG.SCREEN_SPACE_SCALE, CONFIG.SCREEN_SPACE_SCALE); + } + else { + // Reset scale for world space mode + this.scale.set(1.0, 1.0, 1.0); + } + } + updateHitMeshes() { + if (this.hitPlane && this.hitBox) { + const x = this.goalSize.x / 2; + const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2; + const modelSize = Math.min(x, y); + const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2); + // Update hit plane geometry + const hitPlaneGeometry = new PlaneGeometry(2 * (x + radius), 2 * (y + radius)); + this.hitPlane.geometry.dispose(); + this.hitPlane.geometry = hitPlaneGeometry; + // Update hit box geometry + const hitBoxGeometry = new BoxGeometry(this.goalSize.x + 2 * radius, this.goalSize.y + radius, this.goalSize.z + 2 * radius); + this.hitBox.geometry.dispose(); + this.hitBox.geometry = hitBoxGeometry; + } + } + /** + * Set interaction state for visual feedback + */ + setInteractionState(isActive, isHovered = false) { + this.isActive = isActive; + this.isHovered = isHovered; + this.updateVisualState(); + } + updateVisualState() { + let targetColor; + let targetFillColor; + if (this.isActive) { + targetColor = CONFIG.COLORS.ACTIVE_EDGE; + targetFillColor = CONFIG.COLORS.ACTIVE_FILL; + } + else if (this.isHovered) { + targetColor = CONFIG.COLORS.EDGE_FALLOFF; + targetFillColor = CONFIG.COLORS.FILL_FALLOFF; + } + else { + targetColor = CONFIG.COLORS.EDGE_CUTOFF; + targetFillColor = CONFIG.COLORS.FILL_CUTOFF; + } + // Smoothly transition colors with configurable response speed + this.edgeMaterial.color.lerp(targetColor, CONFIG.COLOR_LERP_FACTOR); + this.fillMaterial.color.lerp(targetFillColor, CONFIG.COLOR_LERP_FACTOR); + } + /** + * Apply distance-based scaling + */ + applyDistanceScaling(cameraPosition) { + const distanceToCamera = cameraPosition.distanceTo(this.position); + const clampedDistance = Math.max(CONFIG.MIN_DISTANCE, Math.min(CONFIG.MAX_DISTANCE, distanceToCamera)); + const scaleFactor = CONFIG.BASE_SCALE + + (clampedDistance - CONFIG.MIN_DISTANCE) * CONFIG.DISTANCE_SCALE_FACTOR; + this.scale.set(scaleFactor, scaleFactor, scaleFactor); + } + /** + * Get the world hit position if the touch coordinates hit the box, and null + * otherwise. Pass the scene in to get access to its raycaster. + */ + getHit(scene, screenX, screenY) { + vector2$1.set(screenX, -screenY); + this.hitPlane.visible = true; + const hitResult = scene.positionAndNormalFromPoint(vector2$1, this.hitPlane); + this.hitPlane.visible = false; + return hitResult == null ? null : hitResult.position; + } + getExpandedHit(scene, screenX, screenY) { + this.hitPlane.scale.set(1000, 1000, 1000); + this.hitPlane.updateMatrixWorld(); + const hitResult = this.getHit(scene, screenX, screenY); + this.hitPlane.scale.set(1, 1, 1); + return hitResult; + } + controllerIntersection(scene, controller) { + this.hitBox.visible = true; + const hitResult = scene.hitFromController(controller, this.hitBox); + this.hitBox.visible = false; + return hitResult; + } + /** + * Offset the height of the box relative to the bottom of the scene. Positive + * is up, so generally only negative values are used. + */ + set offsetHeight(offset) { + offset -= 0.001; // push 1 mm below shadow to avoid z-fighting + if (this.side === 'back') { + this.position.z = this.shadowHeight + offset; + } + else { + this.position.y = this.shadowHeight + offset; + } + } + get offsetHeight() { + if (this.side === 'back') { + return this.position.z - this.shadowHeight; + } + else { + return this.position.y - this.shadowHeight; + } + } + /** + * Set the box's visibility; it will fade in and out. + */ + set show(visible) { + this.goalOpacity = visible ? CONFIG.MAX_OPACITY : 0; + } + /** + * Call on each frame with the frame delta to fade the box. + */ + updateOpacity(delta) { + const material = this.material; + const newOpacity = this.opacityDamper.update(material.opacity, this.goalOpacity, delta, 1); + // Update both edge and fill materials with configurable visibility + this.edgeMaterial.opacity = newOpacity; + this.fillMaterial.opacity = newOpacity * CONFIG.FILL_OPACITY_MULTIPLIER; + // Add subtle glow effect when active or hovered + if (this.isActive || this.isHovered) { + this.edgeMaterial.opacity = newOpacity * CONFIG.INTERACTIVE_OPACITY_MULTIPLIER; + } + this.visible = newOpacity > 0; + } + /** + * Update method to be called each frame for smooth transitions + * Optimized to reduce frequent geometry updates for better performance + */ + update(delta, cameraPosition) { + // Update opacity + this.updateOpacity(delta); + // Update size transitions with performance optimization + if (!this.currentSize.equals(this.goalSize)) { + const newSize = new Vector3(); + newSize.x = this.sizeDamper.update(this.currentSize.x, this.goalSize.x, delta, 1); + newSize.y = this.sizeDamper.update(this.currentSize.y, this.goalSize.y, delta, 1); + newSize.z = this.sizeDamper.update(this.currentSize.z, this.goalSize.z, delta, 1); + // Check if size change is significant enough to warrant geometry update + const sizeChange = newSize.distanceTo(this.currentSize); + if (sizeChange > CONFIG.SIZE_UPDATE_THRESHOLD) { + this.currentSize.copy(newSize); + this.needsGeometryUpdate = true; + } + } + // Debounce geometry updates to prevent excessive updates + const now = performance.now(); + if (this.needsGeometryUpdate && + (now - this.lastGeometryUpdateTime) > CONFIG.GEOMETRY_UPDATE_DEBOUNCE) { + this.updateGeometry(); + this.updateHitMeshes(); + this.needsGeometryUpdate = false; + this.lastGeometryUpdateTime = now; + } + // Apply distance scaling if camera position is provided + if (cameraPosition) { + this.applyDistanceScaling(cameraPosition); + } + // Update visual state + this.updateVisualState(); + } + /** + * Get the current size of the placement box + */ + getSize() { + return this.goalSize.clone(); + } + /** + * Call this to clean up Three's cache when you remove the box. + */ + dispose() { + const { geometry, material } = this.hitPlane; + geometry.dispose(); + material.dispose(); + this.hitBox.geometry.dispose(); + this.hitBox.material.dispose(); + this.geometry.dispose(); + this.edgeMaterial.dispose(); + this.fillMaterial.dispose(); + this.hitBox.removeFromParent(); + this.removeFromParent(); + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const numberNode = (value, unit) => ({ type: 'number', number: value, unit }); +/** + * Given a string representing a comma-separated set of CSS-like expressions, + * parses and returns an array of ASTs that correspond to those expressions. + * + * Currently supported syntax includes: + * + * - functions (top-level and nested) + * - calc() arithmetic operators + * - numbers with units + * - hexadecimal-encoded colors in 3, 6 or 8 digit form + * - idents + * + * All syntax is intended to match the parsing rules and semantics of the actual + * CSS spec as closely as possible. + * + * @see https://www.w3.org/TR/CSS2/ + * @see https://www.w3.org/TR/css-values-3/ + */ +const parseExpressions = (() => { + const cache = {}; + const MAX_PARSE_ITERATIONS = 1000; // Arbitrarily large + return (inputString) => { + const cacheKey = inputString; + if (cacheKey in cache) { + return cache[cacheKey]; + } + const expressions = []; + let parseIterations = 0; + while (inputString) { + if (++parseIterations > MAX_PARSE_ITERATIONS) { + // Avoid a potentially infinite loop due to typos: + inputString = ''; + break; + } + const expressionParseResult = parseExpression(inputString); + const expression = expressionParseResult.nodes[0]; + if (expression == null || expression.terms.length === 0) { + break; + } + expressions.push(expression); + inputString = expressionParseResult.remainingInput; + } + return cache[cacheKey] = expressions; + }; +})(); +/** + * Parse a single expression. For the purposes of our supported syntax, an + * expression is the set of semantically meaningful terms that appear before the + * next comma, or between the parens of a function invocation. + */ +const parseExpression = (() => { + const IS_IDENT_RE = /^(\-\-|[a-z\u0240-\uffff])/i; + const IS_OPERATOR_RE = /^([\*\+\/]|[\-]\s)/i; + const IS_EXPRESSION_END_RE = /^[\),]/; + const FUNCTION_ARGUMENTS_FIRST_TOKEN = '('; + const HEX_FIRST_TOKEN = '#'; + return (inputString) => { + const terms = []; + while (inputString.length) { + inputString = inputString.trim(); + if (IS_EXPRESSION_END_RE.test(inputString)) { + break; + } + else if (inputString[0] === FUNCTION_ARGUMENTS_FIRST_TOKEN) { + const { nodes, remainingInput } = parseFunctionArguments(inputString); + inputString = remainingInput; + terms.push({ + type: 'function', + name: { type: 'ident', value: 'calc' }, + arguments: nodes + }); + } + else if (IS_IDENT_RE.test(inputString)) { + const identParseResult = parseIdent(inputString); + const identNode = identParseResult.nodes[0]; + inputString = identParseResult.remainingInput; + if (inputString[0] === FUNCTION_ARGUMENTS_FIRST_TOKEN) { + const { nodes, remainingInput } = parseFunctionArguments(inputString); + terms.push({ type: 'function', name: identNode, arguments: nodes }); + inputString = remainingInput; + } + else { + terms.push(identNode); + } + } + else if (IS_OPERATOR_RE.test(inputString)) { + // Operators are always a single character, so just pluck them out: + terms.push({ type: 'operator', value: inputString[0] }); + inputString = inputString.slice(1); + } + else { + const { nodes, remainingInput } = inputString[0] === HEX_FIRST_TOKEN ? + parseHex(inputString) : + parseNumber(inputString); + // The remaining string may not have had any meaningful content. Exit + // early if this is the case: + if (nodes.length === 0) { + break; + } + terms.push(nodes[0]); + inputString = remainingInput; + } + } + return { nodes: [{ type: 'expression', terms }], remainingInput: inputString }; + }; +})(); +/** + * An ident is something like a function name or the keyword "auto". + */ +const parseIdent = (() => { + const NOT_IDENT_RE = /[^a-z0-9_\-\u0240-\uffff]/i; + return (inputString) => { + const match = inputString.match(NOT_IDENT_RE); + const ident = match == null ? inputString : inputString.substr(0, match.index); + const remainingInput = match == null ? '' : inputString.substr(match.index); + return { nodes: [{ type: 'ident', value: ident }], remainingInput }; + }; +})(); +/** + * Parses a number. A number value can be expressed with an integer or + * non-integer syntax, and usually includes a unit (but does not strictly + * require one for our purposes). + */ +const parseNumber = (() => { + // @see https://www.w3.org/TR/css-syntax/#number-token-diagram + const VALUE_RE = /[\+\-]?(\d+[\.]\d+|\d+|[\.]\d+)([eE][\+\-]?\d+)?/; + const UNIT_RE = /^[a-z%]+/i; + const ALLOWED_UNITS = /^(m|mm|cm|rad|deg|[%])$/; + return (inputString) => { + const valueMatch = inputString.match(VALUE_RE); + const value = valueMatch == null ? '0' : valueMatch[0]; + inputString = value == null ? inputString : inputString.slice(value.length); + const unitMatch = inputString.match(UNIT_RE); + let unit = unitMatch != null && unitMatch[0] !== '' ? unitMatch[0] : null; + const remainingInput = unitMatch == null ? inputString : inputString.slice(unit.length); + if (unit != null && !ALLOWED_UNITS.test(unit)) { + unit = null; + } + return { + nodes: [{ + type: 'number', + number: parseFloat(value) || 0, + unit: unit + }], + remainingInput + }; + }; +})(); +/** + * Parses a hexadecimal-encoded color in 3, 6 or 8 digit form. + */ +const parseHex = (() => { + // TODO(cdata): right now we don't actually enforce the number of digits + const HEX_RE = /^[a-f0-9]*/i; + return (inputString) => { + inputString = inputString.slice(1).trim(); + const hexMatch = inputString.match(HEX_RE); + const nodes = hexMatch == null ? [] : [{ type: 'hex', value: hexMatch[0] }]; + return { + nodes, + remainingInput: hexMatch == null ? inputString : + inputString.slice(hexMatch[0].length) + }; + }; +})(); +/** + * Parses arguments passed to a function invocation (e.g., the expressions + * within a matched set of parens). + */ +const parseFunctionArguments = (inputString) => { + const expressionNodes = []; + // Consume the opening paren + inputString = inputString.slice(1).trim(); + while (inputString.length) { + const expressionParseResult = parseExpression(inputString); + expressionNodes.push(expressionParseResult.nodes[0]); + inputString = expressionParseResult.remainingInput.trim(); + if (inputString[0] === ',') { + inputString = inputString.slice(1).trim(); + } + else if (inputString[0] === ')') { + // Consume the closing paren and stop parsing + inputString = inputString.slice(1); + break; + } + } + return { nodes: expressionNodes, remainingInput: inputString }; +}; +const $visitedTypes = Symbol('visitedTypes'); +/** + * An ASTWalker walks an array of ASTs such as the type produced by + * parseExpressions and invokes a callback for a configured set of nodes that + * the user wishes to "visit" during the walk. + */ +class ASTWalker { + constructor(visitedTypes) { + this[$visitedTypes] = visitedTypes; + } + /** + * Walk the given set of ASTs, and invoke the provided callback for nodes that + * match the filtered set that the ASTWalker was constructed with. + */ + walk(ast, callback) { + const remaining = ast.slice(); + while (remaining.length) { + const next = remaining.shift(); + if (this[$visitedTypes].indexOf(next.type) > -1) { + callback(next); + } + switch (next.type) { + case 'expression': + remaining.unshift(...next.terms); + break; + case 'function': + remaining.unshift(next.name, ...next.arguments); + break; + } + } + } +} +const ZERO = Object.freeze({ type: 'number', number: 0, unit: null }); + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Ensures that a given number is expressed in radians. If the number is already + * in radians, does nothing. If the value is in degrees, converts it to radians. + * If the value has no specified unit, the unit is assumed to be radians. If the + * value is not in radians or degrees, the value is resolved as 0 radians. + * + * Also accepts a second argument that is a default value to use if the input + * numberNode number is NaN or Infinity. + */ +const degreesToRadians = (numberNode, fallbackRadianValue = 0) => { + let { number, unit } = numberNode; + if (!isFinite(number)) { + number = fallbackRadianValue; + unit = 'rad'; + } + else if (numberNode.unit === 'rad' || numberNode.unit == null) { + return numberNode; + } + const valueIsDegrees = unit === 'deg' && number != null; + const value = valueIsDegrees ? number : 0; + const radians = value * Math.PI / 180; + return { type: 'number', number: radians, unit: 'rad' }; +}; +/** + * Converts a given length to meters. Currently supported input units are + * meters, centimeters and millimeters. + * + * Also accepts a second argument that is a default value to use if the input + * numberNode number is NaN or Infinity. + */ +const lengthToBaseMeters = (numberNode, fallbackMeterValue = 0) => { + let { number, unit } = numberNode; + if (!isFinite(number)) { + number = fallbackMeterValue; + unit = 'm'; + } + else if (numberNode.unit === 'm') { + return numberNode; + } + let scale; + switch (unit) { + default: + scale = 1; + break; + case 'cm': + scale = 1 / 100; + break; + case 'mm': + scale = 1 / 1000; + break; + } + const value = scale * number; + return { type: 'number', number: value, unit: 'm' }; +}; +/** + * Normalizes the unit of a given input number so that it is expressed in a + * preferred unit. For length nodes, the return value will be expressed in + * meters. For angle nodes, the return value will be expressed in radians. + * + * Also takes a fallback number that is used when the number value is not a + * valid number or when the unit of the given number cannot be normalized. + */ +const normalizeUnit = (() => { + const identity = (node) => node; + const unitNormalizers = { + 'rad': identity, + 'deg': degreesToRadians, + 'm': identity, + 'mm': lengthToBaseMeters, + 'cm': lengthToBaseMeters + }; + return (node, fallback = ZERO) => { + if (!isFinite(node.number)) { + node.number = fallback.number; + node.unit = fallback.unit; + } + const { unit } = node; + if (unit == null) { + return node; + } + const normalize = unitNormalizers[unit]; + if (normalize == null) { + return fallback; + } + return normalize(node); + }; +})(); + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$6, _b$6, _c$4; +const $evaluate = Symbol('evaluate'); +const $lastValue = Symbol('lastValue'); +/** + * An Evaluator is used to derive a computed style from part (or all) of a CSS + * expression AST. This construct is particularly useful for complex ASTs + * containing function calls such as calc, var and env. Such styles could be + * costly to re-evaluate on every frame (and in some cases we may try to do + * that). The Evaluator construct allows us to mark sub-trees of the AST as + * constant, so that only the dynamic parts are re-evaluated. It also separates + * one-time AST preparation work from work that necessarily has to happen upon + * each evaluation. + */ +class Evaluator { + constructor() { + this[_a$6] = null; + } + /** + * An Evaluatable is a NumberNode or an Evaluator that evaluates a NumberNode + * as the result of invoking its evaluate method. This is mainly used to + * ensure that CSS function nodes are cast to the corresponding Evaluators + * that will resolve the result of the function, but is also used to ensure + * that a percentage nested at arbitrary depth in the expression will always + * be evaluated against the correct basis. + */ + static evaluatableFor(node, basis = ZERO) { + if (node instanceof Evaluator) { + return node; + } + if (node.type === 'number') { + if (node.unit === '%') { + return new PercentageEvaluator(node, basis); + } + return node; + } + switch (node.name.value) { + case 'calc': + return new CalcEvaluator(node, basis); + case 'env': + return new EnvEvaluator(node); + } + return ZERO; + } + /** + * If the input is an Evaluator, returns the result of evaluating it. + * Otherwise, returns the input. + * + * This is a helper to aide in resolving a NumberNode without conditionally + * checking if the Evaluatable is an Evaluator everywhere. + */ + static evaluate(evaluatable) { + if (evaluatable instanceof Evaluator) { + return evaluatable.evaluate(); + } + return evaluatable; + } + /** + * If the input is an Evaluator, returns the value of its isConstant property. + * Returns true for all other input values. + */ + static isConstant(evaluatable) { + if (evaluatable instanceof Evaluator) { + return evaluatable.isConstant; + } + return true; + } + /** + * This method applies a set of structured intrinsic metadata to an evaluated + * result from a parsed CSS-like string of expressions. Intrinsics provide + * sufficient metadata (e.g., basis values, analogs for keywords) such that + * omitted values in the input string can be backfilled, and keywords can be + * converted to concrete numbers. + * + * The result of applying intrinsics is a tuple of NumberNode values whose + * units match the units used by the basis of the intrinsics. + * + * The following is a high-level description of how intrinsics are applied: + * + * 1. Determine the value of 'auto' for the current term + * 2. If there is no corresponding input value for this term, substitute the + * 'auto' value. + * 3. If the term is an IdentNode, treat it as a keyword and perform the + * appropriate substitution. + * 4. If the term is still null, fallback to the 'auto' value + * 5. If the term is a percentage, apply it to the basis and return that + * value + * 6. Normalize the unit of the term + * 7. If the term's unit does not match the basis unit, return the basis + * value + * 8. Return the term as is + */ + static applyIntrinsics(evaluated, intrinsics) { + const { basis, keywords } = intrinsics; + const { auto } = keywords; + return basis.map((basisNode, index) => { + // Use an auto value if we have it, otherwise the auto value is the basis: + const autoSubstituteNode = auto[index] == null ? basisNode : auto[index]; + // If the evaluated nodes do not have a node at the current + // index, fallback to the "auto" substitute right away: + let evaluatedNode = evaluated[index] ? evaluated[index] : autoSubstituteNode; + // Any ident node is considered a keyword: + if (evaluatedNode.type === 'ident') { + const keyword = evaluatedNode.value; + // Substitute any keywords for concrete values first: + if (keyword in keywords) { + evaluatedNode = keywords[keyword][index]; + } + } + // If we don't have a NumberNode at this point, fall back to whatever + // is specified for auto: + if (evaluatedNode == null || evaluatedNode.type === 'ident') { + evaluatedNode = autoSubstituteNode; + } + // For percentages, we always apply the percentage to the basis value: + if (evaluatedNode.unit === '%') { + return numberNode(evaluatedNode.number / 100 * basisNode.number, basisNode.unit); + } + // Otherwise, normalize whatever we have: + evaluatedNode = normalizeUnit(evaluatedNode, basisNode); + // If the normalized units do not match, return the basis as a fallback: + if (evaluatedNode.unit !== basisNode.unit) { + return basisNode; + } + // Finally, return the evaluated node with intrinsics applied: + return evaluatedNode; + }); + } + /** + * If true, the Evaluator will only evaluate its AST one time. If false, the + * Evaluator will re-evaluate the AST each time that the public evaluate + * method is invoked. + */ + get isConstant() { + return false; + } + /** + * Evaluate the Evaluator and return the result. If the Evaluator is constant, + * the corresponding AST will only be evaluated once, and the result of + * evaluating it the first time will be returned on all subsequent + * evaluations. + */ + evaluate() { + if (!this.isConstant || this[$lastValue] == null) { + this[$lastValue] = this[$evaluate](); + } + return this[$lastValue]; + } +} +_a$6 = $lastValue; +const $percentage = Symbol('percentage'); +const $basis = Symbol('basis'); +/** + * A PercentageEvaluator scales a given basis value by a given percentage value. + * The evaluated result is always considered to be constant. + */ +class PercentageEvaluator extends Evaluator { + constructor(percentage, basis) { + super(); + this[$percentage] = percentage; + this[$basis] = basis; + } + get isConstant() { + return true; + } + [$evaluate]() { + return numberNode(this[$percentage].number / 100 * this[$basis].number, this[$basis].unit); + } +} +const $identNode = Symbol('identNode'); +/** + * Evaluator for CSS-like env() functions. Currently, only one environment + * variable is accepted as an argument for such functions: window-scroll-y. + * + * The env() Evaluator is explicitly dynamic because it always refers to + * external state that changes as the user scrolls, so it should always be + * re-evaluated to ensure we get the most recent value. + * + * Some important notes about this feature include: + * + * - There is no such thing as a "window-scroll-y" CSS environment variable in + * any stable browser at the time that this comment is being written. + * - The actual CSS env() function accepts a second argument as a fallback for + * the case that the specified first argument isn't set; our syntax does not + * support this second argument. + * + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/env + */ +class EnvEvaluator extends Evaluator { + constructor(envFunction) { + super(); + this[_b$6] = null; + const identNode = envFunction.arguments.length ? envFunction.arguments[0].terms[0] : null; + if (identNode != null && identNode.type === 'ident') { + this[$identNode] = identNode; + } + } + get isConstant() { + return false; + } + ; + [(_b$6 = $identNode, $evaluate)]() { + if (this[$identNode] != null) { + switch (this[$identNode].value) { + case 'window-scroll-y': + const verticalScrollPosition = window.pageYOffset; + const verticalScrollMax = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight); + const scrollY = verticalScrollPosition / + (verticalScrollMax - window.innerHeight) || + 0; + return { type: 'number', number: scrollY, unit: null }; + } + } + return ZERO; + } +} +const IS_MULTIPLICATION_RE = /[\*\/]/; +const $evaluator = Symbol('evaluator'); +/** + * Evaluator for CSS-like calc() functions. Our implementation of calc() + * evaluation currently support nested function calls, an unlimited number of + * terms, and all four algebraic operators (+, -, * and /). + * + * The Evaluator is marked as constant unless the calc expression contains an + * internal env expression at any depth, in which case it will be marked as + * dynamic. + * + * @see https://www.w3.org/TR/css-values-3/#calc-syntax + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/calc + */ +class CalcEvaluator extends Evaluator { + constructor(calcFunction, basis = ZERO) { + super(); + this[_c$4] = null; + if (calcFunction.arguments.length !== 1) { + return; + } + const terms = calcFunction.arguments[0].terms.slice(); + const secondOrderTerms = []; + while (terms.length) { + const term = terms.shift(); + if (secondOrderTerms.length > 0) { + const previousTerm = secondOrderTerms[secondOrderTerms.length - 1]; + if (previousTerm.type === 'operator' && + IS_MULTIPLICATION_RE.test(previousTerm.value)) { + const operator = secondOrderTerms.pop(); + const leftValue = secondOrderTerms.pop(); + if (leftValue == null) { + return; + } + secondOrderTerms.push(new OperatorEvaluator(operator, Evaluator.evaluatableFor(leftValue, basis), Evaluator.evaluatableFor(term, basis))); + continue; + } + } + secondOrderTerms.push(term.type === 'operator' ? term : + Evaluator.evaluatableFor(term, basis)); + } + while (secondOrderTerms.length > 2) { + const [left, operator, right] = secondOrderTerms.splice(0, 3); + if (operator.type !== 'operator') { + return; + } + secondOrderTerms.unshift(new OperatorEvaluator(operator, Evaluator.evaluatableFor(left, basis), Evaluator.evaluatableFor(right, basis))); + } + // There should only be one combined evaluator at this point: + if (secondOrderTerms.length === 1) { + this[$evaluator] = secondOrderTerms[0]; + } + } + get isConstant() { + return this[$evaluator] == null || Evaluator.isConstant(this[$evaluator]); + } + [(_c$4 = $evaluator, $evaluate)]() { + return this[$evaluator] != null ? Evaluator.evaluate(this[$evaluator]) : + ZERO; + } +} +const $operator = Symbol('operator'); +const $left = Symbol('left'); +const $right = Symbol('right'); +/** + * An Evaluator for the operators found inside CSS calc() functions. + * The evaluator accepts an operator and left/right operands. The operands can + * be any valid expression term typically allowed inside a CSS calc function. + * + * As detail of this implementation, the only supported unit types are angles + * expressed as radians or degrees, and lengths expressed as meters, centimeters + * or millimeters. + * + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/calc + */ +class OperatorEvaluator extends Evaluator { + constructor(operator, left, right) { + super(); + this[$operator] = operator; + this[$left] = left; + this[$right] = right; + } + get isConstant() { + return Evaluator.isConstant(this[$left]) && + Evaluator.isConstant(this[$right]); + } + [$evaluate]() { + const leftNode = normalizeUnit(Evaluator.evaluate(this[$left])); + const rightNode = normalizeUnit(Evaluator.evaluate(this[$right])); + const { number: leftValue, unit: leftUnit } = leftNode; + const { number: rightValue, unit: rightUnit } = rightNode; + // Disallow operations for mismatched normalized units e.g., m and rad: + if (rightUnit != null && leftUnit != null && rightUnit != leftUnit) { + return ZERO; + } + // NOTE(cdata): rules for calc type checking are defined here + // https://drafts.csswg.org/css-values-3/#calc-type-checking + // This is a simplification and may not hold up once we begin to support + // additional unit types: + const unit = leftUnit || rightUnit; + let value; + switch (this[$operator].value) { + case '+': + value = leftValue + rightValue; + break; + case '-': + value = leftValue - rightValue; + break; + case '/': + value = leftValue / rightValue; + break; + case '*': + value = leftValue * rightValue; + break; + default: + return ZERO; + } + return { type: 'number', number: value, unit }; + } +} +const $evaluatables = Symbol('evaluatables'); +const $intrinsics = Symbol('intrinsics'); +/** + * A VectorEvaluator evaluates a series of numeric terms that usually represent + * a data structure such as a multi-dimensional vector or a spherical + * + * The form of the evaluator's result is determined by the Intrinsics that are + * given to it when it is constructed. For example, spherical intrinsics would + * establish two angle terms and a length term, so the result of evaluating the + * evaluator that is configured with spherical intrinsics is a three element + * array where the first two elements represent angles in radians and the third + * element representing a length in meters. + */ +class StyleEvaluator extends Evaluator { + constructor(expressions, intrinsics) { + super(); + this[$intrinsics] = intrinsics; + const firstExpression = expressions[0]; + const terms = firstExpression != null ? firstExpression.terms : []; + this[$evaluatables] = + intrinsics.basis.map((basisNode, index) => { + const term = terms[index]; + if (term == null) { + return { type: 'ident', value: 'auto' }; + } + if (term.type === 'ident') { + return term; + } + return Evaluator.evaluatableFor(term, basisNode); + }); + } + get isConstant() { + for (const evaluatable of this[$evaluatables]) { + if (!Evaluator.isConstant(evaluatable)) { + return false; + } + } + return true; + } + [$evaluate]() { + const evaluated = this[$evaluatables].map(evaluatable => Evaluator.evaluate(evaluatable)); + return Evaluator.applyIntrinsics(evaluated, this[$intrinsics]) + .map(numberNode => numberNode.number); + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$5, _b$5, _c$3, _d$2; +const $instances = Symbol('instances'); +const $activateListener = Symbol('activateListener'); +const $deactivateListener = Symbol('deactivateListener'); +const $notifyInstances = Symbol('notifyInstances'); +const $notify = Symbol('notify'); +const $scrollCallback = Symbol('callback'); +/** + * This internal helper is intended to work as a reference-counting manager of + * scroll event listeners. Only one scroll listener is ever registered for all + * instances of the class, and when the last ScrollObserver "disconnects", that + * event listener is removed. This spares us from thrashing + * the {add,remove}EventListener API (the binding cost of these methods has been + * known to show up in performance analyses) as well as potential memory leaks. + */ +class ScrollObserver { + static [$notifyInstances]() { + for (const instance of ScrollObserver[$instances]) { + instance[$notify](); + } + } + static [(_a$5 = $instances, $activateListener)]() { + window.addEventListener('scroll', this[$notifyInstances], { passive: true }); + } + static [$deactivateListener]() { + window.removeEventListener('scroll', this[$notifyInstances]); + } + constructor(callback) { + this[$scrollCallback] = callback; + } + /** + * Listen for scroll events. The configured callback (passed to the + * constructor) will be invoked for subsequent global scroll events. + */ + observe() { + if (ScrollObserver[$instances].size === 0) { + ScrollObserver[$activateListener](); + } + ScrollObserver[$instances].add(this); + } + /** + * Stop listening for scroll events. + */ + disconnect() { + ScrollObserver[$instances].delete(this); + if (ScrollObserver[$instances].size === 0) { + ScrollObserver[$deactivateListener](); + } + } + [$notify]() { + this[$scrollCallback](); + } + ; +} +ScrollObserver[_a$5] = new Set(); +const $computeStyleCallback = Symbol('computeStyleCallback'); +const $astWalker = Symbol('astWalker'); +const $dependencies = Symbol('dependencies'); +const $onScroll = Symbol('onScroll'); +/** + * The StyleEffector is configured with a callback that will be invoked at the + * optimal time that some array of CSS expression ASTs ought to be evaluated. + * + * For example, our CSS-like expression syntax supports usage of the env() + * function to incorporate the current top-level scroll position into a CSS + * expression: env(window-scroll-y). + * + * This "environment variable" will change dynamically as the user scrolls the + * page. If an AST contains such a usage of env(), we would have to evaluate the + * AST on every frame in order to be sure that the computed style stays up to + * date. + * + * The StyleEffector spares us from evaluating the expressions on every frame by + * correlating specific parts of an AST with observers of the external effects + * that they refer to (if any). So, if the AST contains env(window-scroll-y), + * the StyleEffector manages the lifetime of a global scroll event listener and + * notifies the user at the optimal time to evaluate the computed style. + */ +class StyleEffector { + constructor(callback) { + this[_b$5] = {}; + this[_c$3] = new ASTWalker(['function']); + this[_d$2] = () => { + this[$computeStyleCallback]({ relatedState: 'window-scroll' }); + }; + this[$computeStyleCallback] = callback; + } + /** + * Sets the expressions that govern when the StyleEffector callback will be + * invoked. + */ + observeEffectsFor(ast) { + const newDependencies = {}; + const oldDependencies = this[$dependencies]; + this[$astWalker].walk(ast, functionNode => { + const { name } = functionNode; + const firstArgument = functionNode.arguments[0]; + const firstTerm = firstArgument.terms[0]; + if (name.value !== 'env' || firstTerm == null || + firstTerm.type !== 'ident') { + return; + } + switch (firstTerm.value) { + case 'window-scroll-y': + if (newDependencies['window-scroll'] == null) { + const observer = 'window-scroll' in oldDependencies ? + oldDependencies['window-scroll'] : + new ScrollObserver(this[$onScroll]); + observer.observe(); + delete oldDependencies['window-scroll']; + newDependencies['window-scroll'] = observer; + } + break; + } + }); + for (const environmentState in oldDependencies) { + const observer = oldDependencies[environmentState]; + observer.disconnect(); + } + this[$dependencies] = newDependencies; + } + /** + * Disposes of the StyleEffector by disconnecting all observers of external + * effects. + */ + dispose() { + for (const environmentState in this[$dependencies]) { + const observer = this[$dependencies][environmentState]; + observer.disconnect(); + } + } +} +_b$5 = $dependencies, _c$3 = $astWalker, _d$2 = $onScroll; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * The @style decorator is responsible for coordinating the conversion of a + * CSS-like string property value into numbers that can be applied to + * lower-level constructs. It also can optionally manage the lifecycle of a + * StyleEffector which allows automatic updates for styles that use env() or + * var() functions. + * + * The decorator is configured with Intrinsics and the property key for a + * method that handles updates. The named update handler is invoked with the + * result of parsing and evaluating the raw property string value. The format of + * the evaluated result is derived from the basis of the configured Intrinsics, + * and is always an array of numbers of fixed length. + * + * NOTE: This decorator depends on the property updating mechanism defined by + * UpdatingElement as exported by the lit-element module. That means it *must* + * be used in conjunction with the @property decorator, or equivalent + * JavaScript. + * + * Supported configurations are: + * + * - `intrinsics`: An Intrinsics struct that describes how to interpret a + * serialized style attribute. For more detail on intrinsics see + * ./styles/evaluators.ts + * - `updateHandler`: A string or Symbol that is the key of a method to be + * invoked with the result of parsing and evaluating a serialized style string. + * - `observeEffects`: Optional, if set to true then styles that use env() will + * cause their update handlers to be invoked every time the corresponding + * environment variable changes (even if the style attribute itself remains + * static). + */ +const style = (config) => { + const observeEffects = config.observeEffects || false; + const getIntrinsics = config.intrinsics instanceof Function ? + config.intrinsics : + (() => config.intrinsics); + return (proto, propertyName) => { + const originalUpdated = proto.updated; + const originalConnectedCallback = proto.connectedCallback; + const originalDisconnectedCallback = proto.disconnectedCallback; + const $styleEffector = Symbol(`${propertyName}StyleEffector`); + const $styleEvaluator = Symbol(`${propertyName}StyleEvaluator`); + const $updateEvaluator = Symbol(`${propertyName}UpdateEvaluator`); + const $evaluateAndSync = Symbol(`${propertyName}EvaluateAndSync`); + Object.defineProperties(proto, { + [$styleEffector]: { value: null, writable: true }, + [$styleEvaluator]: { value: null, writable: true }, + [$updateEvaluator]: { + value: function () { + const ast = parseExpressions(this[propertyName]); + this[$styleEvaluator] = + new StyleEvaluator(ast, getIntrinsics(this)); + if (this[$styleEffector] == null && observeEffects) { + this[$styleEffector] = + new StyleEffector(() => this[$evaluateAndSync]()); + } + if (this[$styleEffector] != null) { + this[$styleEffector].observeEffectsFor(ast); + } + } + }, + [$evaluateAndSync]: { + value: function () { + if (this[$styleEvaluator] == null) { + return; + } + const result = this[$styleEvaluator].evaluate(); + // @see https://github.com/microsoft/TypeScript/pull/30769 + // @see https://github.com/Microsoft/TypeScript/issues/1863 + this[config.updateHandler](result); + } + }, + updated: { + value: function (changedProperties) { + // Always invoke updates to styles first. This gives a class that + // uses this decorator the opportunity to override the effect, or + // respond to it, in its own implementation of `updated`. + if (changedProperties.has(propertyName)) { + this[$updateEvaluator](); + this[$evaluateAndSync](); + } + originalUpdated.call(this, changedProperties); + } + }, + connectedCallback: { + value: function () { + originalConnectedCallback.call(this); + this.requestUpdate(propertyName, this[propertyName]); + } + }, + disconnectedCallback: { + value: function () { + originalDisconnectedCallback.call(this); + if (this[$styleEffector] != null) { + this[$styleEffector].dispose(); + this[$styleEffector] = null; + } + } + } + }); + }; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Adapted from https://gist.github.com/gre/1650294 +const easeInOutQuad = (t) => t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t; +/** + * Creates a TimingFunction that uses a given ease to interpolate between + * two configured number values. + */ +const interpolate = (start, end, ease = easeInOutQuad) => (time) => start + (end - start) * ease(time); +/** + * Creates a TimingFunction that interpolates through a weighted list + * of other TimingFunctions ("tracks"). Tracks are interpolated in order, and + * allocated a percentage of the total time based on their relative weight. + */ +const sequence = (tracks, weights) => { + const cumulativeSum = ((sum) => (value) => sum += value); + const times = weights.map(cumulativeSum(0)); + return (time) => { + time = clamp(time, 0, 1); + time *= times[times.length - 1]; + const i = times.findIndex((val) => val >= time); + const start = i < 1 ? 0 : times[i - 1]; + const end = times[i]; + return tracks[i]((time - start) / (end - start)); + }; +}; +/** + * Creates a "timeline" TimingFunction out of an initial value and a series of + * Keyframes. The timeline function accepts value from 0-1 and returns the + * current value based on keyframe interpolation across the total number of + * frames. Frames are only used to indicate the relative length of each keyframe + * transition, so interpolated values will be computed for fractional frames. + */ +const timeline = (path) => { + const tracks = []; + const weights = []; + let lastValue = path.initialValue; + for (let i = 0; i < path.keyframes.length; ++i) { + const keyframe = path.keyframes[i]; + const { value, frames } = keyframe; + const ease = keyframe.ease || easeInOutQuad; + const track = interpolate(lastValue, value, ease); + tracks.push(track); + weights.push(frames); + lastValue = value; + } + return sequence(tracks, weights); +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$6 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +// NOTE(cdata): The following "animation" timing functions are deliberately +// being used in favor of CSS animations. In Safari 12.1 and 13, CSS animations +// would cause the interaction prompt to glitch unexpectedly +// @see https://github.com/google/model-viewer/issues/839 +const PROMPT_ANIMATION_TIME = 5000; +// For timing purposes, a "frame" is a timing agnostic relative unit of time +// and a "value" is a target value for the Frame. +const wiggle = timeline({ + initialValue: 0, + keyframes: [ + { frames: 5, value: -1 }, + { frames: 1, value: -1 }, + { frames: 8, value: 1 }, + { frames: 1, value: 1 }, + { frames: 5, value: 0 }, + { frames: 18, value: 0 } + ] +}); +const fade = timeline({ + initialValue: 0, + keyframes: [ + { frames: 1, value: 1 }, + { frames: 5, value: 1 }, + { frames: 1, value: 0 }, + { frames: 6, value: 0 } + ] +}); +const DEFAULT_FOV_DEG = 30; +const DEFAULT_MIN_FOV_DEG = 12; +const DEFAULT_CAMERA_ORBIT = '0deg 75deg 105%'; +const DEFAULT_CAMERA_TARGET = 'auto auto auto'; +const DEFAULT_FIELD_OF_VIEW = 'auto'; +const MINIMUM_RADIUS_RATIO = 2.2; +const AZIMUTHAL_QUADRANT_LABELS = ['front', 'right', 'back', 'left']; +const POLAR_TRIENT_LABELS = ['upper-', '', 'lower-']; +const DEFAULT_INTERACTION_PROMPT_THRESHOLD = 3000; +const INTERACTION_PROMPT = '. Use mouse, touch or arrow keys to move.'; +const InteractionPromptStrategy = { + AUTO: 'auto'}; +const InteractionPromptStyle = { + BASIC: 'basic', + WIGGLE: 'wiggle' +}; +const TouchAction = { + NONE: 'none' +}; +const fieldOfViewIntrinsics = () => { + return { + basis: [degreesToRadians(numberNode(DEFAULT_FOV_DEG, 'deg'))], + keywords: { auto: [null] } + }; +}; +const minFieldOfViewIntrinsics = () => { + return { + basis: [degreesToRadians(numberNode(DEFAULT_MIN_FOV_DEG, 'deg'))], + keywords: { auto: [null] } + }; +}; +const cameraOrbitIntrinsics = (() => { + const defaultTerms = parseExpressions(DEFAULT_CAMERA_ORBIT)[0] + .terms; + const theta = normalizeUnit(defaultTerms[0]); + const phi = normalizeUnit(defaultTerms[1]); + return (element) => { + const radius = element[$scene].idealCameraDistance(); + return { + basis: [theta, phi, numberNode(radius, 'm')], + keywords: { auto: [null, null, numberNode(105, '%')] } + }; + }; +})(); +const minCameraOrbitIntrinsics = (element) => { + const radius = MINIMUM_RADIUS_RATIO * element[$scene].boundingSphere.radius; + return { + basis: [ + numberNode(-Infinity, 'rad'), + numberNode(0, 'rad'), + numberNode(radius, 'm') + ], + keywords: { auto: [null, null, null] } + }; +}; +const maxCameraOrbitIntrinsics = (element) => { + const orbitIntrinsics = cameraOrbitIntrinsics(element); + const evaluator = new StyleEvaluator([], orbitIntrinsics); + const defaultRadius = evaluator.evaluate()[2]; + return { + basis: [ + numberNode(Infinity, 'rad'), + numberNode(Math.PI, 'rad'), + numberNode(defaultRadius, 'm') + ], + keywords: { auto: [null, null, null] } + }; +}; +const cameraTargetIntrinsics = (element) => { + const center = element[$scene].boundingBox.getCenter(new Vector3()); + return { + basis: [ + numberNode(center.x, 'm'), + numberNode(center.y, 'm'), + numberNode(center.z, 'm') + ], + keywords: { auto: [null, null, null] } + }; +}; +const HALF_PI = Math.PI / 2.0; +const THIRD_PI = Math.PI / 3.0; +const QUARTER_PI = HALF_PI / 2.0; +const TAU = 2.0 * Math.PI; +const $controls = Symbol('controls'); +const $panElement = Symbol('panElement'); +const $promptElement = Symbol('promptElement'); +const $promptAnimatedContainer = Symbol('promptAnimatedContainer'); +const $fingerAnimatedContainers = Symbol('fingerAnimatedContainers'); +const $deferInteractionPrompt = Symbol('deferInteractionPrompt'); +const $updateAria = Symbol('updateAria'); +const $a11y = Symbol('a11y'); +const $updateA11y = Symbol('updateA11y'); +const $updateCameraForRadius = Symbol('updateCameraForRadius'); +const $cancelPrompts = Symbol('cancelPrompts'); +const $onChange = Symbol('onChange'); +const $onPointerChange = Symbol('onPointerChange'); +const $waitingToPromptUser = Symbol('waitingToPromptUser'); +const $userHasInteracted = Symbol('userHasInteracted'); +const $promptElementVisibleTime = Symbol('promptElementVisibleTime'); +const $lastPromptOffset = Symbol('lastPromptOffset'); +const $cancellationSource = Symbol('cancellationSource'); +const $lastSpherical = Symbol('lastSpherical'); +const $jumpCamera = Symbol('jumpCamera'); +const $initialized = Symbol('initialized'); +const $maintainThetaPhi = Symbol('maintainThetaPhi'); +const $syncCameraOrbit = Symbol('syncCameraOrbit'); +const $syncFieldOfView = Symbol('syncFieldOfView'); +const $syncCameraTarget = Symbol('syncCameraTarget'); +const $syncMinCameraOrbit = Symbol('syncMinCameraOrbit'); +const $syncMaxCameraOrbit = Symbol('syncMaxCameraOrbit'); +const $syncMinFieldOfView = Symbol('syncMinFieldOfView'); +const $syncMaxFieldOfView = Symbol('syncMaxFieldOfView'); +const ControlsMixin = (ModelViewerElement) => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t; + class ControlsModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this.cameraControls = false; + this.cameraOrbit = DEFAULT_CAMERA_ORBIT; + this.cameraTarget = DEFAULT_CAMERA_TARGET; + this.fieldOfView = DEFAULT_FIELD_OF_VIEW; + this.minCameraOrbit = 'auto'; + this.maxCameraOrbit = 'auto'; + this.minFieldOfView = 'auto'; + this.maxFieldOfView = 'auto'; + this.interactionPromptThreshold = DEFAULT_INTERACTION_PROMPT_THRESHOLD; + this.interactionPrompt = InteractionPromptStrategy.AUTO; + this.interactionPromptStyle = InteractionPromptStyle.WIGGLE; + this.orbitSensitivity = 1; + this.zoomSensitivity = 1; + this.panSensitivity = 1; + this.touchAction = TouchAction.NONE; + this.disableZoom = false; + this.disablePan = false; + this.disableTap = false; + this.interpolationDecay = DECAY_MILLISECONDS; + this.a11y = null; + this[_a] = this.shadowRoot.querySelector('.interaction-prompt'); + this[_b] = this.shadowRoot.querySelector('#prompt'); + this[_c] = [ + this.shadowRoot.querySelector('#finger0'), + this.shadowRoot.querySelector('#finger1') + ]; + this[_d] = this.shadowRoot.querySelector('.pan-target'); + this[_e] = 0; + this[_f] = Infinity; + this[_g] = false; + this[_h] = false; + this[_j] = ChangeSource.AUTOMATIC; + this[_k] = new SmoothControls(this[$scene].camera, this[$userInputElement], this[$scene]); + this[_l] = new Spherical(); + this[_m] = false; + this[_o] = false; + this[_p] = false; + this[_q] = {}; + this[_r] = () => { + const source = this[$controls].changeSource; + this[$cancellationSource] = source; + if (source === ChangeSource.USER_INTERACTION) { + this[$userHasInteracted] = true; + this[$deferInteractionPrompt](); + } + }; + this[_s] = () => { + this[$updateAria](); + this[$needsRender](); + const source = this[$controls].changeSource; + this.dispatchEvent(new CustomEvent('camera-change', { detail: { source } })); + }; + this[_t] = (event) => { + this[$container].classList.toggle('pointer-tumbling', event.type === 'pointer-change-start'); + }; + } + get inputSensitivity() { + return this[$controls].inputSensitivity; + } + set inputSensitivity(value) { + this[$controls].inputSensitivity = value; + } + getCameraOrbit() { + const { theta, phi, radius } = this[$lastSpherical]; + return { + theta, + phi, + radius, + toString() { + return `${this.theta}rad ${this.phi}rad ${this.radius}m`; + } + }; + } + getCameraTarget() { + return toVector3D(this[$renderer].isPresenting ? this[$renderer].arRenderer.target : + this[$scene].getDynamicTarget()); + } + getFieldOfView() { + return this[$controls].getFieldOfView(); + } + // Provided so user code does not have to parse these from attributes. + getMinimumFieldOfView() { + return this[$controls].options.minimumFieldOfView; + } + getMaximumFieldOfView() { + return this[$controls].options.maximumFieldOfView; + } + getIdealAspect() { + return this[$scene].idealAspect; + } + jumpCameraToGoal() { + this[$jumpCamera] = true; + this.requestUpdate($jumpCamera, false); + } + resetInteractionPrompt() { + this[$lastPromptOffset] = 0; + this[$promptElementVisibleTime] = Infinity; + this[$userHasInteracted] = false; + this[$waitingToPromptUser] = + this.interactionPrompt === InteractionPromptStrategy.AUTO && + this.cameraControls; + } + zoom(keyPresses) { + const event = new WheelEvent('wheel', { deltaY: -30 * keyPresses }); + this[$userInputElement].dispatchEvent(event); + } + connectedCallback() { + super.connectedCallback(); + this[$controls].addEventListener('user-interaction', this[$cancelPrompts]); + this[$controls].addEventListener('pointer-change-start', this[$onPointerChange]); + this[$controls].addEventListener('pointer-change-end', this[$onPointerChange]); + } + disconnectedCallback() { + super.disconnectedCallback(); + this[$controls].removeEventListener('user-interaction', this[$cancelPrompts]); + this[$controls].removeEventListener('pointer-change-start', this[$onPointerChange]); + this[$controls].removeEventListener('pointer-change-end', this[$onPointerChange]); + } + updated(changedProperties) { + super.updated(changedProperties); + const controls = this[$controls]; + const scene = this[$scene]; + if (changedProperties.has('cameraControls')) { + if (this.cameraControls) { + controls.enableInteraction(); + if (this.interactionPrompt === InteractionPromptStrategy.AUTO) { + this[$waitingToPromptUser] = true; + } + } + else { + controls.disableInteraction(); + this[$deferInteractionPrompt](); + } + this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]); + } + if (changedProperties.has('disableZoom')) { + controls.disableZoom = this.disableZoom; + } + if (changedProperties.has('disablePan')) { + controls.enablePan = !this.disablePan; + } + if (changedProperties.has('disableTap')) { + controls.enableTap = !this.disableTap; + } + if (changedProperties.has('interactionPrompt') || + changedProperties.has('cameraControls') || + changedProperties.has('src')) { + if (this.interactionPrompt === InteractionPromptStrategy.AUTO && + this.cameraControls && !this[$userHasInteracted]) { + this[$waitingToPromptUser] = true; + } + else { + this[$deferInteractionPrompt](); + } + } + if (changedProperties.has('interactionPromptStyle')) { + this[$promptAnimatedContainer].style.opacity = + this.interactionPromptStyle == InteractionPromptStyle.BASIC ? '1' : + '0'; + } + if (changedProperties.has('touchAction')) { + const touchAction = this.touchAction; + controls.applyOptions({ touchAction }); + controls.updateTouchActionStyle(); + } + if (changedProperties.has('orbitSensitivity')) { + controls.orbitSensitivity = this.orbitSensitivity; + } + if (changedProperties.has('zoomSensitivity')) { + controls.zoomSensitivity = this.zoomSensitivity; + } + if (changedProperties.has('panSensitivity')) { + controls.panSensitivity = this.panSensitivity; + } + if (changedProperties.has('interpolationDecay')) { + controls.setDamperDecayTime(this.interpolationDecay); + scene.setTargetDamperDecayTime(this.interpolationDecay); + } + if (changedProperties.has('a11y')) { + this[$updateA11y](); + } + if (this[$jumpCamera] === true) { + Promise.resolve().then(() => { + controls.jumpToGoal(); + scene.jumpToGoal(); + this[$onChange](); + this[$jumpCamera] = false; + }); + } + } + async updateFraming() { + const scene = this[$scene]; + const oldFramedFoV = scene.adjustedFoV(scene.framedFoVDeg); + await scene.updateFraming(); + const newFramedFoV = scene.adjustedFoV(scene.framedFoVDeg); + const zoom = this[$controls].getFieldOfView() / oldFramedFoV; + this[$controls].setFieldOfView(newFramedFoV * zoom); + this[$maintainThetaPhi] = true; + this.requestUpdate('maxFieldOfView'); + this.requestUpdate('fieldOfView'); + this.requestUpdate('minCameraOrbit'); + this.requestUpdate('maxCameraOrbit'); + this.requestUpdate('cameraOrbit'); + await this.updateComplete; + } + interact(duration, finger0, finger1) { + const inputElement = this[$userInputElement]; + const fingerElements = this[$fingerAnimatedContainers]; + if (fingerElements[0].style.opacity === '1') { + console.warn('interact() failed because an existing interaction is running.'); + return; + } + const xy = new Array(); + xy.push({ x: timeline(finger0.x), y: timeline(finger0.y) }); + const positions = [{ x: xy[0].x(0), y: xy[0].y(0) }]; + if (finger1 != null) { + xy.push({ x: timeline(finger1.x), y: timeline(finger1.y) }); + positions.push({ x: xy[1].x(0), y: xy[1].y(0) }); + } + let startTime = performance.now(); + const { width, height } = this[$scene]; + const rect = this.getBoundingClientRect(); + const dispatchTouches = (type) => { + for (const [i, position] of positions.entries()) { + const { style } = fingerElements[i]; + style.transform = `translateX(${width * position.x}px) translateY(${height * position.y}px)`; + if (type === 'pointerdown') { + style.opacity = '1'; + } + else if (type === 'pointerup') { + style.opacity = '0'; + } + const init = { + pointerId: i - 5678, // help ensure uniqueness + pointerType: 'touch', + target: inputElement, + clientX: width * position.x + rect.x, + clientY: height * position.y + rect.y, + altKey: true // flag that this is not a user interaction + }; + inputElement.dispatchEvent(new PointerEvent(type, init)); + } + }; + const moveTouches = () => { + // Cancel interaction if something else moves the camera or input is + // removed from the DOM. + const changeSource = this[$cancellationSource]; + if (changeSource !== ChangeSource.AUTOMATIC || + !inputElement.isConnected) { + for (const fingerElement of this[$fingerAnimatedContainers]) { + fingerElement.style.opacity = '0'; + } + dispatchTouches('pointercancel'); + this.dispatchEvent(new CustomEvent('interact-stopped', { detail: { source: changeSource } })); + document.removeEventListener('visibilitychange', onVisibilityChange); + return; + } + const time = Math.min(1, (performance.now() - startTime) / duration); + for (const [i, position] of positions.entries()) { + position.x = xy[i].x(time); + position.y = xy[i].y(time); + } + dispatchTouches('pointermove'); + if (time < 1) { + requestAnimationFrame(moveTouches); + } + else { + dispatchTouches('pointerup'); + this.dispatchEvent(new CustomEvent('interact-stopped', { detail: { source: ChangeSource.AUTOMATIC } })); + document.removeEventListener('visibilitychange', onVisibilityChange); + } + }; + const onVisibilityChange = () => { + let elapsed = 0; + if (document.visibilityState === 'hidden') { + elapsed = performance.now() - startTime; + } + else { + startTime = performance.now() - elapsed; + } + }; + document.addEventListener('visibilitychange', onVisibilityChange); + dispatchTouches('pointerdown'); + this[$cancellationSource] = ChangeSource.AUTOMATIC; + requestAnimationFrame(moveTouches); + } + [(_a = $promptElement, _b = $promptAnimatedContainer, _c = $fingerAnimatedContainers, _d = $panElement, _e = $lastPromptOffset, _f = $promptElementVisibleTime, _g = $userHasInteracted, _h = $waitingToPromptUser, _j = $cancellationSource, _k = $controls, _l = $lastSpherical, _m = $jumpCamera, _o = $initialized, _p = $maintainThetaPhi, _q = $a11y, $syncFieldOfView)](style) { + const controls = this[$controls]; + const scene = this[$scene]; + scene.framedFoVDeg = style[0] * 180 / Math.PI; + controls.changeSource = ChangeSource.NONE; + controls.setFieldOfView(scene.adjustedFoV(scene.framedFoVDeg)); + this[$cancelPrompts](); + } + [$syncCameraOrbit](style) { + const controls = this[$controls]; + if (this[$maintainThetaPhi]) { + const { theta, phi } = this.getCameraOrbit(); + style[0] = theta; + style[1] = phi; + this[$maintainThetaPhi] = false; + } + controls.changeSource = ChangeSource.NONE; + controls.setOrbit(style[0], style[1], style[2]); + this[$cancelPrompts](); + } + [$syncMinCameraOrbit](style) { + this[$controls].applyOptions({ + minimumAzimuthalAngle: style[0], + minimumPolarAngle: style[1], + minimumRadius: style[2] + }); + this.jumpCameraToGoal(); + } + [$syncMaxCameraOrbit](style) { + this[$controls].applyOptions({ + maximumAzimuthalAngle: style[0], + maximumPolarAngle: style[1], + maximumRadius: style[2] + }); + this[$updateCameraForRadius](style[2]); + this.jumpCameraToGoal(); + } + [$syncMinFieldOfView](style) { + this[$controls].applyOptions({ minimumFieldOfView: style[0] * 180 / Math.PI }); + this.jumpCameraToGoal(); + } + [$syncMaxFieldOfView](style) { + const fov = this[$scene].adjustedFoV(style[0] * 180 / Math.PI); + this[$controls].applyOptions({ maximumFieldOfView: fov }); + this.jumpCameraToGoal(); + } + [$syncCameraTarget](style) { + const [x, y, z] = style; + if (!this[$renderer].arRenderer.isPresenting) { + this[$scene].setTarget(x, y, z); + } + this[$controls].changeSource = ChangeSource.NONE; + this[$renderer].arRenderer.updateTarget(); + this[$cancelPrompts](); + } + [$tick](time, delta) { + super[$tick](time, delta); + if (this[$renderer].isPresenting || !this[$getModelIsVisible]()) { + return; + } + const controls = this[$controls]; + const scene = this[$scene]; + const now = performance.now(); + if (this[$waitingToPromptUser]) { + if (this.loaded && + now > this[$loadedTime] + this.interactionPromptThreshold) { + this[$waitingToPromptUser] = false; + this[$promptElementVisibleTime] = now; + this[$promptElement].classList.add('visible'); + } + } + if (isFinite(this[$promptElementVisibleTime]) && + this.interactionPromptStyle === InteractionPromptStyle.WIGGLE) { + const animationTime = ((now - this[$promptElementVisibleTime]) / PROMPT_ANIMATION_TIME) % + 1; + const offset = wiggle(animationTime); + const opacity = fade(animationTime); + this[$promptAnimatedContainer].style.opacity = `${opacity}`; + if (offset !== this[$lastPromptOffset]) { + const xOffset = offset * scene.width * 0.05; + const deltaTheta = (offset - this[$lastPromptOffset]) * Math.PI / 16; + this[$promptAnimatedContainer].style.transform = + `translateX(${xOffset}px)`; + controls.changeSource = ChangeSource.AUTOMATIC; + controls.adjustOrbit(deltaTheta, 0, 0); + this[$lastPromptOffset] = offset; + } + } + const cameraMoved = controls.update(time, delta); + const targetMoved = scene.updateTarget(delta); + if (cameraMoved || targetMoved) { + this[$onChange](); + } + } + [$deferInteractionPrompt]() { + // Effectively cancel the timer waiting for user interaction: + this[$waitingToPromptUser] = false; + this[$promptElement].classList.remove('visible'); + this[$promptElementVisibleTime] = Infinity; + } + /** + * Updates the camera's near and far planes to enclose the scene when + * orbiting at the supplied radius. + */ + [$updateCameraForRadius](radius) { + const maximumRadius = Math.max(this[$scene].farRadius(), radius); + const near = 0; + const far = Math.abs(2 * maximumRadius); + this[$controls].updateNearFar(near, far); + } + [$updateAria]() { + const { theta, phi } = this[$controls].getCameraSpherical(this[$lastSpherical]); + const azimuthalQuadrant = (4 + Math.floor(((theta % TAU) + QUARTER_PI) / HALF_PI)) % 4; + const polarTrient = Math.floor(phi / THIRD_PI); + const azimuthalQuadrantLabel = AZIMUTHAL_QUADRANT_LABELS[azimuthalQuadrant]; + const polarTrientLabel = POLAR_TRIENT_LABELS[polarTrient]; + const position = `${polarTrientLabel}${azimuthalQuadrantLabel}`; + const key = position; + if (key in this[$a11y]) { + this[$updateStatus](this[$a11y][key]); + } + else { + this[$updateStatus](`View from stage ${position}`); + } + } + get [$ariaLabel]() { + let interactionPrompt = INTERACTION_PROMPT; + if ('interaction-prompt' in this[$a11y]) { + interactionPrompt = `. ${this[$a11y]['interaction-prompt']}`; + } + return super[$ariaLabel].replace(/\.$/, '') + + (this.cameraControls ? interactionPrompt : ''); + } + async [$onResize](event) { + const controls = this[$controls]; + const scene = this[$scene]; + const oldFramedFoV = scene.adjustedFoV(scene.framedFoVDeg); + // The super of $onResize may update the scene's adjustedFoV, so we + // compare the before and after to calculate the proper zoom. + super[$onResize](event); + const fovRatio = scene.adjustedFoV(scene.framedFoVDeg) / oldFramedFoV; + const fov = controls.getFieldOfView() * (isFinite(fovRatio) ? fovRatio : 1); + controls.updateAspect(this[$scene].aspect); + this.requestUpdate('maxFieldOfView', this.maxFieldOfView); + await this.updateComplete; + this[$controls].setFieldOfView(fov); + this.jumpCameraToGoal(); + } + [$onModelLoad]() { + super[$onModelLoad](); + if (this[$initialized]) { + this[$maintainThetaPhi] = true; + } + else { + this[$initialized] = true; + } + this.requestUpdate('maxFieldOfView', this.maxFieldOfView); + this.requestUpdate('fieldOfView', this.fieldOfView); + this.requestUpdate('minCameraOrbit', this.minCameraOrbit); + this.requestUpdate('maxCameraOrbit', this.maxCameraOrbit); + this.requestUpdate('cameraOrbit', this.cameraOrbit); + this.requestUpdate('cameraTarget', this.cameraTarget); + this.jumpCameraToGoal(); + } + [(_r = $cancelPrompts, _s = $onChange, _t = $onPointerChange, $updateA11y)]() { + if (typeof this.a11y === 'string') { + if (this.a11y.startsWith('{')) { + try { + this[$a11y] = JSON.parse(this.a11y); + } + catch (error) { + console.warn('Error parsing a11y JSON:', error); + } + } + else if (this.a11y.length > 0) { + console.warn('Error not supported format, should be a JSON string:', this.a11y); + } + else { + this[$a11y] = {}; + } + } + else if (typeof this.a11y === 'object' && this.a11y != null) { + this[$a11y] = Object.assign({}, this.a11y); + } + else { + this[$a11y] = {}; + } + this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]); + } + } + __decorate$6([ + property({ type: Boolean, attribute: 'camera-controls' }) + ], ControlsModelViewerElement.prototype, "cameraControls", void 0); + __decorate$6([ + style({ + intrinsics: cameraOrbitIntrinsics, + observeEffects: true, + updateHandler: $syncCameraOrbit + }), + property({ type: String, attribute: 'camera-orbit', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "cameraOrbit", void 0); + __decorate$6([ + style({ + intrinsics: cameraTargetIntrinsics, + observeEffects: true, + updateHandler: $syncCameraTarget + }), + property({ type: String, attribute: 'camera-target', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "cameraTarget", void 0); + __decorate$6([ + style({ + intrinsics: fieldOfViewIntrinsics, + observeEffects: true, + updateHandler: $syncFieldOfView + }), + property({ type: String, attribute: 'field-of-view', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "fieldOfView", void 0); + __decorate$6([ + style({ + intrinsics: minCameraOrbitIntrinsics, + updateHandler: $syncMinCameraOrbit + }), + property({ type: String, attribute: 'min-camera-orbit', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "minCameraOrbit", void 0); + __decorate$6([ + style({ + intrinsics: maxCameraOrbitIntrinsics, + updateHandler: $syncMaxCameraOrbit + }), + property({ type: String, attribute: 'max-camera-orbit', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "maxCameraOrbit", void 0); + __decorate$6([ + style({ + intrinsics: minFieldOfViewIntrinsics, + updateHandler: $syncMinFieldOfView + }), + property({ type: String, attribute: 'min-field-of-view', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "minFieldOfView", void 0); + __decorate$6([ + style({ intrinsics: fieldOfViewIntrinsics, updateHandler: $syncMaxFieldOfView }), + property({ type: String, attribute: 'max-field-of-view', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "maxFieldOfView", void 0); + __decorate$6([ + property({ type: Number, attribute: 'interaction-prompt-threshold' }) + ], ControlsModelViewerElement.prototype, "interactionPromptThreshold", void 0); + __decorate$6([ + property({ type: String, attribute: 'interaction-prompt' }) + ], ControlsModelViewerElement.prototype, "interactionPrompt", void 0); + __decorate$6([ + property({ type: String, attribute: 'interaction-prompt-style' }) + ], ControlsModelViewerElement.prototype, "interactionPromptStyle", void 0); + __decorate$6([ + property({ type: Number, attribute: 'orbit-sensitivity' }) + ], ControlsModelViewerElement.prototype, "orbitSensitivity", void 0); + __decorate$6([ + property({ type: Number, attribute: 'zoom-sensitivity' }) + ], ControlsModelViewerElement.prototype, "zoomSensitivity", void 0); + __decorate$6([ + property({ type: Number, attribute: 'pan-sensitivity' }) + ], ControlsModelViewerElement.prototype, "panSensitivity", void 0); + __decorate$6([ + property({ type: String, attribute: 'touch-action' }) + ], ControlsModelViewerElement.prototype, "touchAction", void 0); + __decorate$6([ + property({ type: Boolean, attribute: 'disable-zoom' }) + ], ControlsModelViewerElement.prototype, "disableZoom", void 0); + __decorate$6([ + property({ type: Boolean, attribute: 'disable-pan' }) + ], ControlsModelViewerElement.prototype, "disablePan", void 0); + __decorate$6([ + property({ type: Boolean, attribute: 'disable-tap' }) + ], ControlsModelViewerElement.prototype, "disableTap", void 0); + __decorate$6([ + property({ type: Number, attribute: 'interpolation-decay' }) + ], ControlsModelViewerElement.prototype, "interpolationDecay", void 0); + __decorate$6([ + property() + ], ControlsModelViewerElement.prototype, "a11y", void 0); + return ControlsModelViewerElement; +}; + +/* @license + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const PAN_SENSITIVITY = 0.018; +const TAP_DISTANCE = 2; +const TAP_MS = 300; +const vector2 = new Vector2(); +const vector3$2 = new Vector3(); +const DEFAULT_OPTIONS = Object.freeze({ + minimumRadius: 0, + maximumRadius: Infinity, + minimumPolarAngle: 0, + maximumPolarAngle: Math.PI, + minimumAzimuthalAngle: -Infinity, + maximumAzimuthalAngle: Infinity, + minimumFieldOfView: 10, + maximumFieldOfView: 45, + touchAction: 'none' +}); +// Constants +const KEYBOARD_ORBIT_INCREMENT = Math.PI / 8; +const ZOOM_SENSITIVITY = 0.04; +// The move size on pan key event +const PAN_KEY_INCREMENT = 10; +const ChangeSource = { + USER_INTERACTION: 'user-interaction', + NONE: 'none', + AUTOMATIC: 'automatic' +}; +/** + * SmoothControls is a Three.js helper for adding delightful pointer and + * keyboard-based input to a staged Three.js scene. Its API is very similar to + * OrbitControls, but it offers more opinionated (subjectively more delightful) + * defaults, easy extensibility and subjectively better out-of-the-box keyboard + * support. + * + * One important change compared to OrbitControls is that the `update` method + * of SmoothControls must be invoked on every frame, otherwise the controls + * will not have an effect. + * + * Another notable difference compared to OrbitControls is that SmoothControls + * does not currently support panning (but probably will in a future revision). + * + * Like OrbitControls, SmoothControls assumes that the orientation of the camera + * has been set in terms of position, rotation and scale, so it is important to + * ensure that the camera's matrixWorld is in sync before using SmoothControls. + */ +class SmoothControls extends EventDispatcher { + constructor(camera, element, scene) { + super(); + this.camera = camera; + this.element = element; + this.scene = scene; + this.orbitSensitivity = 1; + this.zoomSensitivity = 1; + this.panSensitivity = 1; + this.inputSensitivity = 1; + this.changeSource = ChangeSource.NONE; + this._interactionEnabled = false; + this._disableZoom = false; + this.isUserPointing = false; + // Pan state + this.enablePan = true; + this.enableTap = true; + this.panProjection = new Matrix3(); + this.panPerPixel = 0; + // Internal orbital position state + this.spherical = new Spherical(); + this.goalSpherical = new Spherical(); + this.thetaDamper = new Damper(); + this.phiDamper = new Damper(); + this.radiusDamper = new Damper(); + this.logFov = Math.log(DEFAULT_OPTIONS.maximumFieldOfView); + this.goalLogFov = this.logFov; + this.fovDamper = new Damper(); + // Pointer state + this.touchMode = null; + this.pointers = []; + this.startTime = 0; + this.startPointerPosition = { clientX: 0, clientY: 0 }; + this.lastSeparation = 0; + this.touchDecided = false; + this.onContext = (event) => { + if (this.enablePan) { + event.preventDefault(); + } + else { + for (const pointer of this.pointers) { + // Required because of a common browser bug where the context menu never + // fires a pointercancel event. + this.onPointerUp(new PointerEvent('pointercancel', Object.assign(Object.assign({}, this.startPointerPosition), { pointerId: pointer.id }))); + } + } + }; + this.touchModeZoom = (dx, dy) => { + if (!this._disableZoom) { + const touchDistance = this.twoTouchDistance(this.pointers[0], this.pointers[1]); + const deltaZoom = ZOOM_SENSITIVITY * this.zoomSensitivity * + (this.lastSeparation - touchDistance) * 50 / this.scene.height; + this.lastSeparation = touchDistance; + this.userAdjustOrbit(0, 0, deltaZoom); + } + if (this.panPerPixel > 0) { + this.movePan(dx, dy); + } + }; + // We implement our own version of the browser's CSS touch-action, enforced by + // this function, because the iOS implementation of pan-y is bad and doesn't + // match Android. Specifically, even if a touch gesture begins by panning X, + // iOS will switch to scrolling as soon as the gesture moves in the Y, rather + // than staying in the same mode until the end of the gesture. + this.disableScroll = (event) => { + event.preventDefault(); + }; + this.touchModeRotate = (dx, dy) => { + const { touchAction } = this._options; + if (!this.touchDecided && touchAction !== 'none') { + this.touchDecided = true; + const dxMag = Math.abs(dx); + const dyMag = Math.abs(dy); + // If motion is mostly vertical, assume scrolling is the intent. + if (this.changeSource === ChangeSource.USER_INTERACTION && + ((touchAction === 'pan-y' && dyMag > dxMag) || + (touchAction === 'pan-x' && dxMag > dyMag))) { + this.touchMode = null; + return; + } + else { + this.element.addEventListener('touchmove', this.disableScroll, { passive: false }); + } + } + this.handleSinglePointerMove(dx, dy); + }; + this.onPointerDown = (event) => { + if (this.pointers.length > 2) { + return; + } + const { element } = this; + if (this.pointers.length === 0) { + element.addEventListener('pointermove', this.onPointerMove); + element.addEventListener('pointerup', this.onPointerUp); + this.touchMode = null; + this.touchDecided = false; + this.startPointerPosition.clientX = event.clientX; + this.startPointerPosition.clientY = event.clientY; + this.startTime = performance.now(); + } + try { + element.setPointerCapture(event.pointerId); + } + catch (_a) { + } + this.pointers.push({ clientX: event.clientX, clientY: event.clientY, id: event.pointerId }); + this.isUserPointing = false; + if (event.pointerType === 'touch') { + this.changeSource = event.altKey ? // set by interact() in controls.ts + ChangeSource.AUTOMATIC : + ChangeSource.USER_INTERACTION; + this.onTouchChange(event); + } + else { + this.changeSource = ChangeSource.USER_INTERACTION; + this.onMouseDown(event); + } + if (this.changeSource === ChangeSource.USER_INTERACTION) { + this.dispatchEvent({ type: 'user-interaction' }); + } + }; + this.onPointerMove = (event) => { + const pointer = this.pointers.find((pointer) => pointer.id === event.pointerId); + if (pointer == null) { + return; + } + // In case no one gave us a pointerup or pointercancel event. + if (event.pointerType === 'mouse' && event.buttons === 0) { + this.onPointerUp(event); + return; + } + const numTouches = this.pointers.length; + const dx = (event.clientX - pointer.clientX) / numTouches; + const dy = (event.clientY - pointer.clientY) / numTouches; + if (dx === 0 && dy === 0) { + return; + } + pointer.clientX = event.clientX; + pointer.clientY = event.clientY; + if (event.pointerType === 'touch') { + this.changeSource = event.altKey ? // set by interact() in controls.ts + ChangeSource.AUTOMATIC : + ChangeSource.USER_INTERACTION; + if (this.touchMode !== null) { + this.touchMode(dx, dy); + } + } + else { + this.changeSource = ChangeSource.USER_INTERACTION; + if (this.panPerPixel > 0) { + this.movePan(dx, dy); + } + else { + this.handleSinglePointerMove(dx, dy); + } + } + }; + this.onPointerUp = (event) => { + const { element } = this; + const index = this.pointers.findIndex((pointer) => pointer.id === event.pointerId); + if (index !== -1) { + this.pointers.splice(index, 1); + } + // altKey indicates an interaction prompt; don't reset radius in this case + // as it will cause the camera to drift. + if (this.panPerPixel > 0 && !event.altKey) { + this.resetRadius(); + } + if (this.pointers.length === 0) { + element.removeEventListener('pointermove', this.onPointerMove); + element.removeEventListener('pointerup', this.onPointerUp); + element.removeEventListener('touchmove', this.disableScroll); + if (this.enablePan && this.enableTap) { + this.recenter(event); + } + } + else if (this.touchMode !== null) { + this.onTouchChange(event); + } + this.scene.element[$panElement].style.opacity = 0; + element.style.cursor = 'grab'; + this.panPerPixel = 0; + if (this.isUserPointing) { + this.dispatchEvent({ type: 'pointer-change-end' }); + } + }; + this.onWheel = (event) => { + this.changeSource = ChangeSource.USER_INTERACTION; + const deltaZoom = event.deltaY * + (event.deltaMode == 1 ? 18 : 1) * ZOOM_SENSITIVITY * + this.zoomSensitivity / 30; + this.userAdjustOrbit(0, 0, deltaZoom); + event.preventDefault(); + this.dispatchEvent({ type: 'user-interaction' }); + }; + this.onKeyDown = (event) => { + // We track if the key is actually one we respond to, so as not to + // accidentally clobber unrelated key inputs when the has + // focus. + const { changeSource } = this; + this.changeSource = ChangeSource.USER_INTERACTION; + const relevantKey = (event.shiftKey && this.enablePan) ? + this.panKeyCodeHandler(event) : + this.orbitZoomKeyCodeHandler(event); + if (relevantKey) { + event.preventDefault(); + this.dispatchEvent({ type: 'user-interaction' }); + } + else { + this.changeSource = changeSource; + } + }; + this._options = Object.assign({}, DEFAULT_OPTIONS); + this.setOrbit(0, Math.PI / 2, 1); + this.setFieldOfView(100); + this.jumpToGoal(); + } + get interactionEnabled() { + return this._interactionEnabled; + } + enableInteraction() { + if (this._interactionEnabled === false) { + const { element } = this; + element.addEventListener('pointerdown', this.onPointerDown); + element.addEventListener('pointercancel', this.onPointerUp); + if (!this._disableZoom) { + element.addEventListener('wheel', this.onWheel); + } + element.addEventListener('keydown', this.onKeyDown); + // This little beauty is to work around a WebKit bug that otherwise makes + // touch events randomly not cancelable. + element.addEventListener('touchmove', () => { }, { passive: false }); + element.addEventListener('contextmenu', this.onContext); + this.element.style.cursor = 'grab'; + this._interactionEnabled = true; + this.updateTouchActionStyle(); + } + } + disableInteraction() { + if (this._interactionEnabled === true) { + const { element } = this; + element.removeEventListener('pointerdown', this.onPointerDown); + element.removeEventListener('pointermove', this.onPointerMove); + element.removeEventListener('pointerup', this.onPointerUp); + element.removeEventListener('pointercancel', this.onPointerUp); + element.removeEventListener('wheel', this.onWheel); + element.removeEventListener('keydown', this.onKeyDown); + element.removeEventListener('contextmenu', this.onContext); + element.style.cursor = ''; + this.touchMode = null; + this._interactionEnabled = false; + this.updateTouchActionStyle(); + } + } + /** + * The options that are currently configured for the controls instance. + */ + get options() { + return this._options; + } + set disableZoom(disable) { + if (this._disableZoom != disable) { + this._disableZoom = disable; + if (disable === true) { + this.element.removeEventListener('wheel', this.onWheel); + } + else { + this.element.addEventListener('wheel', this.onWheel); + } + this.updateTouchActionStyle(); + } + } + /** + * Copy the spherical values that represent the current camera orbital + * position relative to the configured target into a provided Spherical + * instance. If no Spherical is provided, a new Spherical will be allocated + * to copy the values into. The Spherical that values are copied into is + * returned. + */ + getCameraSpherical(target = new Spherical()) { + return target.copy(this.spherical); + } + /** + * Returns the camera's current vertical field of view in degrees. + */ + getFieldOfView() { + return this.camera.fov; + } + /** + * Configure the _options of the controls. Configured _options will be + * merged with whatever _options have already been configured for this + * controls instance. + */ + applyOptions(_options) { + Object.assign(this._options, _options); + // Re-evaluates clamping based on potentially new values for min/max + // polar, azimuth and radius: + this.setOrbit(); + this.setFieldOfView(Math.exp(this.goalLogFov)); + } + /** + * Sets the near and far planes of the camera. + */ + updateNearFar(nearPlane, farPlane) { + this.camera.far = farPlane === 0 ? 2 : farPlane; + this.camera.near = Math.max(nearPlane, this.camera.far / 1000); + this.camera.updateProjectionMatrix(); + } + /** + * Sets the aspect ratio of the camera + */ + updateAspect(aspect) { + this.camera.aspect = aspect; + this.camera.updateProjectionMatrix(); + } + /** + * Set the absolute orbital goal of the camera. The change will be + * applied over a number of frames depending on configured acceleration and + * dampening _options. + * + * Returns true if invoking the method will result in the camera changing + * position and/or rotation, otherwise false. + */ + setOrbit(goalTheta = this.goalSpherical.theta, goalPhi = this.goalSpherical.phi, goalRadius = this.goalSpherical.radius) { + const { minimumAzimuthalAngle, maximumAzimuthalAngle, minimumPolarAngle, maximumPolarAngle, minimumRadius, maximumRadius } = this._options; + const { theta, phi, radius } = this.goalSpherical; + const nextTheta = clamp(goalTheta, minimumAzimuthalAngle, maximumAzimuthalAngle); + if (!isFinite(minimumAzimuthalAngle) && + !isFinite(maximumAzimuthalAngle)) { + this.spherical.theta = + this.wrapAngle(this.spherical.theta - nextTheta) + nextTheta; + } + const nextPhi = clamp(goalPhi, minimumPolarAngle, maximumPolarAngle); + const nextRadius = clamp(goalRadius, minimumRadius, maximumRadius); + if (nextTheta === theta && nextPhi === phi && nextRadius === radius) { + return false; + } + if (!isFinite(nextTheta) || !isFinite(nextPhi) || !isFinite(nextRadius)) { + return false; + } + this.goalSpherical.theta = nextTheta; + this.goalSpherical.phi = nextPhi; + this.goalSpherical.radius = nextRadius; + this.goalSpherical.makeSafe(); + return true; + } + /** + * Subset of setOrbit() above, which only sets the camera's radius. + */ + setRadius(radius) { + this.goalSpherical.radius = radius; + this.setOrbit(); + } + /** + * Sets the goal field of view for the camera + */ + setFieldOfView(fov) { + const { minimumFieldOfView, maximumFieldOfView } = this._options; + fov = clamp(fov, minimumFieldOfView, maximumFieldOfView); + this.goalLogFov = Math.log(fov); + } + /** + * Sets the smoothing decay time. + */ + setDamperDecayTime(decayMilliseconds) { + this.thetaDamper.setDecayTime(decayMilliseconds); + this.phiDamper.setDecayTime(decayMilliseconds); + this.radiusDamper.setDecayTime(decayMilliseconds); + this.fovDamper.setDecayTime(decayMilliseconds); + } + /** + * Adjust the orbital position of the camera relative to its current orbital + * position. Does not let the theta goal get more than pi ahead of the current + * theta, which ensures interpolation continues in the direction of the delta. + * The deltaZoom parameter adjusts both the field of view and the orbit radius + * such that they progress across their allowed ranges in sync. + */ + adjustOrbit(deltaTheta, deltaPhi, deltaZoom) { + const { theta, phi, radius } = this.goalSpherical; + const { minimumRadius, maximumRadius, minimumFieldOfView, maximumFieldOfView } = this._options; + const dTheta = this.spherical.theta - theta; + const dThetaLimit = Math.PI - 0.001; + const goalTheta = theta - clamp(deltaTheta, -dThetaLimit - dTheta, dThetaLimit - dTheta); + const goalPhi = phi - deltaPhi; + const deltaRatio = deltaZoom === 0 ? + 0 : + ((deltaZoom > 0 ? maximumRadius : minimumRadius) - radius) / + (Math.log(deltaZoom > 0 ? maximumFieldOfView : minimumFieldOfView) - + this.goalLogFov); + const goalRadius = radius + + deltaZoom * + (isFinite(deltaRatio) ? deltaRatio : + (maximumRadius - minimumRadius) * 2); + this.setOrbit(goalTheta, goalPhi, goalRadius); + if (deltaZoom !== 0) { + const goalLogFov = this.goalLogFov + deltaZoom; + this.setFieldOfView(Math.exp(goalLogFov)); + } + } + /** + * Move the camera instantly instead of accelerating toward the goal + * parameters. + */ + jumpToGoal() { + this.update(0, SETTLING_TIME); + } + /** + * Update controls. In most cases, this will result in the camera + * interpolating its position and rotation until it lines up with the + * designated goal orbital position. Returns false if the camera did not move. + * + * Time and delta are measured in milliseconds. + */ + update(_time, delta) { + if (this.isStationary()) { + return false; + } + const { maximumPolarAngle, maximumRadius } = this._options; + const dTheta = this.spherical.theta - this.goalSpherical.theta; + if (Math.abs(dTheta) > Math.PI && + !isFinite(this._options.minimumAzimuthalAngle) && + !isFinite(this._options.maximumAzimuthalAngle)) { + this.spherical.theta -= Math.sign(dTheta) * 2 * Math.PI; + } + this.spherical.theta = this.thetaDamper.update(this.spherical.theta, this.goalSpherical.theta, delta, Math.PI); + this.spherical.phi = this.phiDamper.update(this.spherical.phi, this.goalSpherical.phi, delta, maximumPolarAngle); + this.spherical.radius = this.radiusDamper.update(this.spherical.radius, this.goalSpherical.radius, delta, maximumRadius); + this.logFov = this.fovDamper.update(this.logFov, this.goalLogFov, delta, 1); + this.moveCamera(); + return true; + } + updateTouchActionStyle() { + const { style } = this.element; + if (this._interactionEnabled) { + const { touchAction } = this._options; + if (this._disableZoom && touchAction !== 'none') { + style.touchAction = 'manipulation'; + } + else { + style.touchAction = touchAction; + } + } + else { + style.touchAction = ''; + } + } + isStationary() { + return this.goalSpherical.theta === this.spherical.theta && + this.goalSpherical.phi === this.spherical.phi && + this.goalSpherical.radius === this.spherical.radius && + this.goalLogFov === this.logFov; + } + moveCamera() { + // Derive the new camera position from the updated spherical: + this.spherical.makeSafe(); + this.camera.position.setFromSpherical(this.spherical); + this.camera.setRotationFromEuler(new Euler(this.spherical.phi - Math.PI / 2, this.spherical.theta, 0, 'YXZ')); + if (this.camera.fov !== Math.exp(this.logFov)) { + this.camera.fov = Math.exp(this.logFov); + this.camera.updateProjectionMatrix(); + } + } + userAdjustOrbit(deltaTheta, deltaPhi, deltaZoom) { + this.adjustOrbit(deltaTheta * this.orbitSensitivity * this.inputSensitivity, deltaPhi * this.orbitSensitivity * this.inputSensitivity, deltaZoom * this.inputSensitivity); + } + // Wraps to between -pi and pi + wrapAngle(radians) { + const normalized = (radians + Math.PI) / (2 * Math.PI); + const wrapped = normalized - Math.floor(normalized); + return wrapped * 2 * Math.PI - Math.PI; + } + pixelLengthToSphericalAngle(pixelLength) { + return 2 * Math.PI * pixelLength / this.scene.height; + } + twoTouchDistance(touchOne, touchTwo) { + const { clientX: xOne, clientY: yOne } = touchOne; + const { clientX: xTwo, clientY: yTwo } = touchTwo; + const xDelta = xTwo - xOne; + const yDelta = yTwo - yOne; + return Math.sqrt(xDelta * xDelta + yDelta * yDelta); + } + handleSinglePointerMove(dx, dy) { + const deltaTheta = this.pixelLengthToSphericalAngle(dx); + const deltaPhi = this.pixelLengthToSphericalAngle(dy); + if (this.isUserPointing === false) { + this.isUserPointing = true; + this.dispatchEvent({ type: 'pointer-change-start' }); + } + this.userAdjustOrbit(deltaTheta, deltaPhi, 0); + } + initializePan() { + const { theta, phi } = this.spherical; + const psi = theta - this.scene.yaw; + this.panPerPixel = + PAN_SENSITIVITY * this.panSensitivity / this.scene.height; + this.panProjection.set(-Math.cos(psi), -Math.cos(phi) * Math.sin(psi), 0, 0, Math.sin(phi), 0, Math.sin(psi), -Math.cos(phi) * Math.cos(psi), 0); + } + movePan(dx, dy) { + const { scene } = this; + const dxy = vector3$2.set(dx, dy, 0).multiplyScalar(this.inputSensitivity); + const metersPerPixel = this.spherical.radius * Math.exp(this.logFov) * this.panPerPixel; + dxy.multiplyScalar(metersPerPixel); + const target = scene.getTarget(); + target.add(dxy.applyMatrix3(this.panProjection)); + scene.boundingSphere.clampPoint(target, target); + scene.setTarget(target.x, target.y, target.z); + } + recenter(pointer) { + if (performance.now() > this.startTime + TAP_MS || + Math.abs(pointer.clientX - this.startPointerPosition.clientX) > + TAP_DISTANCE || + Math.abs(pointer.clientY - this.startPointerPosition.clientY) > + TAP_DISTANCE) { + return; + } + const { scene } = this; + const hit = scene.positionAndNormalFromPoint(scene.getNDC(pointer.clientX, pointer.clientY)); + if (hit == null) { + const { cameraTarget } = scene.element; + scene.element.cameraTarget = ''; + scene.element.cameraTarget = cameraTarget; + // Zoom all the way out. + this.userAdjustOrbit(0, 0, 1); + } + else { + scene.target.worldToLocal(hit.position); + scene.setTarget(hit.position.x, hit.position.y, hit.position.z); + } + } + resetRadius() { + const { scene } = this; + const hit = scene.positionAndNormalFromPoint(vector2.set(0, 0)); + if (hit == null) { + return; + } + scene.target.worldToLocal(hit.position); + const goalTarget = scene.getTarget(); + const { theta, phi } = this.spherical; + // Set target to surface hit point, except the target is still settling, + // so offset the goal accordingly so the transition is smooth even though + // this will drift the target slightly away from the hit point. + const psi = theta - scene.yaw; + const n = vector3$2.set(Math.sin(phi) * Math.sin(psi), Math.cos(phi), Math.sin(phi) * Math.cos(psi)); + const dr = n.dot(hit.position.sub(goalTarget)); + goalTarget.add(n.multiplyScalar(dr)); + scene.setTarget(goalTarget.x, goalTarget.y, goalTarget.z); + // Change the camera radius to match the change in target so that the + // camera itself does not move, unless it hits a radius bound. + this.setOrbit(undefined, undefined, this.goalSpherical.radius - dr); + } + onTouchChange(event) { + if (this.pointers.length === 1) { + this.touchMode = this.touchModeRotate; + } + else { + if (this._disableZoom) { + this.touchMode = null; + this.element.removeEventListener('touchmove', this.disableScroll); + return; + } + this.touchMode = (this.touchDecided && this.touchMode === null) ? + null : + this.touchModeZoom; + this.touchDecided = true; + this.element.addEventListener('touchmove', this.disableScroll, { passive: false }); + this.lastSeparation = + this.twoTouchDistance(this.pointers[0], this.pointers[1]); + if (this.enablePan && this.touchMode != null) { + this.initializePan(); + if (!event.altKey) { // user interaction, not prompt + this.scene.element[$panElement].style.opacity = 1; + } + } + } + } + onMouseDown(event) { + this.panPerPixel = 0; + if (this.enablePan && + (event.button === 2 || event.ctrlKey || event.metaKey || + event.shiftKey)) { + this.initializePan(); + this.scene.element[$panElement].style.opacity = 1; + } + this.element.style.cursor = 'grabbing'; + } + /** + * Handles the orbit and Zoom key presses + * Uses constants for the increment. + * @param event The keyboard event for the .key value + * @returns boolean to indicate if the key event has been handled + */ + orbitZoomKeyCodeHandler(event) { + let relevantKey = true; + switch (event.key) { + case 'PageUp': + this.userAdjustOrbit(0, 0, ZOOM_SENSITIVITY * this.zoomSensitivity); + break; + case 'PageDown': + this.userAdjustOrbit(0, 0, -1 * ZOOM_SENSITIVITY * this.zoomSensitivity); + break; + case 'ArrowUp': + this.userAdjustOrbit(0, -KEYBOARD_ORBIT_INCREMENT, 0); + break; + case 'ArrowDown': + this.userAdjustOrbit(0, KEYBOARD_ORBIT_INCREMENT, 0); + break; + case 'ArrowLeft': + this.userAdjustOrbit(-KEYBOARD_ORBIT_INCREMENT, 0, 0); + break; + case 'ArrowRight': + this.userAdjustOrbit(KEYBOARD_ORBIT_INCREMENT, 0, 0); + break; + default: + relevantKey = false; + break; + } + return relevantKey; + } + /** + * Handles the Pan key presses + * Uses constants for the increment. + * @param event The keyboard event for the .key value + * @returns boolean to indicate if the key event has been handled + */ + panKeyCodeHandler(event) { + this.initializePan(); + let relevantKey = true; + switch (event.key) { + case 'ArrowUp': + this.movePan(0, -1 * PAN_KEY_INCREMENT); // This is the negative one so that the + // model appears to move as the arrow + // direction rather than the view moving + break; + case 'ArrowDown': + this.movePan(0, PAN_KEY_INCREMENT); + break; + case 'ArrowLeft': + this.movePan(-1 * PAN_KEY_INCREMENT, 0); + break; + case 'ArrowRight': + this.movePan(PAN_KEY_INCREMENT, 0); + break; + default: + relevantKey = false; + break; + } + return relevantKey; + } +} + +// SVG strings for the icons are defined here to avoid io and better performance for xr. +const CLOSE_ICON_SVG = ` + +`; +const VIEW_REAL_SIZE_ICON_SVG = ` + +`; +const REPLAY_ICON_SVG = ` + + + + + + + + +`; +// Panel configuration +const PANEL_CONFIG = { + width: 0.16, + height: 0.07, + cornerRadius: 0.03, + opacity: 1, + color: 0x000000, + // Distance-based scaling configuration + minDistance: 0.5, // Minimum distance for scaling (meters) + maxDistance: 10.0, // Maximum distance for scaling (meters) + baseScale: 1.0, // Base scale factor + distanceScaleFactor: 0.3 // How much to scale per meter of distance +}; +// Button configuration +const BUTTON_CONFIG = { + size: 0.05, // Fixed size for all buttons + zOffset: 0.01, // Distance from panel surface + spacing: 0.07 // Space between button centers +}; +// Icon configuration +const ICON_CONFIG = { + canvasSize: 128, + filter: LinearFilter +}; +class XRMenuPanel extends Object3D { + constructor() { + super(); + this.isActualSize = false; // Start with normalized size + // Pre-render all icons + this.preRenderIcons(); + this.createPanel(); + this.createButtons(); + this.opacityDamper = new Damper(); + this.goalOpacity = PANEL_CONFIG.opacity; + } + createPanel() { + const panelShape = this.createPanelShape(); + const geometry = new ShapeGeometry(panelShape); + const material = new MeshBasicMaterial({ + color: PANEL_CONFIG.color, + opacity: PANEL_CONFIG.opacity, + transparent: true + }); + this.panelMesh = new Mesh(geometry, material); + this.panelMesh.name = 'MenuPanel'; + this.add(this.panelMesh); + } + createButtons() { + // Create exit button + this.exitButton = this.createButton('close'); + this.exitButton.name = 'ExitButton'; + this.exitButton.position.set(BUTTON_CONFIG.spacing / 2, 0, BUTTON_CONFIG.zOffset); + this.add(this.exitButton); + // Create toggle button + this.toggleButton = this.createButton('view-real-size'); + this.toggleButton.name = 'ToggleButton'; + this.toggleButton.position.set(-0.07 / 2, 0, BUTTON_CONFIG.zOffset); + this.add(this.toggleButton); + } + createPanelShape() { + const shape = new Shape(); + const { width: w, height: h, cornerRadius: r } = PANEL_CONFIG; + // Create rounded rectangle path + shape.moveTo(-0.16 / 2 + r, -0.07 / 2); + shape.lineTo(w / 2 - r, -0.07 / 2); + shape.quadraticCurveTo(w / 2, -0.07 / 2, w / 2, -0.07 / 2 + r); + shape.lineTo(w / 2, h / 2 - r); + shape.quadraticCurveTo(w / 2, h / 2, w / 2 - r, h / 2); + shape.lineTo(-0.16 / 2 + r, h / 2); + shape.quadraticCurveTo(-0.16 / 2, h / 2, -0.16 / 2, h / 2 - r); + shape.lineTo(-0.16 / 2, -0.07 / 2 + r); + shape.quadraticCurveTo(-0.16 / 2, -0.07 / 2, -0.16 / 2 + r, -0.07 / 2); + return shape; + } + preRenderIcons() { + const iconSvgs = [ + { key: 'close', svg: CLOSE_ICON_SVG }, + { key: 'view-real-size', svg: VIEW_REAL_SIZE_ICON_SVG }, + { key: 'replay', svg: REPLAY_ICON_SVG } + ]; + iconSvgs.forEach(({ key, svg }) => { + if (!XRMenuPanel.iconTextures.has(key)) { + this.createTextureFromSvg(svg, key); + } + }); + } + createTextureFromSvg(svgContent, key) { + const canvas = document.createElement('canvas'); + canvas.width = ICON_CONFIG.canvasSize; + canvas.height = ICON_CONFIG.canvasSize; + const ctx = canvas.getContext('2d'); + // Create an image from SVG content + const img = new Image(); + const svgBlob = new Blob([svgContent], { type: 'image/svg+xml' }); + const url = URL.createObjectURL(svgBlob); + img.onload = () => { + ctx.drawImage(img, 0, 0, ICON_CONFIG.canvasSize, ICON_CONFIG.canvasSize); + const texture = new CanvasTexture(canvas); + texture.needsUpdate = true; + texture.minFilter = ICON_CONFIG.filter; + XRMenuPanel.iconTextures.set(key, texture); + URL.revokeObjectURL(url); + }; + img.src = url; + } + createButton(iconKey) { + // Create a placeholder mesh + const material = new MeshBasicMaterial({ transparent: true }); + const geometry = new PlaneGeometry(BUTTON_CONFIG.size, BUTTON_CONFIG.size); + const mesh = new Mesh(geometry, material); + // Try to get cached texture, or create a fallback + const cachedTexture = XRMenuPanel.iconTextures.get(iconKey); + if (cachedTexture) { + mesh.material.map = cachedTexture; + mesh.material.needsUpdate = true; + } + else { + // RACE CONDITION FIX: Texture creation is async (img.onload), but button creation is sync + // This fallback handles the case where buttons are created before textures finish loading + this.createTextureFromSvg(iconKey === 'close' ? CLOSE_ICON_SVG : + iconKey === 'view-real-size' ? VIEW_REAL_SIZE_ICON_SVG : + REPLAY_ICON_SVG, iconKey); + // Polling mechanism: Wait for async texture creation to complete + // This prevents white squares from appearing on first load + const checkTexture = () => { + const texture = XRMenuPanel.iconTextures.get(iconKey); + if (texture) { + // Texture is ready - apply it to the mesh + mesh.material.map = texture; + mesh.material.needsUpdate = true; + } + else { + // Texture not ready yet - check again in 10ms + setTimeout(checkTexture, 10); + } + }; + checkTexture(); + } + return mesh; + } + exitButtonControllerIntersection(scene, controller) { + const hitResult = scene.hitFromController(controller, this.exitButton); + return hitResult; + } + scaleModeButtonControllerIntersection(scene, controller) { + const hitResult = scene.hitFromController(controller, this.toggleButton); + return hitResult; + } + handleScaleToggle(worldSpaceInitialPlacementDone, initialModelScale, minScale, maxScale) { + if (!worldSpaceInitialPlacementDone) { + return null; + } + this.isActualSize = !this.isActualSize; + // Toggle between view real size icon and replay icon + // When isActualSize is true, show replay icon (to reset) + // When isActualSize is false, show view real size icon (to go to actual size) + const iconKey = this.isActualSize ? 'replay' : 'view-real-size'; + this.updateScaleModeButtonLabel(iconKey); + const targetScale = this.isActualSize ? 1.0 : initialModelScale; + const goalScale = Math.max(minScale, Math.min(maxScale, targetScale)); + return goalScale; + } + updateScaleModeButtonLabel(iconKey) { + const cachedTexture = XRMenuPanel.iconTextures.get(iconKey); + if (cachedTexture) { + this.toggleButton.material.map = cachedTexture; + this.toggleButton.material.needsUpdate = true; + } + } + updatePosition(camera, placementBox) { + if (!placementBox) { + return; + } + // Get the world position of the placement box + const placementBoxWorldPos = new Vector3(); + placementBox.getWorldPosition(placementBoxWorldPos); + // Get the placement box size to calculate dynamic offsets + const placementBoxSize = placementBox.getSize(); + const placementBoxMinDimension = Math.min(placementBoxSize.x, placementBoxSize.z); + // Calculate dynamic offsets based on placement box size + // Base offsets with placement box size scaling + const baseOffsetUp = -0.2; + const baseOffsetForward = 0.9; + const sizeScaleFactor = Math.max(0.5, Math.min(2.0, placementBoxMinDimension / 1.0)); // Scale between 0.5x and 2x + const offsetUp = baseOffsetUp * sizeScaleFactor; + const offsetForward = baseOffsetForward * sizeScaleFactor; + // Get direction from placement box to camera (horizontal only) + const directionToCamera = new Vector3() + .copy(camera.position) + .sub(placementBoxWorldPos); + directionToCamera.y = 0; // Zero out vertical component + directionToCamera.normalize(); + // Calculate the final position + const panelPosition = new Vector3() + .copy(placementBoxWorldPos) + .add(new Vector3(0, offsetUp, 0)) // Move up + .add(directionToCamera.multiplyScalar(offsetForward)); // Move forward + this.position.copy(panelPosition); + // Calculate distance-based scaling + const distanceToCamera = camera.position.distanceTo(panelPosition); + const clampedDistance = Math.max(PANEL_CONFIG.minDistance, Math.min(PANEL_CONFIG.maxDistance, distanceToCamera)); + const scaleFactor = PANEL_CONFIG.baseScale + (clampedDistance - PANEL_CONFIG.minDistance) * PANEL_CONFIG.distanceScaleFactor; + // Apply scaling to the entire panel (including buttons) + this.scale.set(scaleFactor, scaleFactor, scaleFactor); + // Make the menu panel face the camera + this.lookAt(camera.position); + } + /** + * Set the box's visibility; it will fade in and out. + */ + set show(visible) { + this.goalOpacity = visible ? PANEL_CONFIG.opacity : 0; + } + /** + * Call on each frame with the frame delta to fade the box. + */ + updateOpacity(delta) { + const material = this.panelMesh.material; + const currentOpacity = material.opacity; + const newOpacity = this.opacityDamper.update(currentOpacity, this.goalOpacity, delta, 1); + this.traverse((child) => { + if (child instanceof Mesh) { + const mat = child.material; + if (mat.transparent) + mat.opacity = newOpacity; + } + }); + this.visible = newOpacity > 0; + } + dispose() { + var _a; + this.children.forEach(child => { + if (child instanceof Mesh) { + // Dispose geometry first + if (child.geometry) { + child.geometry.dispose(); + } + // Handle material(s) + // Material can be a single Material or an array of Materials + const materials = Array.isArray(child.material) ? child.material : [child.material]; + materials.forEach(material => { + if (material) { // Ensure material exists before proceeding + // Dispose texture if it exists and is a CanvasTexture + // We specifically created CanvasTextures for buttons, so check for that type. + if ('map' in material && material.map instanceof CanvasTexture) { // Check if 'map' property exists and is a CanvasTexture + material.map.dispose(); + } + // Dispose material itself + material.dispose(); + } + }); + } + }); + // Remove the panel itself from its parent in the scene graph + (_a = this.parent) === null || _a === void 0 ? void 0 : _a.remove(this); + } +} +// Cache for pre-rendered textures +XRMenuPanel.iconTextures = new Map(); + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// number of initial null pose XRFrames allowed before we post not-tracking +const INIT_FRAMES = 30; +// AR shadow is not user-configurable. This is to pave the way for AR lighting +// estimation, which will be used once available in WebXR. +const AR_SHADOW_INTENSITY = 0.8; +const ROTATION_RATE = 1.5; +// Angle down (towards bottom of screen) from camera center ray to use for hit +// testing against the floor. This makes placement faster and more intuitive +// assuming the phone is in portrait mode. This seems to be a reasonable +// assumption for the start of the session and UI will lack landscape mode to +// encourage upright use. +const HIT_ANGLE_DEG = 20; +const SCALE_SNAP = 0.2; +// upward-oriented ray for ceiling detection +const CEILING_HIT_ANGLE_DEG = 20; +const CEILING_ORIENTATION_THRESHOLD = 15; // degrees +// For automatic dynamic viewport scaling, don't let the scale drop below this +// limit. +const MIN_VIEWPORT_SCALE = 0.25; +// Furthest away you can move an object (meters). +const MAX_DISTANCE = 10; +// Damper decay in milliseconds for the headset - screen uses default. +const DECAY = 150; +// Longer controller/hand indicator line (meters). +const MAX_LINE_LENGTH = 5; +// Axis Y in webxr. +const AXIS_Y = new Vector3(0, 1, 0); +// Webxr rotation sensitivity +const ROTATION_SENSIVITY = 0.3; +// World-space AR automatic positioning constants (similar to FrameModel approach in SVXR) +const MIN_WORLD_SPACE_DISTANCE = 1.5; // Minimum distance from camera (meters) +const VIEW_DROP_DEGREES = 15; // Angle down from camera center for optimal viewing +const VIEW_RATIO = 0.3; // Ratio of viewport to use for model sizing +const MIN_MODEL_SIZE = 0.01; // Minimum model size to prevent division by zero +const PLACEMENT_BOX_EXTRA_PADDING = 0.15; // Extra padding for model-viewer +// SVXR-like constants for scale limits +const MAX_MODEL_SIZE = 70.0; +const MODEL_SIZE_EPSILON = 0.001; +const FOOTPRINT__INTERSECT_THRESHOLD = 0.2; +const ARStatus = { + NOT_PRESENTING: 'not-presenting', + SESSION_STARTED: 'session-started', + OBJECT_PLACED: 'object-placed', + FAILED: 'failed' +}; +const ARTracking = { + TRACKING: 'tracking', + NOT_TRACKING: 'not-tracking' +}; +const vector3$1 = new Vector3(); +const quaternion = new Quaternion(); +const matrix4 = new Matrix4(); +const hitPosition = new Vector3(); +const camera = new PerspectiveCamera(45, 1, 0.1, 100); +const lineGeometry = new BufferGeometry().setFromPoints([new Vector3(0, 0, 0), new Vector3(0, 0, -1)]); +const XRMode = { + SCREEN_SPACE: 'screen-space', + WORLD_SPACE: 'world-space' +}; +class ARRenderer extends EventDispatcher { + /** + * Check if world-space mode is active and initial placement is complete + */ + isWorldSpaceReady() { + return this.xrMode === XRMode.WORLD_SPACE && this.worldSpaceInitialPlacementDone; + } + constructor(renderer) { + super(); + this.renderer = renderer; + this.currentSession = null; + this.placementMode = 'floor'; + this.placementBox = null; + this.menuPanel = null; + this.lastTick = null; + this.turntableRotation = null; + this.oldShadowIntensity = null; + this.frame = null; + this.initialHitSource = null; + this.transientHitTestSource = null; + this.inputSource = null; + this._presentedScene = null; + this.resolveCleanup = null; + this.exitWebXRButtonContainer = null; + this.overlay = null; + this.xrLight = null; + this.xrMode = null; + this.xrController1 = null; + this.xrController2 = null; + this.selectedXRController = null; + this.tracking = true; + this.frames = 0; + this.initialized = false; + this.oldTarget = new Vector3(); + this.placementComplete = false; + this.isTranslating = false; + this.isRotating = false; + this.isTwoHandInteraction = false; + this.lastDragPosition = new Vector3(); + this.deltaRotation = new Quaternion(); + this.scaleLine = new Line(lineGeometry); + this.firstRatio = 0; + this.lastAngle = 0; + this.goalPosition = new Vector3(); + this.goalYaw = 0; + this.goalScale = 1; + this.xDamper = new Damper(); + this.yDamper = new Damper(); + this.zDamper = new Damper(); + this.yawDamper = new Damper(); + this.pitchDamper = new Damper(); + this.rollDamper = new Damper(); + this.scaleDamper = new Damper(); + this.wasTwoFingering = false; + // Track if initial automatic placement has been done for world-space mode + this.worldSpaceInitialPlacementDone = false; + // Scale toggle state for world-space mode + this.initialModelScale = 1.0; + this.minScale = 1.0; + this.maxScale = 1.0; + this.onExitWebXRButtonContainerClick = () => this.stopPresenting(); + this.onControllerSelectStart = (event) => { + var _a, _b, _c; + const scene = this.presentedScene; + const controller = event.target; + const menuPanel = this.menuPanel; + const exitIntersect = this.menuPanel.exitButtonControllerIntersection(scene, controller); + if (exitIntersect != null) { + (_a = this.menuPanel) === null || _a === void 0 ? void 0 : _a.dispose(); + this.stopPresenting(); + return; + } + const scaleModeIntersect = this.menuPanel.scaleModeButtonControllerIntersection(scene, controller); + if (scaleModeIntersect != null) { + const goalScale = this.menuPanel.handleScaleToggle(this.worldSpaceInitialPlacementDone, this.initialModelScale, this.minScale, this.maxScale); + if (goalScale !== null) { + this.goalScale = goalScale; + } + return; + } + if (menuPanel) { + menuPanel.show = false; + } + const intersection = this.placementBox.controllerIntersection(scene, controller); + if (intersection != null) { + const bbox = new Box3().setFromObject(scene.pivot); + const footprintY = bbox.min.y + FOOTPRINT__INTERSECT_THRESHOLD; // Small threshold above base + // Check if the ray intersection is near the footprint + const isFootprint = intersection.point.y <= footprintY; + if (isFootprint) { + if (this.selectedXRController != null) { + this.selectedXRController.userData.line.visible = false; + if (scene.canScale && this.isWorldSpaceReady()) { + this.isTwoHandInteraction = true; + this.firstRatio = this.controllerSeparation() / scene.pivot.scale.x; + this.scaleLine.visible = true; + } + } + else { + controller.attach(scene.pivot); + } + this.selectedXRController = controller; + scene.setShadowIntensity(0.01); + } + else { + if (controller == this.xrController1) { + this.xrController1.userData.isSelected = true; + } + else if (controller == this.xrController2) { + this.xrController2.userData.isSelected = true; + } + if (((_b = this.xrController1) === null || _b === void 0 ? void 0 : _b.userData.isSelected) && ((_c = this.xrController2) === null || _c === void 0 ? void 0 : _c.userData.isSelected)) { + if (scene.canScale && this.isWorldSpaceReady()) { + this.isTwoHandInteraction = true; + this.firstRatio = this.controllerSeparation() / scene.pivot.scale.x; + this.scaleLine.visible = true; + } + } + else { + const otherController = controller === this.xrController1 ? this.xrController2 : + this.xrController1; + controller.userData.initialX = controller.position.x; + otherController.userData.turning = false; + controller.userData.turning = true; + controller.userData.line.visible = false; + } + } + } + }; + this.onControllerSelectEnd = (event) => { + const controller = event.target; + controller.userData.turning = false; + controller.userData.line.visible = true; + this.isTwoHandInteraction = false; + this.scaleLine.visible = false; + if (controller == this.xrController1) { + this.xrController1.userData.isSelected = false; + } + else if (controller == this.xrController2) { + this.xrController2.userData.isSelected = false; + } + if (this.selectedXRController != null && + this.selectedXRController != controller) { + return; + } + const scene = this.presentedScene; + // drop on floor + scene.attach(scene.pivot); + this.selectedXRController = null; + this.goalYaw = Math.atan2(scene.pivot.matrix.elements[8], scene.pivot.matrix.elements[10]); + this.goalPosition.x = scene.pivot.position.x; + this.goalPosition.z = scene.pivot.position.z; + // For world-space mode after initial placement, preserve Y position + if (this.isWorldSpaceReady()) { + this.goalPosition.y = scene.pivot.position.y; + } + const menuPanel = this.menuPanel; + menuPanel.show = true; + }; + this.onUpdateScene = () => { + if (this.placementBox != null && this.isPresenting) { + // Update the existing placement box with new model dimensions instead of recreating + this.placementBox.updateFromModelChanges(); + // Ensure screen space mode is maintained + this.placementBox.setScreenSpaceMode(this.xrMode === XRMode.SCREEN_SPACE); + } + if (this.xrMode !== XRMode.SCREEN_SPACE) { + if (this.menuPanel) { + this.menuPanel.dispose(); + this.menuPanel = null; + } + this.menuPanel = new XRMenuPanel(); + this.presentedScene.add(this.menuPanel); + this.menuPanel.updatePosition(this.presentedScene.getCamera(), this.placementBox); + } + }; + this.onSelectStart = (event) => { + const hitSource = this.transientHitTestSource; + if (hitSource == null) { + return; + } + const fingers = this.frame.getHitTestResultsForTransientInput(hitSource); + const scene = this.presentedScene; + const box = this.placementBox; + if (fingers.length === 1) { + this.inputSource = event.inputSource; + const { axes } = this.inputSource.gamepad; + const hitPosition = box.getHit(this.presentedScene, axes[0], axes[1]); + box.show = true; + if (hitPosition != null) { + this.isTranslating = true; + this.lastDragPosition.copy(hitPosition); + } + else if (this.placeOnWall === false) { + this.isRotating = true; + this.lastAngle = axes[0] * ROTATION_RATE; + } + } + else if (fingers.length === 2) { + box.show = true; + this.isTwoHandInteraction = true; + const { separation, angle } = this.fingerPolar(fingers); + this.lastAngle = angle; // Initialize lastAngle, do not update goalYaw + if (this.firstRatio === 0) { + this.firstRatio = separation / scene.pivot.scale.x; + } + if (scene.canScale) { + this.setScale(separation); + } + return; + } + }; + this.onSelectEnd = () => { + this.isTranslating = false; + this.isRotating = false; + this.isTwoHandInteraction = false; + this.inputSource = null; + this.goalPosition.y += + this.placementBox.offsetHeight * this.presentedScene.scale.x; + this.placementBox.show = false; + }; + this.threeRenderer = renderer.threeRenderer; + this.threeRenderer.xr.enabled = true; + } + async resolveARSession() { + assertIsArCandidate(); + const session = await navigator.xr.requestSession('immersive-ar', { + requiredFeatures: [], + optionalFeatures: ['hit-test', 'dom-overlay', 'light-estimation'], + domOverlay: this.overlay ? { root: this.overlay } : undefined + }); + this.threeRenderer.xr.setReferenceSpaceType('local'); + await this.threeRenderer.xr.setSession(session); + this.threeRenderer.xr.cameraAutoUpdate = false; + return session; + } + /** + * The currently presented scene, if any + */ + get presentedScene() { + return this._presentedScene; + } + /** + * Resolves to true if the renderer has detected all the necessary qualities + * to support presentation in AR. + */ + async supportsPresentation() { + try { + assertIsArCandidate(); + return await navigator.xr.isSessionSupported('immersive-ar'); + } + catch (error) { + console.warn('Request to present in WebXR denied:'); + console.warn(error); + console.warn('Falling back to next ar-mode'); + return false; + } + } + /** + * Present a scene in AR + */ + async present(scene, environmentEstimation = false) { + if (this.isPresenting) { + console.warn('Cannot present while a model is already presenting'); + } + let waitForAnimationFrame = new Promise((resolve, _reject) => { + requestAnimationFrame(() => resolve()); + }); + scene.setHotspotsVisibility(false); + scene.queueRender(); + // Render a frame to turn off the hotspots + await waitForAnimationFrame; + // This sets isPresenting to true + this._presentedScene = scene; + this.overlay = scene.element.shadowRoot.querySelector('div.default'); + if (environmentEstimation === true) { + this.xrLight = new XREstimatedLight(this.threeRenderer); + this.xrLight.addEventListener('estimationstart', () => { + if (!this.isPresenting || this.xrLight == null) { + return; + } + const scene = this.presentedScene; + scene.add(this.xrLight); + scene.environment = this.xrLight.environment; + }); + } + const currentSession = await this.resolveARSession(); + currentSession.addEventListener('end', () => { + this.postSessionCleanup(); + }, { once: true }); + const exitButton = scene.element.shadowRoot.querySelector('.slot.exit-webxr-ar-button'); + exitButton.classList.add('enabled'); + exitButton.addEventListener('click', this.onExitWebXRButtonContainerClick); + this.exitWebXRButtonContainer = exitButton; + const viewerRefSpace = await currentSession.requestReferenceSpace('viewer'); + this.xrMode = currentSession.interactionMode; + this.tracking = true; + this.frames = 0; + this.initialized = false; + this.turntableRotation = scene.yaw; + this.goalYaw = scene.yaw; + this.goalScale = 1; + scene.setBackground(null); + this.oldShadowIntensity = scene.shadowIntensity; + scene.setShadowIntensity(0.01); // invisible, but not changing the shader + this.oldTarget.copy(scene.getTarget()); + scene.element.addEventListener('load', this.onUpdateScene); + // Create hit test source for all modes (will be used differently based on mode and state) + let ray; + if (!this.placeOnWall && !this.placeOnCeiling) { + // floor – shoot slightly downward + const r = HIT_ANGLE_DEG * Math.PI / 180; + ray = new XRRay(new DOMPoint(0, 0, 0), { x: 0, y: -Math.sin(r), z: -Math.cos(r) }); + } + else if (this.placeOnWall) { + ray = undefined; + } + else { // ceiling – shoot upward + const r = CEILING_HIT_ANGLE_DEG * Math.PI / 180; + ray = new XRRay(new DOMPoint(0, 0, 0), { x: 0, y: Math.sin(r), z: -Math.cos(r) }); + } + currentSession + .requestHitTestSource({ space: viewerRefSpace, offsetRay: ray }).then(hitTestSource => { + this.initialHitSource = hitTestSource; + }); + if (this.xrMode !== XRMode.SCREEN_SPACE) { + this.setupXRControllers(); + this.xDamper.setDecayTime(DECAY); + this.yDamper.setDecayTime(DECAY); + this.zDamper.setDecayTime(DECAY); + this.yawDamper.setDecayTime(DECAY); + this.pitchDamper.setDecayTime(DECAY); + this.rollDamper.setDecayTime(DECAY); + this.scaleDamper.setDecayTime(DECAY); + } + this.currentSession = currentSession; + this.placementBox = new PlacementBox(scene, this.placeOnWall ? 'back' + : this.placeOnCeiling ? 'top' : 'bottom'); + // Set screen space mode for proper positioning + if (this.placementBox) { + this.placementBox.setScreenSpaceMode(this.xrMode === XRMode.SCREEN_SPACE); + } + this.placementComplete = false; + if (this.xrMode !== XRMode.SCREEN_SPACE) { + this.menuPanel = new XRMenuPanel(); + scene.add(this.menuPanel); + this.menuPanel.updatePosition(scene.getCamera(), this.placementBox); // Position the menu panel + } + this.lastTick = performance.now(); + this.dispatchEvent({ type: 'status', status: ARStatus.SESSION_STARTED }); + } + setupXRControllerLine(xrController) { + if (!xrController.userData.line) { + const line = new Line(lineGeometry); + line.name = 'line'; + line.scale.z = MAX_LINE_LENGTH; + xrController.userData.turning = false; + xrController.userData.line = line; + xrController.add(line); + } + } + setupController(controller) { + this.setupXRControllerLine(controller); + controller.addEventListener('selectstart', this.onControllerSelectStart); + controller.addEventListener('selectend', this.onControllerSelectEnd); + } + setupXRControllers() { + this.xrController1 = this.threeRenderer.xr.getController(0); + this.xrController2 = this.threeRenderer.xr.getController(1); + this.setupController(this.xrController1); + this.setupController(this.xrController2); + this.scaleLine.name = 'scale line'; + this.scaleLine.visible = false; + this.xrController1.add(this.scaleLine); + // Add controllers to the scene + const scene = this.presentedScene; + scene.add(this.xrController1); + scene.add(this.xrController2); + } + hover(xrController) { + // Do not highlight in mobile-ar + if (this.xrMode === XRMode.SCREEN_SPACE || + this.selectedXRController == xrController) { + return false; + } + const scene = this.presentedScene; + const intersection = this.placementBox.controllerIntersection(scene, xrController); + xrController.userData.line.scale.z = + intersection == null ? MAX_LINE_LENGTH : intersection.distance; + return intersection != null; + } + controllerSeparation() { + return this.xrController1.position.distanceTo(this.xrController2.position); + } + /** + * If currently presenting a scene in AR, stops presentation and exits AR. + */ + async stopPresenting() { + if (!this.isPresenting) { + return; + } + const cleanupPromise = new Promise((resolve) => { + this.resolveCleanup = resolve; + }); + try { + await this.currentSession.end(); + await cleanupPromise; + } + catch (error) { + console.warn('Error while trying to end WebXR AR session'); + console.warn(error); + this.postSessionCleanup(); + } + } + /** + * True if a scene is currently in the process of being presented in AR + */ + get isPresenting() { + return this.presentedScene != null; + } + get target() { + return this.oldTarget; + } + get placeOnCeiling() { return this.placementMode === 'ceiling'; } + get placeOnWall() { return this.placementMode === 'wall'; } + updateTarget() { + const scene = this.presentedScene; + if (scene != null) { + const target = scene.getTarget(); + this.oldTarget.copy(target); + if (this.placeOnWall) { + target.z = scene.boundingBox.min.z; + } + else if (this.placeOnCeiling) { + target.y = scene.boundingBox.max.y; // Use ceiling height + } + else { + target.y = scene.boundingBox.min.y; // Floor height + } + scene.setTarget(target.x, target.y, target.z); + } + } + cleanupXRController(xrController) { + xrController.userData.turning = false; + xrController.userData.line.visible = true; + xrController.removeEventListener('selectstart', this.onControllerSelectStart); + xrController.removeEventListener('selectend', this.onControllerSelectEnd); + xrController.removeFromParent(); + } + postSessionCleanup() { + const session = this.currentSession; + if (session != null) { + session.removeEventListener('selectstart', this.onSelectStart); + session.removeEventListener('selectend', this.onSelectEnd); + this.currentSession = null; + } + const scene = this.presentedScene; + this._presentedScene = null; + if (scene != null) { + const { element } = scene; + if (this.xrLight != null) { + scene.remove(this.xrLight); + this.xrLight.dispose(); + this.xrLight = null; + } + if (this.menuPanel != null) { + this.menuPanel.dispose(); + this.menuPanel = null; + } + scene.add(scene.pivot); + scene.pivot.quaternion.set(0, 0, 0, 1); + scene.pivot.position.set(0, 0, 0); + scene.pivot.scale.set(1, 1, 1); + scene.setShadowOffset(0); + const yaw = this.turntableRotation; + if (yaw != null) { + scene.yaw = yaw; + } + const intensity = this.oldShadowIntensity; + if (intensity != null) { + scene.setShadowIntensity(intensity); + } + scene.setEnvironmentAndSkybox(element[$currentEnvironmentMap], element[$currentBackground]); + const point = this.oldTarget; + scene.setTarget(point.x, point.y, point.z); + scene.xrCamera = null; + scene.element.removeEventListener('load', this.onUpdateScene); + scene.orientHotspots(0); + const { width, height } = element.getBoundingClientRect(); + scene.setSize(width, height); + requestAnimationFrame(() => { + scene.element.dispatchEvent(new CustomEvent('camera-change', { detail: { source: ChangeSource.NONE } })); + }); + } + // Force the Renderer to update its size + this.renderer.height = 0; + const exitButton = this.exitWebXRButtonContainer; + if (exitButton != null) { + exitButton.classList.remove('enabled'); + exitButton.removeEventListener('click', this.onExitWebXRButtonContainerClick); + this.exitWebXRButtonContainer = null; + } + const hitSource = this.transientHitTestSource; + if (hitSource != null) { + hitSource.cancel(); + this.transientHitTestSource = null; + } + const hitSourceInitial = this.initialHitSource; + if (hitSourceInitial != null) { + hitSourceInitial.cancel(); + this.initialHitSource = null; + } + if (this.placementBox != null) { + this.placementBox.dispose(); + this.placementBox = null; + } + if (this.xrMode !== XRMode.SCREEN_SPACE) { + if (this.xrController1 != null) { + this.cleanupXRController(this.xrController1); + this.xrController1 = null; + } + if (this.xrController2 != null) { + this.cleanupXRController(this.xrController2); + this.xrController2 = null; + } + this.selectedXRController = null; + this.scaleLine.visible = false; + } + this.isTranslating = false; + this.isRotating = false; + this.isTwoHandInteraction = false; + this.lastTick = null; + this.turntableRotation = null; + this.oldShadowIntensity = null; + this.frame = null; + this.inputSource = null; + this.overlay = null; + this.worldSpaceInitialPlacementDone = false; + if (this.resolveCleanup != null) { + this.resolveCleanup(); + } + this.dispatchEvent({ type: 'status', status: ARStatus.NOT_PRESENTING }); + } + updateView(view) { + const scene = this.presentedScene; + const xr = this.threeRenderer.xr; + xr.updateCamera(camera); + scene.xrCamera = xr.getCamera(); + const { elements } = scene.getCamera().matrixWorld; + scene.orientHotspots(Math.atan2(elements[1], elements[5])); + if (!this.initialized) { + this.placeInitially(); + this.initialized = true; + } + // Use automatic dynamic viewport scaling if supported. + if (view.requestViewportScale && view.recommendedViewportScale) { + const scale = view.recommendedViewportScale; + view.requestViewportScale(Math.max(scale, MIN_VIEWPORT_SCALE)); + } + const layer = xr.getBaseLayer(); + if (layer != null) { + const viewport = layer instanceof XRWebGLLayer ? + layer.getViewport(view) : + xr.getBinding().getViewSubImage(layer, view).viewport; + this.threeRenderer.setViewport(viewport.x, viewport.y, viewport.width, viewport.height); + } + } + placeInitially() { + const scene = this.presentedScene; + const { pivot, element } = scene; + const { position } = pivot; + const xrCamera = scene.getCamera(); + const { width, height } = this.overlay.getBoundingClientRect(); + scene.setSize(width, height); + xrCamera.projectionMatrixInverse.copy(xrCamera.projectionMatrix).invert(); + const { theta } = element + .getCameraOrbit(); + // Orient model to match the 3D camera view + const cameraDirection = xrCamera.getWorldDirection(vector3$1); + scene.yaw = Math.atan2(-cameraDirection.x, -cameraDirection.z) - theta; + this.goalYaw = scene.yaw; + if (this.placeOnCeiling && !this.isViewPointingUp()) { + scene.visible = false; // Hide until properly oriented + scene.setHotspotsVisibility(true); // Still show UI + // Set up touch interaction for screen-space mode + if (this.xrMode === XRMode.SCREEN_SPACE) { + const { session } = this.frame; + session.addEventListener('selectstart', this.onSelectStart); + session.addEventListener('selectend', this.onSelectEnd); + session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' }) + .then(hitTestSource => { this.transientHitTestSource = hitTestSource; }); + } + return; // Exit early - don't place yet + } + // Use different placement logic for world-space vs screen-space + if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone) { + // Use automatic optimal placement for world-space AR only on first session + const { position: optimalPosition, scale: optimalScale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera); + this.goalPosition.copy(optimalPosition); + this.goalScale = optimalScale; + // Store the initial scale for toggle functionality + this.initialModelScale = optimalScale; + // Set initial position and scale immediately for world-space + position.copy(optimalPosition); + pivot.scale.set(optimalScale, optimalScale, optimalScale); + // Mark that initial placement is done + this.worldSpaceInitialPlacementDone = true; + // Calculate scale limits for world-space mode (SVXR logic) + this.calculateWorldSpaceScaleLimits(scene); + // Enable user interaction after initial placement + this.enableWorldSpaceUserInteraction(); + } + else if (this.xrMode === XRMode.SCREEN_SPACE) { + // Use original placement logic for screen-space AR + const radius = Math.max(1, 2 * scene.boundingSphere.radius); + position.copy(xrCamera.position) + .add(cameraDirection.multiplyScalar(radius)); + this.updateTarget(); + const target = scene.getTarget(); + position.add(target).sub(this.oldTarget); + this.goalPosition.copy(position); + } + scene.setHotspotsVisibility(true); + scene.visible = true; // Model is properly oriented, show it + if (this.xrMode === XRMode.SCREEN_SPACE) { + const { session } = this.frame; + session.addEventListener('selectstart', this.onSelectStart); + session.addEventListener('selectend', this.onSelectEnd); + session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' }) + .then(hitTestSource => { this.transientHitTestSource = hitTestSource; }); + } + } + checkForDeferredCeilingPlacement() { + // Check on every frame—both XR modes, only when ceiling is the target and the model is hidden + if (!this.placeOnCeiling || !this.presentedScene || this.presentedScene.visible) + return; + const isWorldSpaceDeferred = this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone; + const isScreenSpaceDeferred = this.xrMode === XRMode.SCREEN_SPACE; + if (isWorldSpaceDeferred || isScreenSpaceDeferred) { + if (this.isViewPointingUp()) { + this.performDeferredPlacement(); + } + } + } + performDeferredPlacement() { + const scene = this.presentedScene; + if (this.xrMode === XRMode.WORLD_SPACE) { + const xrCamera = scene.getCamera(); + const { position, scale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera); + this.goalPosition.copy(position); + this.goalScale = scale; + this.initialModelScale = scale; + scene.pivot.position.copy(position); + scene.pivot.scale.set(scale, scale, scale); + this.worldSpaceInitialPlacementDone = true; + this.calculateWorldSpaceScaleLimits(scene); + this.enableWorldSpaceUserInteraction(); + } + else { // SCREEN_SPACE + const xrCamera = scene.getCamera(); + const cameraDirection = xrCamera.getWorldDirection(new Vector3()); + const radius = Math.max(1, 2 * scene.boundingSphere.radius); + scene.pivot.position.copy(xrCamera.position).add(cameraDirection.multiplyScalar(radius)); + this.updateTarget(); + const target = scene.getTarget(); + scene.pivot.position.add(target).sub(this.oldTarget); + this.goalPosition.copy(scene.pivot.position); + // Setup touch interaction if needed + const { session } = this.frame; + session.addEventListener('selectstart', this.onSelectStart); + session.addEventListener('selectend', this.onSelectEnd); + session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' }) + .then(hitTestSource => { this.transientHitTestSource = hitTestSource; }); + } + scene.visible = true; + scene.setHotspotsVisibility(true); + this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED }); + } + getTouchLocation() { + const { axes } = this.inputSource.gamepad; + let location = this.placementBox.getExpandedHit(this.presentedScene, axes[0], axes[1]); + if (location != null) { + vector3$1.copy(location).sub(this.presentedScene.getCamera().position); + if (vector3$1.length() > MAX_DISTANCE) + return null; + } + return location; + } + getHitPoint(hitResult) { + const refSpace = this.threeRenderer.xr.getReferenceSpace(); + const pose = hitResult.getPose(refSpace); + if (pose == null) { + return null; + } + const hitMatrix = matrix4.fromArray(pose.transform.matrix); + if (this.placeOnWall === true) { + // Orient the model to the wall's normal vector. + this.goalYaw = Math.atan2(hitMatrix.elements[4], hitMatrix.elements[6]); + } + // Check that the y-coordinate of the normal is large enough that the normal + // is pointing up for floor placement; opposite for wall placement. + const normalY = hitMatrix.elements[5]; + if (this.placeOnWall) { + // wall: reject if normal points down/up too much + return normalY < -0.75 ? null : hitPosition.setFromMatrixPosition(hitMatrix); + } + if (this.placeOnCeiling) { + // ceiling: accept only downward-facing planes + return normalY < -0.5 + ? hitPosition.setFromMatrixPosition(hitMatrix) + : null; + } + // floor: accept only upward-facing planes + return normalY > 0.75 ? hitPosition.setFromMatrixPosition(hitMatrix) : null; + } + /** + * Hit-test the environment once per frame until a suitable surface is found, + * then lock the model to that anchor. + * – Floor: accept upward-facing planes and “drop” the model down. + * – Wall: accept vertical planes; keep full XYZ. + * – Ceiling: accept downward-facing planes; keep full XYZ and hide model + * until a ceiling hit arrives (no premature floor placement). + */ + moveToAnchor(frame) { + // Handle deferred initial placement for ceiling mode + if (this.placeOnCeiling && + this.xrMode === XRMode.WORLD_SPACE && + !this.worldSpaceInitialPlacementDone && + !this.presentedScene.visible) { + // Check if orientation is now sufficient + if (!this.isViewPointingUp()) { + console.log('[ARR/moveToAnchor] Still waiting for proper ceiling orientation'); + return; + } + // Orientation is good - complete the deferred world-space placement + const scene = this.presentedScene; + const xrCamera = scene.getCamera(); + const { position: optimalPosition, scale: optimalScale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera); + this.goalPosition.copy(optimalPosition); + this.goalScale = optimalScale; + this.initialModelScale = optimalScale; + scene.pivot.position.copy(optimalPosition); + scene.pivot.scale.set(optimalScale, optimalScale, optimalScale); + this.worldSpaceInitialPlacementDone = true; + this.calculateWorldSpaceScaleLimits(scene); + this.enableWorldSpaceUserInteraction(); + scene.visible = true; + this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED }); + return; + } + // Skip for world-space mode after initial placement (unless ceiling was deferred) + if (this.xrMode === XRMode.WORLD_SPACE && this.worldSpaceInitialPlacementDone) { + this.placementBox.show = false; + this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED }); + return; + } + } + isViewPointingUp(thresholdDeg = CEILING_ORIENTATION_THRESHOLD) { + const cam = this.presentedScene.getCamera(); + // Handle ArrayCamera (common in XR) + const realCam = cam.isArrayCamera && Array.isArray(cam.cameras) + ? cam.cameras[0] // Use first sub-camera + : cam; + if (!realCam || typeof realCam.updateMatrixWorld !== 'function') { + return false; + } + // Update camera matrix to get current world orientation + realCam.updateMatrixWorld(true); + const elements = realCam.matrixWorld.elements; + // Get forward direction from camera matrix (-Z column) + const forwardY = -elements[9]; // Y component of forward vector + const minY = Math.sin(thresholdDeg * Math.PI / 180); + return forwardY >= minY; + } + fingerPolar(fingers) { + const fingerOne = fingers[0].inputSource.gamepad.axes; + const fingerTwo = fingers[1].inputSource.gamepad.axes; + const deltaX = fingerTwo[0] - fingerOne[0]; + const deltaY = fingerTwo[1] - fingerOne[1]; + const angle = Math.atan2(deltaY, deltaX); + let deltaYaw = this.lastAngle - angle; + if (deltaYaw > Math.PI) { + deltaYaw -= 2 * Math.PI; + } + else if (deltaYaw < -Math.PI) { + deltaYaw += 2 * Math.PI; + } + return { + separation: Math.sqrt(deltaX * deltaX + deltaY * deltaY), + deltaYaw: deltaYaw, + angle: angle + }; + } + setScale(separation) { + let scale = separation / this.firstRatio; + scale = (Math.abs(scale - 1) < SCALE_SNAP) ? 1 : scale; + // Clamp to min/max for world-space mode after initial placement + if (this.isWorldSpaceReady()) { + scale = Math.max(this.minScale, Math.min(this.maxScale, scale)); + } + this.goalScale = scale; + } + processInput(frame) { + const hitSource = this.transientHitTestSource; + if (hitSource == null) { + return; + } + const fingers = frame.getHitTestResultsForTransientInput(hitSource); + const scene = this.presentedScene; + const scale = scene.pivot.scale.x; + // Robust two-finger gesture handling + if (fingers.length === 2) { + if (!this.wasTwoFingering) { + // New two-finger gesture starting + const { separation, angle } = this.fingerPolar(fingers); + this.firstRatio = separation / scale; + this.lastAngle = angle; + this.wasTwoFingering = true; + this.isTwoHandInteraction = true; + // Do not apply rotation or scale on this frame + return; + } + // Ongoing two-finger gesture + const { separation, deltaYaw, angle } = this.fingerPolar(fingers); + this.goalYaw += deltaYaw; + this.lastAngle = angle; + if (scene.canScale) { + this.setScale(separation); + } + this.isTwoHandInteraction = true; + return; + } + else { + if (this.wasTwoFingering) { + // Two-finger gesture ended + this.wasTwoFingering = false; + this.isTwoHandInteraction = false; + this.firstRatio = 0; + } + } + if (!this.isTranslating && !this.isTwoHandInteraction && !this.isRotating) { + return; + } + // Handle single finger interactions + if (this.isRotating) { + const angle = this.inputSource.gamepad.axes[0] * ROTATION_RATE; + this.goalYaw += angle - this.lastAngle; + this.lastAngle = angle; + } + else if (this.isTranslating) { + fingers.forEach(finger => { + if (finger.inputSource !== this.inputSource) { + return; + } + let hit = null; + if (finger.results.length > 0) { + hit = this.getHitPoint(finger.results[0]); + } + if (hit == null) { + hit = this.getTouchLocation(); + } + if (hit == null) { + return; + } + this.goalPosition.sub(this.lastDragPosition); + // For world-space mode after initial placement, allow full Y-axis control + if (this.isWorldSpaceReady()) { + // Use the hit point directly without floor constraints + console.log('[processInput] Setting goalPosition.y to hit.y:', hit.y); + this.goalPosition.add(hit); + } + else if (this.placeOnWall === false) { + // Original logic for screen-space or initial world-space placement + const offset = hit.y - this.lastDragPosition.y; + // When a lower floor is found, keep the model at the same height, but + // drop the placement box to the floor. The model falls on select end. + if (offset < 0) { + this.placementBox.offsetHeight = offset / scale; + this.presentedScene.setShadowOffset(offset); + // Interpolate hit ray up to drag plane + const cameraPosition = vector3$1.copy(scene.getCamera().position); + const alpha = -offset / (cameraPosition.y - hit.y); + cameraPosition.multiplyScalar(alpha); + hit.multiplyScalar(1 - alpha).add(cameraPosition); + } + this.goalPosition.add(hit); + } + else { + this.goalPosition.add(hit); + } + this.lastDragPosition.copy(hit); + }); + } + } + applyXRControllerRotation(controller, pivot) { + if (!controller.userData.turning) { + return; + } + const angle = (controller.position.x - controller.userData.initialX) * ROTATION_SENSIVITY; + this.deltaRotation.setFromAxisAngle(AXIS_Y, angle); + pivot.quaternion.multiplyQuaternions(this.deltaRotation, pivot.quaternion); + } + handleScalingInXR(scene, delta) { + // Allow manual scaling for world-space mode after initial placement + if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone) { + return; + } + if (this.xrController1 && this.xrController2 && this.isTwoHandInteraction) { + const dist = this.controllerSeparation(); + this.setScale(dist); + this.scaleLine.scale.z = -dist; + this.scaleLine.lookAt(this.xrController2.position); + } + const oldScale = scene.pivot.scale.x; + if (this.goalScale !== oldScale) { + const newScale = this.scaleDamper.update(oldScale, this.goalScale, delta, 1); + scene.pivot.scale.set(newScale, newScale, newScale); + } + } + updatePivotPosition(scene, delta) { + const { pivot } = scene; + const box = this.placementBox; + const boundingRadius = scene.boundingSphere.radius; + const goal = this.goalPosition; + const position = pivot.position; + let source = ChangeSource.NONE; + if (!goal.equals(position)) { + source = ChangeSource.USER_INTERACTION; + let { x, y, z } = position; + x = this.xDamper.update(x, goal.x, delta, boundingRadius); + y = this.yDamper.update(y, goal.y, delta, boundingRadius); + z = this.zDamper.update(z, goal.z, delta, boundingRadius); + position.set(x, y, z); + if (this.xrMode === XRMode.SCREEN_SPACE && !this.isTranslating) { + const offset = goal.y - y; + if (this.placementComplete && this.placeOnWall === false) { + box.offsetHeight = offset / scene.pivot.scale.x; + scene.setShadowOffset(offset); + } + else if (offset === 0) { + this.placementComplete = true; + box.show = false; + scene.setShadowIntensity(AR_SHADOW_INTENSITY); + } + } + if (this.xrMode !== XRMode.SCREEN_SPACE && goal.equals(position)) { + scene.setShadowIntensity(AR_SHADOW_INTENSITY); + } + // For world-space mode after initial placement, don't constrain Y position + if (this.isWorldSpaceReady()) { + // Allow full Y-axis movement without floor constraints + scene.setShadowIntensity(AR_SHADOW_INTENSITY); + } + } + // Handle automatic scaling for world-space mode only during initial placement + if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone && this.goalScale !== pivot.scale.x) { + const newScale = this.scaleDamper.update(pivot.scale.x, this.goalScale, delta, 1); + pivot.scale.set(newScale, newScale, newScale); + } + scene.updateTarget(delta); + // Return the source so the caller can use it for camera-change events + return source; + } + updateYaw(scene, delta) { + // yaw must be updated last, since this also updates the shadow position. + quaternion.setFromAxisAngle(vector3$1.set(0, 1, 0), this.goalYaw); + const angle = scene.pivot.quaternion.angleTo(quaternion); + const angleStep = angle - this.yawDamper.update(angle, 0, delta, Math.PI); + scene.pivot.quaternion.rotateTowards(quaternion, angleStep); + } + updateMenuPanel(scene, box, delta) { + if (this.menuPanel) { + this.menuPanel.updateOpacity(delta); + this.menuPanel.updatePosition(scene.getCamera(), box); + } + } + applyXRInputToScene(delta) { + const scene = this.presentedScene; + const pivot = scene.pivot; + const box = this.placementBox; + this.updatePlacementBoxOpacity(box, delta); + this.updateTwoHandInteractionState(); + this.applyXRControllerRotations(pivot); + this.handleScalingInXR(scene, delta); + if (pivot.parent !== scene) { + // attached to controller instead + // when moving the model, the menu panel should disapear + this.updateMenuPanel(scene, box, delta); + return; + } + const source = this.updatePivotPosition(scene, delta); + this.updateYaw(scene, delta); + this.dispatchCameraChangeEvent(scene, source); + this.updateMenuPanel(scene, box, delta); + } + updatePlacementBoxOpacity(box, delta) { + // Use the new enhanced update method that includes distance scaling and visual state + const camera = this.presentedScene.getCamera(); + box.update(delta, camera.position); + // Update interaction state based on hover + const over1 = this.hover(this.xrController1); + const over2 = this.hover(this.xrController2); + const isHovered = (over1 || over2) && !this.isTwoHandInteraction; + // Set interaction state for visual feedback + box.setInteractionState(this.isTranslating || this.isRotating, isHovered); + } + updateTwoHandInteractionState() { + var _a, _b; + const bothSelected = ((_a = this.xrController1) === null || _a === void 0 ? void 0 : _a.userData.isSelected) && ((_b = this.xrController2) === null || _b === void 0 ? void 0 : _b.userData.isSelected); + this.isTwoHandInteraction = !!bothSelected; + } + applyXRControllerRotations(pivot) { + if (!this.isTwoHandInteraction) { + if (this.xrController1) + this.applyXRControllerRotation(this.xrController1, pivot); + if (this.xrController2) + this.applyXRControllerRotation(this.xrController2, pivot); + } + } + dispatchCameraChangeEvent(scene, source) { + scene.element.dispatchEvent(new CustomEvent('camera-change', { detail: { source } })); + } + updateXRControllerHover() { + const over1 = this.hover(this.xrController1); + const over2 = this.hover(this.xrController2); + const isHovered = (over1 || over2) && !this.isTwoHandInteraction; + // Use the new interaction state system + if (this.placementBox) { + this.placementBox.setInteractionState(this.isTranslating || this.isRotating, isHovered); + this.placementBox.show = isHovered; + } + } + /** + * Enable user interaction for world-space mode after initial automatic placement + */ + enableWorldSpaceUserInteraction() { + // Show placement box to indicate model can be moved + if (this.placementBox) { + this.placementBox.show = true; + } + // Enable shadow to show model is placed + if (this.presentedScene) { + this.presentedScene.setShadowIntensity(AR_SHADOW_INTENSITY); + } + } + handleFirstView(frame, time) { + // Skip moveToFloor for world-space mode after initial placement to prevent overriding + if (this.xrMode !== XRMode.WORLD_SPACE || !this.worldSpaceInitialPlacementDone) { + this.moveToAnchor(frame); + } + this.processInput(frame); + const delta = time - this.lastTick; + this.applyXRInputToScene(delta); + this.renderer.preRender(this.presentedScene, time, delta); + this.lastTick = time; + this.presentedScene.renderShadow(this.threeRenderer); + } + /** + * Only public to make it testable. + */ + onWebXRFrame(time, frame) { + if (this.xrMode !== XRMode.SCREEN_SPACE) { + this.updateXRControllerHover(); + } + this.frame = frame; + // increamenets a counter tracking how many frames have been processed sinces the session started + ++this.frames; + // refSpace and pose are used to get the user's current position and orientation in the XR session. + const refSpace = this.threeRenderer.xr.getReferenceSpace(); + const pose = frame.getViewerPose(refSpace); + // Tracking loss Detection. + // If pos is null, it means the XR system cannot currently track the user's position(e.g., the camera is covered or the env can't be recognized). + // Checks if we previously throught tracking was working + // Ensures that we don't report tracking loss too early(sometimes the first few frames can be null as the system initializes). + if (pose == null && this.tracking === true && this.frames > INIT_FRAMES) { + this.tracking = false; + this.dispatchEvent({ type: 'tracking', status: ARTracking.NOT_TRACKING }); + } + // Prevent rendering if there's no valid pose, no scene, or the scene isen't loaded. + const scene = this.presentedScene; + if (pose == null || scene == null || !scene.element.loaded) { + this.threeRenderer.clear(); + return; + } + // Tracking REcovery Detection. + // If tracking was previously lost, but now we have a valid pose, it meanse tracking has been recovered. + if (this.tracking === false) { + this.tracking = true; + this.dispatchEvent({ type: 'tracking', status: ARTracking.TRACKING }); + } + // WebXR may return multiple views, i.e. for headset AR. This + // isn't really supported at this point, but make a best-effort + // attempt to render other views also, using the first view + // as the main viewpoint. + let isFirstView = true; + for (const view of pose.views) { + this.updateView(view); + if (isFirstView) { + this.checkForDeferredCeilingPlacement(); + this.handleFirstView(frame, time); + isFirstView = false; + } + this.threeRenderer.render(scene, scene.getCamera()); + } + } + /** + * Calculate optimal scale and position for world-space AR presentation + * Similar to the SVXR:FrameModel approach for consistent model presentation + * + * This method implements automatic model framing for world-space AR sessions: + * 1. Calculates optimal viewing distance based on model size and minimum distance + * 2. Positions model at a drop angle below camera center for natural viewing + * 3. Automatically scales model to fit within viewport constraints + * 4. Ensures consistent presentation across different model sizes + * + * Note: This automatic placement only happens on the first session start. + * After initial placement, users have full control over model position, rotation, and scale. + */ + calculateWorldSpaceOptimalPlacement(scene, camera) { + // Get model bounding box half extents + const boundingBox = scene.boundingBox; + const halfExtent = { + x: (boundingBox.max.x - boundingBox.min.x) / 2, + y: (boundingBox.max.y - boundingBox.min.y) / 2, + z: (boundingBox.max.z - boundingBox.min.z) / 2 + }; + // Compute view distance (with extra padding for model-viewer) + const placementBoxPadding = PLACEMENT_BOX_EXTRA_PADDING; + const viewDistance = Math.max(MIN_WORLD_SPACE_DISTANCE + placementBoxPadding, 2 * Math.max(halfExtent.x, halfExtent.z) + placementBoxPadding); + // Compute ideal view position (drop angle below camera center) + const dropAngleRad = VIEW_DROP_DEGREES * Math.PI / 180; + const idealViewPosition = new Vector3(0, -viewDistance * Math.sin(dropAngleRad), -viewDistance * Math.cos(dropAngleRad)); + // Transform ideal view position to world space + const worldFromCamera = camera.matrixWorld; + const idealWorldPosition = idealViewPosition.clone().applyMatrix4(worldFromCamera); + // Compute turntable and vertical radii + const turntableRadius = Math.max(halfExtent.x, halfExtent.z) + placementBoxPadding; + const verticalRadius = halfExtent.y; + const turntableRadiusLimit = viewDistance * VIEW_RATIO; + const verticalRadiusLimit = viewDistance * VIEW_RATIO; + // Compute optimal scale + const verticalScale = verticalRadiusLimit / Math.max(verticalRadius, MIN_MODEL_SIZE); + const turntableScale = turntableRadiusLimit / Math.max(turntableRadius, MIN_MODEL_SIZE); + const optimalScale = Math.min(verticalScale, turntableScale); + // Offset so the model's base sits at the ideal world position + // (subtract scaled half height in Y) + const finalPosition = idealWorldPosition.clone().sub(new Vector3(0, optimalScale * halfExtent.y, 0)); + return { + position: finalPosition, + scale: optimalScale + }; + } + /** + * Calculate min/max scale for world-space AR, SVXR-style + */ + calculateWorldSpaceScaleLimits(scene) { + const size = scene.size; + const largestDimension = Math.max(size.x, size.y, size.z); + const smallestDimension = Math.max(Math.min(size.x, size.y, size.z), MODEL_SIZE_EPSILON); + const scaleMin = MIN_MODEL_SIZE / Math.max(largestDimension, MODEL_SIZE_EPSILON); + const scaleMax = MAX_MODEL_SIZE / Math.max(smallestDimension, MODEL_SIZE_EPSILON); + // Clamp to initial scale if needed + this.minScale = Math.min(scaleMin, scaleMax, this.goalScale); + this.maxScale = Math.max(scaleMin, scaleMax, this.goalScale); + } +} + +function clone( source ) { + + const sourceLookup = new Map(); + const cloneLookup = new Map(); + + const clone = source.clone(); + + parallelTraverse( source, clone, function ( sourceNode, clonedNode ) { + + sourceLookup.set( clonedNode, sourceNode ); + cloneLookup.set( sourceNode, clonedNode ); + + } ); + + clone.traverse( function ( node ) { + + if ( ! node.isSkinnedMesh ) return; + + const clonedMesh = node; + const sourceMesh = sourceLookup.get( node ); + const sourceBones = sourceMesh.skeleton.bones; + + clonedMesh.skeleton = sourceMesh.skeleton.clone(); + clonedMesh.bindMatrix.copy( sourceMesh.bindMatrix ); + + clonedMesh.skeleton.bones = sourceBones.map( function ( bone ) { + + return cloneLookup.get( bone ); + + } ); + + clonedMesh.bind( clonedMesh.skeleton, clonedMesh.bindMatrix ); + + } ); + + return clone; + +} + +function parallelTraverse( a, b, callback ) { + + callback( a, b ); + + for ( let i = 0; i < a.children.length; i ++ ) { + + parallelTraverse( a.children[ i ], b.children[ i ], callback ); + + } + +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $prepared = Symbol('prepared'); +const $prepare = Symbol('prepare'); +const $preparedGLTF = Symbol('preparedGLTF'); +const $clone = Symbol('clone'); +/** + * Represents the preparation and enhancement of the output of a Three.js + * GLTFLoader (a Three.js-flavor "GLTF"), to make it suitable for optimal, + * correct viewing in a given presentation context and also make the cloning + * process more explicit and legible. + * + * A GLTFInstance is API-compatible with a Three.js-flavor "GLTF", so it should + * be considered to be interchangeable with the loaded result of a GLTFLoader. + * + * This basic implementation only implements trivial preparation and enhancement + * of a GLTF. These operations are intended to be enhanced by inheriting + * classes. + */ +class GLTFInstance { + /** + * Prepares a given GLTF for presentation and future cloning. A GLTF that is + * prepared can safely have this method invoked on it multiple times; it will + * only be prepared once, including after being cloned. + */ + static prepare(source) { + if (source.scene == null) { + throw new Error('Model does not have a scene'); + } + if (source[$prepared]) { + return source; + } + const prepared = this[$prepare](source); + // NOTE: ES5 Symbol polyfill is not compatible with spread operator + // so {...prepared, [$prepared]: true} does not work + prepared[$prepared] = true; + return prepared; + } + /** + * Override in an inheriting class to apply specialty one-time preparations + * for a given input GLTF. + */ + static [$prepare](source) { + // TODO(#195,#1003): We don't currently support multiple scenes, so we don't + // bother preparing extra scenes for now: + const { scene } = source; + const scenes = [scene]; + return Object.assign(Object.assign({}, source), { scene, scenes }); + } + get parser() { + return this[$preparedGLTF].parser; + } + get animations() { + return this[$preparedGLTF].animations; + } + get scene() { + return this[$preparedGLTF].scene; + } + get scenes() { + return this[$preparedGLTF].scenes; + } + get cameras() { + return this[$preparedGLTF].cameras; + } + get asset() { + return this[$preparedGLTF].asset; + } + get userData() { + return this[$preparedGLTF].userData; + } + constructor(preparedGLTF) { + this[$preparedGLTF] = preparedGLTF; + } + /** + * Creates and returns a copy of this instance. + */ + clone() { + const GLTFInstanceConstructor = this.constructor; + const clonedGLTF = this[$clone](); + return new GLTFInstanceConstructor(clonedGLTF); + } + /** + * Cleans up any retained memory that might not otherwise be released when + * this instance is done being used. + */ + dispose() { + this.scenes.forEach((scene) => { + scene.traverse((object) => { + const mesh = object; + if (!mesh.material) { + return; + } + const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material]; + materials.forEach(material => { + // Explicitly dispose any textures assigned to this material + for (const propertyName in material) { + const texture = material[propertyName]; + if (texture instanceof Texture$1) { + const image = texture.source.data; + if (image.close != null) { + image.close(); + } + texture.dispose(); + } + } + material.dispose(); + }); + mesh.geometry.dispose(); + }); + }); + } + /** + * Override in an inheriting class to implement specialized cloning strategies + */ + [$clone]() { + const source = this[$preparedGLTF]; + // TODO(#195,#1003): We don't currently support multiple scenes, so we don't + // bother cloning extra scenes for now: + const scene = clone(this.scene); + cloneVariantMaterials(scene, this.scene); + const scenes = [scene]; + const userData = source.userData ? Object.assign({}, source.userData) : {}; + return Object.assign(Object.assign({}, source), { scene, scenes, userData }); + } +} +// Variant materials and original material instances are stored under +// object.userData.variantMaterials/originalMaterial. +// Three.js Object3D.clone() doesn't clone Three.js objects under +// .userData so this function is a workaround. +const cloneVariantMaterials = (dst, src) => { + traversePair(dst, src, (dst, src) => { + if (src.userData.variantMaterials !== undefined) { + dst.userData.variantMaterials = new Map(src.userData.variantMaterials); + } + if (src.userData.variantData !== undefined) { + dst.userData.variantData = src.userData.variantData; + } + if (src.userData.originalMaterial !== undefined) { + dst.userData.originalMaterial = src.userData.originalMaterial; + } + }); +}; +const traversePair = (obj1, obj2, callback) => { + callback(obj1, obj2); + // Assume obj1 and obj2 have the same tree structure + for (let i = 0; i < obj1.children.length; i++) { + traversePair(obj1.children[i], obj2.children[i], callback); + } +}; + +const $threeGLTF = Symbol('threeGLTF'); +const $gltf = Symbol('gltf'); +const $gltfElementMap = Symbol('gltfElementMap'); +const $threeObjectMap = Symbol('threeObjectMap'); +const $parallelTraverseThreeScene = Symbol('parallelTraverseThreeScene'); +const $correlateOriginalThreeGLTF = Symbol('correlateOriginalThreeGLTF'); +const $correlateCloneThreeGLTF = Symbol('correlateCloneThreeGLTF'); +/** + * The Three.js GLTFLoader provides us with an in-memory representation + * of a glTF in terms of Three.js constructs. It also provides us with a copy + * of the deserialized glTF without any Three.js decoration, and a mapping of + * glTF elements to their corresponding Three.js constructs. + * + * A CorrelatedSceneGraph exposes a synchronously available mapping of glTF + * element references to their corresponding Three.js constructs. + */ +class CorrelatedSceneGraph { + /** + * Produce a CorrelatedSceneGraph from a naturally generated Three.js GLTF. + * Such GLTFs are produced by Three.js' GLTFLoader, and contain cached + * details that expedite the correlation step. + * + * If a CorrelatedSceneGraph is provided as the second argument, re-correlates + * a cloned Three.js GLTF with a clone of the glTF hierarchy used to produce + * the upstream Three.js GLTF that the clone was created from. The result + * CorrelatedSceneGraph is representative of the cloned hierarchy. + */ + static from(threeGLTF, upstreamCorrelatedSceneGraph) { + if (upstreamCorrelatedSceneGraph != null) { + return this[$correlateCloneThreeGLTF](threeGLTF, upstreamCorrelatedSceneGraph); + } + else { + return this[$correlateOriginalThreeGLTF](threeGLTF); + } + } + static [$correlateOriginalThreeGLTF](threeGLTF) { + const gltf = threeGLTF.parser.json; + const associations = threeGLTF.parser.associations; + const gltfElementMap = new Map(); + const defaultMaterial = { name: 'Default' }; + const defaultReference = { index: -1 }; + for (const threeMaterial of associations.keys()) { + // Note: GLTFLoader creates a "default" material that has no + // corresponding glTF element in the case that no materials are + // specified in the source glTF. In this case we append a default + // material to allow this to be operated upon. + if (threeMaterial instanceof Material$1 && + associations.get(threeMaterial) == null) { + if (defaultReference.index < 0) { + if (gltf.materials == null) { + gltf.materials = []; + } + defaultReference.index = gltf.materials.length; + gltf.materials.push(defaultMaterial); + } + threeMaterial.name = defaultMaterial.name; + associations.set(threeMaterial, { materials: defaultReference.index }); + } + } + // Creates a reverse look up map (gltf-object to Three-object) + for (const [threeObject, gltfMappings] of associations) { + if (gltfMappings) { + threeObject.userData = threeObject.userData || {}; + threeObject.userData.associations = gltfMappings; + } + for (const mapping in gltfMappings) { + if (mapping != null && mapping !== 'primitives') { + const type = mapping; + const elementArray = gltf[type] || []; + const gltfElement = elementArray[gltfMappings[type]]; + if (gltfElement == null) { + // TODO: Maybe throw here... + continue; + } + let threeObjects = gltfElementMap.get(gltfElement); + if (threeObjects == null) { + threeObjects = new Set(); + gltfElementMap.set(gltfElement, threeObjects); + } + threeObjects.add(threeObject); + } + } + } + return new CorrelatedSceneGraph(threeGLTF, gltf, associations, gltfElementMap); + } + /** + * Transfers the association between a raw glTF and a Three.js scene graph + * to a clone of the Three.js scene graph, resolved as a new + * CorrelatedSceneGraph instance. + */ + static [$correlateCloneThreeGLTF](cloneThreeGLTF, upstreamCorrelatedSceneGraph) { + const originalThreeGLTF = upstreamCorrelatedSceneGraph.threeGLTF; + const originalGLTF = upstreamCorrelatedSceneGraph.gltf; + const cloneGLTF = JSON.parse(JSON.stringify(originalGLTF)); + const cloneThreeObjectMap = new Map(); + const cloneGLTFElementMap = new Map(); + for (let i = 0; i < originalThreeGLTF.scenes.length; i++) { + this[$parallelTraverseThreeScene](originalThreeGLTF.scenes[i], cloneThreeGLTF.scenes[i], (object, cloneObject) => { + const elementReference = upstreamCorrelatedSceneGraph.threeObjectMap.get(object); + if (elementReference == null) { + return; + } + for (const mapping in elementReference) { + if (mapping != null && mapping !== 'primitives') { + const type = mapping; + const index = elementReference[type]; + const cloneElement = cloneGLTF[type][index]; + const mappings = cloneThreeObjectMap.get(cloneObject) || {}; + mappings[type] = index; + cloneThreeObjectMap.set(cloneObject, mappings); + const cloneObjects = cloneGLTFElementMap.get(cloneElement) || new Set(); + cloneObjects.add(cloneObject); + cloneGLTFElementMap.set(cloneElement, cloneObjects); + } + } + }); + } + return new CorrelatedSceneGraph(cloneThreeGLTF, cloneGLTF, cloneThreeObjectMap, cloneGLTFElementMap); + } + /** + * Traverses two presumably identical Three.js scenes, and invokes a + * callback for each Object3D or Material encountered, including the initial + * scene. Adapted from + * https://github.com/mrdoob/three.js/blob/7c1424c5819ab622a346dd630ee4e6431388021e/examples/jsm/utils/SkeletonUtils.js#L586-L596 + */ + static [$parallelTraverseThreeScene](sceneOne, sceneTwo, callback) { + const traverse = (a, b) => { + callback(a, b); + if (a.isObject3D) { + const meshA = a; + const meshB = b; + if (meshA.material) { + if (Array.isArray(meshA.material)) { + for (let i = 0; i < meshA.material.length; ++i) { + callback(meshA.material[i], meshB.material[i]); + } + } + else { + callback(meshA.material, meshB.material); + } + } + for (let i = 0; i < a.children.length; ++i) { + traverse(a.children[i], b.children[i]); + } + } + }; + traverse(sceneOne, sceneTwo); + } + /** + * The source Three.js GLTF result given to us by a Three.js GLTFLoader. + */ + get threeGLTF() { + return this[$threeGLTF]; + } + /** + * The in-memory deserialized source glTF. + */ + get gltf() { + return this[$gltf]; + } + /** + * A Map of glTF element references to arrays of corresponding Three.js + * object references. Three.js objects are kept in arrays to account for + * cases where more than one Three.js object corresponds to a single glTF + * element. + */ + get gltfElementMap() { + return this[$gltfElementMap]; + } + /** + * A map of individual Three.js objects to corresponding elements in the + * source glTF. + */ + get threeObjectMap() { + return this[$threeObjectMap]; + } + constructor(threeGLTF, gltf, threeObjectMap, gltfElementMap) { + this[$threeGLTF] = threeGLTF; + this[$gltf] = gltf; + this[$gltfElementMap] = gltfElementMap; + this[$threeObjectMap] = threeObjectMap; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $correlatedSceneGraph = Symbol('correlatedSceneGraph'); +/** + * This specialization of GLTFInstance collects all of the processing needed + * to prepare a model and to clone it making special considerations for + * use cases. + */ +class ModelViewerGLTFInstance extends GLTFInstance { + /** + * @override + */ + static [$prepare](source) { + const prepared = super[$prepare](source); + if (prepared[$correlatedSceneGraph] == null) { + prepared[$correlatedSceneGraph] = CorrelatedSceneGraph.from(prepared); + } + const { scene } = prepared; + const nullSphere = new Sphere(undefined, Infinity); + scene.traverse((node) => { + // Set a high renderOrder while we're here to ensure the model + // always renders on top of the sky sphere + node.renderOrder = 1000; + // Three.js seems to cull some animated models incorrectly. Since we + // expect to view our whole scene anyway, we turn off the frustum + // culling optimization here. + node.frustumCulled = false; + // Animations for objects without names target their UUID instead. When + // objects are cloned, they get new UUIDs which the animation can't + // find. To fix this, we assign their UUID as their name. + if (!node.name) { + node.name = node.uuid; + } + const mesh = node; + if (mesh.material) { + const { geometry } = mesh; + mesh.castShadow = true; + if (mesh.isSkinnedMesh) { + // Akin to disabling frustum culling above, we have to also manually + // disable the bounds to make raycasting correct for skinned meshes. + geometry.boundingSphere = nullSphere; + // The bounding box is set in GLTFLoader by the accessor bounds, which + // are not updated with animation. + geometry.boundingBox = null; + } + const material = mesh.material; + if (material.isMeshBasicMaterial === true) { + material.toneMapped = false; + } + // This makes shadows better for non-manifold meshes + material.shadowSide = FrontSide; + // Fixes an edge case with unused extra UV-coords being incorrectly + // referenced by three.js; remove when + // https://github.com/mrdoob/three.js/pull/23974 is merged. + if (material.aoMap) { + const { gltf, threeObjectMap } = prepared[$correlatedSceneGraph]; + const gltfRef = threeObjectMap.get(material); + if (gltf.materials != null && gltfRef != null && + gltfRef.materials != null) { + const gltfMaterial = gltf.materials[gltfRef.materials]; + if (gltfMaterial.occlusionTexture && + gltfMaterial.occlusionTexture.texCoord === 0 && + geometry.attributes.uv != null) { + geometry.setAttribute('uv2', geometry.attributes.uv); + } + } + } + } + }); + return prepared; + } + get correlatedSceneGraph() { + return this[$preparedGLTF][$correlatedSceneGraph]; + } + /** + * @override + */ + [$clone]() { + const clone = super[$clone](); + const sourceUUIDToClonedMaterial = new Map(); + clone.scene.traverse((node) => { + // Materials aren't cloned when cloning meshes; geometry + // and materials are copied by reference. This is necessary + // for the same model to be used twice with different + // scene-graph operations. + const mesh = node; + if (mesh.material) { + const material = mesh.material; + if (material != null) { + if (sourceUUIDToClonedMaterial.has(material.uuid)) { + mesh.material = sourceUUIDToClonedMaterial.get(material.uuid); + return; + } + mesh.material = material.clone(); + sourceUUIDToClonedMaterial.set(material.uuid, mesh.material); + } + } + const light = node; + if (light.target !== undefined) { + // The target's parent is lost in the cloning process, but in + // GLTFLoader, all light targets are children of their light. + light.add(light.target); + } + }); + // Cross-correlate the scene graph by relying on information in the + // current scene graph; without this step, relationships between the + // Three.js object graph and the glTF scene graph will be lost. + clone[$correlatedSceneGraph] = + CorrelatedSceneGraph.from(clone, this.correlatedSceneGraph); + return clone; + } +} + +/** + * @monogrid/gainmap-js v3.1.0 + * With ❤️, by MONOGRID + */ + + +const getBufferForType = (type, width, height) => { + let out; + switch (type) { + case UnsignedByteType: + out = new Uint8ClampedArray(width * height * 4); + break; + case HalfFloatType: + out = new Uint16Array(width * height * 4); + break; + case UnsignedIntType: + out = new Uint32Array(width * height * 4); + break; + case ByteType: + out = new Int8Array(width * height * 4); + break; + case ShortType: + out = new Int16Array(width * height * 4); + break; + case IntType: + out = new Int32Array(width * height * 4); + break; + case FloatType: + out = new Float32Array(width * height * 4); + break; + default: + throw new Error('Unsupported data type'); + } + return out; +}; +let _canReadPixelsResult; +/** + * Test if this browser implementation can correctly read pixels from the specified + * Render target type. + * + * Runs only once + * + * @param type + * @param renderer + * @param camera + * @param renderTargetOptions + * @returns + */ +const canReadPixels = (type, renderer, camera, renderTargetOptions) => { + if (_canReadPixelsResult !== undefined) + return _canReadPixelsResult; + const testRT = new WebGLRenderTarget(1, 1, renderTargetOptions); + renderer.setRenderTarget(testRT); + const mesh = new Mesh(new PlaneGeometry(), new MeshBasicMaterial({ color: 0xffffff })); + renderer.render(mesh, camera); + renderer.setRenderTarget(null); + const out = getBufferForType(type, testRT.width, testRT.height); + renderer.readRenderTargetPixels(testRT, 0, 0, testRT.width, testRT.height, out); + testRT.dispose(); + mesh.geometry.dispose(); + mesh.material.dispose(); + _canReadPixelsResult = out[0] !== 0; + return _canReadPixelsResult; +}; +/** + * Utility class used for rendering a texture with a material + * + * @category Core + * @group Core + */ +class QuadRenderer { + /** + * Constructs a new QuadRenderer + * + * @param options Parameters for this QuadRenderer + */ + constructor(options) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; + this._rendererIsDisposable = false; + this._supportsReadPixels = true; + /** + * Renders the input texture using the specified material + */ + this.render = () => { + this._renderer.setRenderTarget(this._renderTarget); + try { + this._renderer.render(this._scene, this._camera); + } + catch (e) { + this._renderer.setRenderTarget(null); + throw e; + } + this._renderer.setRenderTarget(null); + }; + this._width = options.width; + this._height = options.height; + this._type = options.type; + this._colorSpace = options.colorSpace; + const rtOptions = { + // fixed options + format: RGBAFormat, + depthBuffer: false, + stencilBuffer: false, + // user options + type: this._type, // set in class property + colorSpace: this._colorSpace, // set in class property + anisotropy: ((_a = options.renderTargetOptions) === null || _a === void 0 ? void 0 : _a.anisotropy) !== undefined ? (_b = options.renderTargetOptions) === null || _b === void 0 ? void 0 : _b.anisotropy : 1, + generateMipmaps: ((_c = options.renderTargetOptions) === null || _c === void 0 ? void 0 : _c.generateMipmaps) !== undefined ? (_d = options.renderTargetOptions) === null || _d === void 0 ? void 0 : _d.generateMipmaps : false, + magFilter: ((_e = options.renderTargetOptions) === null || _e === void 0 ? void 0 : _e.magFilter) !== undefined ? (_f = options.renderTargetOptions) === null || _f === void 0 ? void 0 : _f.magFilter : LinearFilter, + minFilter: ((_g = options.renderTargetOptions) === null || _g === void 0 ? void 0 : _g.minFilter) !== undefined ? (_h = options.renderTargetOptions) === null || _h === void 0 ? void 0 : _h.minFilter : LinearFilter, + samples: ((_j = options.renderTargetOptions) === null || _j === void 0 ? void 0 : _j.samples) !== undefined ? (_k = options.renderTargetOptions) === null || _k === void 0 ? void 0 : _k.samples : undefined, + wrapS: ((_l = options.renderTargetOptions) === null || _l === void 0 ? void 0 : _l.wrapS) !== undefined ? (_m = options.renderTargetOptions) === null || _m === void 0 ? void 0 : _m.wrapS : ClampToEdgeWrapping, + wrapT: ((_o = options.renderTargetOptions) === null || _o === void 0 ? void 0 : _o.wrapT) !== undefined ? (_p = options.renderTargetOptions) === null || _p === void 0 ? void 0 : _p.wrapT : ClampToEdgeWrapping + }; + this._material = options.material; + if (options.renderer) { + this._renderer = options.renderer; + } + else { + this._renderer = QuadRenderer.instantiateRenderer(); + this._rendererIsDisposable = true; + } + this._scene = new Scene(); + this._camera = new OrthographicCamera(); + this._camera.position.set(0, 0, 10); + this._camera.left = -0.5; + this._camera.right = 0.5; + this._camera.top = 0.5; + this._camera.bottom = -0.5; + this._camera.updateProjectionMatrix(); + if (!canReadPixels(this._type, this._renderer, this._camera, rtOptions)) { + let alternativeType; + switch (this._type) { + case HalfFloatType: + alternativeType = this._renderer.extensions.has('EXT_color_buffer_float') ? FloatType : undefined; + break; + } + if (alternativeType !== undefined) { + console.warn(`This browser does not support reading pixels from ${this._type} RenderTargets, switching to ${FloatType}`); + this._type = alternativeType; + } + else { + this._supportsReadPixels = false; + console.warn('This browser dos not support toArray or toDataTexture, calls to those methods will result in an error thrown'); + } + } + this._quad = new Mesh(new PlaneGeometry(), this._material); + this._quad.geometry.computeBoundingBox(); + this._scene.add(this._quad); + this._renderTarget = new WebGLRenderTarget(this.width, this.height, rtOptions); + this._renderTarget.texture.mapping = ((_q = options.renderTargetOptions) === null || _q === void 0 ? void 0 : _q.mapping) !== undefined ? (_r = options.renderTargetOptions) === null || _r === void 0 ? void 0 : _r.mapping : UVMapping; + } + /** + * Instantiates a temporary renderer + * + * @returns + */ + static instantiateRenderer() { + const renderer = new WebGLRenderer(); + renderer.setSize(128, 128); + // renderer.outputColorSpace = SRGBColorSpace + // renderer.toneMapping = LinearToneMapping + // renderer.debug.checkShaderErrors = false + // this._rendererIsDisposable = true + return renderer; + } + /** + * Obtains a Buffer containing the rendered texture. + * + * @throws Error if the browser cannot read pixels from this RenderTarget type. + * @returns a TypedArray containing RGBA values from this renderer + */ + toArray() { + if (!this._supportsReadPixels) + throw new Error('Can\'t read pixels in this browser'); + const out = getBufferForType(this._type, this._width, this._height); + this._renderer.readRenderTargetPixels(this._renderTarget, 0, 0, this._width, this._height, out); + return out; + } + /** + * Performs a readPixel operation in the renderTarget + * and returns a DataTexture containing the read data + * + * @param options options + * @returns + */ + toDataTexture(options) { + const returnValue = new DataTexture( + // fixed values + this.toArray(), this.width, this.height, RGBAFormat, this._type, + // user values + (options === null || options === void 0 ? void 0 : options.mapping) || UVMapping, (options === null || options === void 0 ? void 0 : options.wrapS) || ClampToEdgeWrapping, (options === null || options === void 0 ? void 0 : options.wrapT) || ClampToEdgeWrapping, (options === null || options === void 0 ? void 0 : options.magFilter) || LinearFilter, (options === null || options === void 0 ? void 0 : options.minFilter) || LinearFilter, (options === null || options === void 0 ? void 0 : options.anisotropy) || 1, + // fixed value + LinearSRGBColorSpace); + // set this afterwards, we can't set it in constructor + returnValue.generateMipmaps = (options === null || options === void 0 ? void 0 : options.generateMipmaps) !== undefined ? options === null || options === void 0 ? void 0 : options.generateMipmaps : false; + return returnValue; + } + /** + * If using a disposable renderer, it will dispose it. + */ + disposeOnDemandRenderer() { + this._renderer.setRenderTarget(null); + if (this._rendererIsDisposable) { + this._renderer.dispose(); + this._renderer.forceContextLoss(); + } + } + /** + * Will dispose of **all** assets used by this renderer. + * + * + * @param disposeRenderTarget will dispose of the renderTarget which will not be usable later + * set this to true if you passed the `renderTarget.texture` to a `PMREMGenerator` + * or are otherwise done with it. + * + * @example + * ```js + * const loader = new HDRJPGLoader(renderer) + * const result = await loader.loadAsync('gainmap.jpeg') + * const mesh = new Mesh(geometry, new MeshBasicMaterial({ map: result.renderTarget.texture }) ) + * // DO NOT dispose the renderTarget here, + * // it is used directly in the material + * result.dispose() + * ``` + * + * @example + * ```js + * const loader = new HDRJPGLoader(renderer) + * const pmremGenerator = new PMREMGenerator( renderer ); + * const result = await loader.loadAsync('gainmap.jpeg') + * const envMap = pmremGenerator.fromEquirectangular(result.renderTarget.texture) + * const mesh = new Mesh(geometry, new MeshStandardMaterial({ envMap }) ) + * // renderTarget can be disposed here + * // because it was used to generate a PMREM texture + * result.dispose(true) + * ``` + */ + dispose(disposeRenderTarget) { + this.disposeOnDemandRenderer(); + if (disposeRenderTarget) { + this.renderTarget.dispose(); + } + // dispose shader material texture uniforms + if (this.material instanceof ShaderMaterial) { + Object.values(this.material.uniforms).forEach(v => { + if (v.value instanceof Texture$1) + v.value.dispose(); + }); + } + // dispose other material properties + Object.values(this.material).forEach(value => { + if (value instanceof Texture$1) + value.dispose(); + }); + this.material.dispose(); + this._quad.geometry.dispose(); + } + /** + * Width of the texture + */ + get width() { return this._width; } + set width(value) { + this._width = value; + this._renderTarget.setSize(this._width, this._height); + } + /** + * Height of the texture + */ + get height() { return this._height; } + set height(value) { + this._height = value; + this._renderTarget.setSize(this._width, this._height); + } + /** + * The renderer used + */ + get renderer() { return this._renderer; } + /** + * The `WebGLRenderTarget` used. + */ + get renderTarget() { return this._renderTarget; } + set renderTarget(value) { + this._renderTarget = value; + this._width = value.width; + this._height = value.height; + // this._type = value.texture.type + } + /** + * The `Material` used. + */ + get material() { return this._material; } + /** + * + */ + get type() { return this._type; } + get colorSpace() { return this._colorSpace; } +} + +/** + * @monogrid/gainmap-js v3.1.0 + * With ❤️, by MONOGRID + */ + + +const vertexShader = /* glsl */ ` +varying vec2 vUv; + +void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); +} +`; +const fragmentShader = /* glsl */ ` +// min half float value +#define HALF_FLOAT_MIN vec3( -65504, -65504, -65504 ) +// max half float value +#define HALF_FLOAT_MAX vec3( 65504, 65504, 65504 ) + +uniform sampler2D sdr; +uniform sampler2D gainMap; +uniform vec3 gamma; +uniform vec3 offsetHdr; +uniform vec3 offsetSdr; +uniform vec3 gainMapMin; +uniform vec3 gainMapMax; +uniform float weightFactor; + +varying vec2 vUv; + +void main() { + vec3 rgb = texture2D( sdr, vUv ).rgb; + vec3 recovery = texture2D( gainMap, vUv ).rgb; + vec3 logRecovery = pow( recovery, gamma ); + vec3 logBoost = gainMapMin * ( 1.0 - logRecovery ) + gainMapMax * logRecovery; + vec3 hdrColor = (rgb + offsetSdr) * exp2( logBoost * weightFactor ) - offsetHdr; + vec3 clampedHdrColor = max( HALF_FLOAT_MIN, min( HALF_FLOAT_MAX, hdrColor )); + gl_FragColor = vec4( clampedHdrColor , 1.0 ); +} +`; +/** + * A Material which is able to decode the Gainmap into a full HDR Representation + * + * @category Materials + * @group Materials + */ +class GainMapDecoderMaterial extends ShaderMaterial { + /** + * + * @param params + */ + constructor({ gamma, offsetHdr, offsetSdr, gainMapMin, gainMapMax, maxDisplayBoost, hdrCapacityMin, hdrCapacityMax, sdr, gainMap }) { + super({ + name: 'GainMapDecoderMaterial', + vertexShader, + fragmentShader, + uniforms: { + sdr: { value: sdr }, + gainMap: { value: gainMap }, + gamma: { value: new Vector3(1.0 / gamma[0], 1.0 / gamma[1], 1.0 / gamma[2]) }, + offsetHdr: { value: new Vector3().fromArray(offsetHdr) }, + offsetSdr: { value: new Vector3().fromArray(offsetSdr) }, + gainMapMin: { value: new Vector3().fromArray(gainMapMin) }, + gainMapMax: { value: new Vector3().fromArray(gainMapMax) }, + weightFactor: { + value: (Math.log2(maxDisplayBoost) - hdrCapacityMin) / (hdrCapacityMax - hdrCapacityMin) + } + }, + blending: NoBlending, + depthTest: false, + depthWrite: false + }); + this._maxDisplayBoost = maxDisplayBoost; + this._hdrCapacityMin = hdrCapacityMin; + this._hdrCapacityMax = hdrCapacityMax; + this.needsUpdate = true; + this.uniformsNeedUpdate = true; + } + get sdr() { return this.uniforms.sdr.value; } + set sdr(value) { this.uniforms.sdr.value = value; } + get gainMap() { return this.uniforms.gainMap.value; } + set gainMap(value) { this.uniforms.gainMap.value = value; } + /** + * @see {@link GainMapMetadata.offsetHdr} + */ + get offsetHdr() { return this.uniforms.offsetHdr.value.toArray(); } + set offsetHdr(value) { this.uniforms.offsetHdr.value.fromArray(value); } + /** + * @see {@link GainMapMetadata.offsetSdr} + */ + get offsetSdr() { return this.uniforms.offsetSdr.value.toArray(); } + set offsetSdr(value) { this.uniforms.offsetSdr.value.fromArray(value); } + /** + * @see {@link GainMapMetadata.gainMapMin} + */ + get gainMapMin() { return this.uniforms.gainMapMin.value.toArray(); } + set gainMapMin(value) { this.uniforms.gainMapMin.value.fromArray(value); } + /** + * @see {@link GainMapMetadata.gainMapMax} + */ + get gainMapMax() { return this.uniforms.gainMapMax.value.toArray(); } + set gainMapMax(value) { this.uniforms.gainMapMax.value.fromArray(value); } + /** + * @see {@link GainMapMetadata.gamma} + */ + get gamma() { + const g = this.uniforms.gamma.value; + return [1 / g.x, 1 / g.y, 1 / g.z]; + } + set gamma(value) { + const g = this.uniforms.gamma.value; + g.x = 1.0 / value[0]; + g.y = 1.0 / value[1]; + g.z = 1.0 / value[2]; + } + /** + * @see {@link GainMapMetadata.hdrCapacityMin} + * @remarks Logarithmic space + */ + get hdrCapacityMin() { return this._hdrCapacityMin; } + set hdrCapacityMin(value) { + this._hdrCapacityMin = value; + this.calculateWeight(); + } + /** + * @see {@link GainMapMetadata.hdrCapacityMin} + * @remarks Logarithmic space + */ + get hdrCapacityMax() { return this._hdrCapacityMax; } + set hdrCapacityMax(value) { + this._hdrCapacityMax = value; + this.calculateWeight(); + } + /** + * @see {@link GainmapDecodingParameters.maxDisplayBoost} + * @remarks Non Logarithmic space + */ + get maxDisplayBoost() { return this._maxDisplayBoost; } + set maxDisplayBoost(value) { + this._maxDisplayBoost = Math.max(1, Math.min(65504, value)); + this.calculateWeight(); + } + calculateWeight() { + const val = (Math.log2(this._maxDisplayBoost) - this._hdrCapacityMin) / (this._hdrCapacityMax - this._hdrCapacityMin); + this.uniforms.weightFactor.value = Math.max(0, Math.min(1, val)); + } +} + +class GainMapNotFoundError extends Error { +} + +class XMPMetadataNotFoundError extends Error { +} + +const getXMLValue = (xml, tag, defaultValue) => { + // Check for attribute format first: tag="value" + const attributeMatch = new RegExp(`${tag}="([^"]*)"`, 'i').exec(xml); + if (attributeMatch) + return attributeMatch[1]; + // Check for tag format: value or value... + const tagMatch = new RegExp(`<${tag}[^>]*>([\\s\\S]*?)`, 'i').exec(xml); + if (tagMatch) { + // Check if it contains rdf:li elements + const liValues = tagMatch[1].match(/([^<]*)<\/rdf:li>/g); + if (liValues && liValues.length === 3) { + return liValues.map(v => v.replace(/<\/?rdf:li>/g, '')); + } + return tagMatch[1].trim(); + } + if (defaultValue !== undefined) + return defaultValue; + throw new Error(`Can't find ${tag} in gainmap metadata`); +}; +const extractXMP = (input) => { + let str; + // support node test environment + if (typeof TextDecoder !== 'undefined') + str = new TextDecoder().decode(input); + else + str = input.toString(); + let start = str.indexOf('', start); + const xmpBlock = str.slice(start, end + 10); + try { + const gainMapMin = getXMLValue(xmpBlock, 'hdrgm:GainMapMin', '0'); + const gainMapMax = getXMLValue(xmpBlock, 'hdrgm:GainMapMax'); + const gamma = getXMLValue(xmpBlock, 'hdrgm:Gamma', '1'); + const offsetSDR = getXMLValue(xmpBlock, 'hdrgm:OffsetSDR', '0.015625'); + const offsetHDR = getXMLValue(xmpBlock, 'hdrgm:OffsetHDR', '0.015625'); + // These are always attributes, so we can use a simpler regex + const hdrCapacityMinMatch = /hdrgm:HDRCapacityMin="([^"]*)"/.exec(xmpBlock); + const hdrCapacityMin = hdrCapacityMinMatch ? hdrCapacityMinMatch[1] : '0'; + const hdrCapacityMaxMatch = /hdrgm:HDRCapacityMax="([^"]*)"/.exec(xmpBlock); + if (!hdrCapacityMaxMatch) + throw new Error('Incomplete gainmap metadata'); + const hdrCapacityMax = hdrCapacityMaxMatch[1]; + return { + gainMapMin: Array.isArray(gainMapMin) ? gainMapMin.map(v => parseFloat(v)) : [parseFloat(gainMapMin), parseFloat(gainMapMin), parseFloat(gainMapMin)], + gainMapMax: Array.isArray(gainMapMax) ? gainMapMax.map(v => parseFloat(v)) : [parseFloat(gainMapMax), parseFloat(gainMapMax), parseFloat(gainMapMax)], + gamma: Array.isArray(gamma) ? gamma.map(v => parseFloat(v)) : [parseFloat(gamma), parseFloat(gamma), parseFloat(gamma)], + offsetSdr: Array.isArray(offsetSDR) ? offsetSDR.map(v => parseFloat(v)) : [parseFloat(offsetSDR), parseFloat(offsetSDR), parseFloat(offsetSDR)], + offsetHdr: Array.isArray(offsetHDR) ? offsetHDR.map(v => parseFloat(v)) : [parseFloat(offsetHDR), parseFloat(offsetHDR), parseFloat(offsetHDR)], + hdrCapacityMin: parseFloat(hdrCapacityMin), + hdrCapacityMax: parseFloat(hdrCapacityMax) + }; + } + catch (e) { + // Continue searching for another xmpmeta block if this one fails + } + start = str.indexOf(' { + const debug = this.options.debug; + const dataView = new DataView(imageArrayBuffer.buffer); + // If you're executing this line on a big endian machine, it'll be reversed. + // bigEnd further down though, refers to the endianness of the image itself. + if (dataView.getUint16(0) !== 0xffd8) { + reject(new Error('Not a valid jpeg')); + return; + } + const length = dataView.byteLength; + let offset = 2; + let loops = 0; + let marker; // APP# marker + while (offset < length) { + if (++loops > 250) { + reject(new Error(`Found no marker after ${loops} loops 😵`)); + return; + } + if (dataView.getUint8(offset) !== 0xff) { + reject(new Error(`Not a valid marker at offset 0x${offset.toString(16)}, found: 0x${dataView.getUint8(offset).toString(16)}`)); + return; + } + marker = dataView.getUint8(offset + 1); + if (debug) + console.log(`Marker: ${marker.toString(16)}`); + if (marker === 0xe2) { + if (debug) + console.log('Found APP2 marker (0xffe2)'); + // Works for iPhone 8 Plus, X, and XSMax. Or any photos of MPF format. + // Great way to visualize image information in html is using Exiftool. E.g.: + // ./exiftool.exe -htmldump -wantTrailer photo.jpg > photo.html + const formatPt = offset + 4; + /* + * Structure of the MP Format Identifier + * + * Offset Addr. | Code (Hex) | Description + * +00 ff Marker Prefix <-- offset + * +01 e2 APP2 + * +02 #n APP2 Field Length + * +03 #n APP2 Field Length + * +04 4d 'M' <-- formatPt + * +05 50 'P' + * +06 46 'F' + * +07 00 NULL + * <-- tiffOffset + */ + if (dataView.getUint32(formatPt) === 0x4d504600) { + // Found MPF tag, so we start dig out sub images + const tiffOffset = formatPt + 4; + let bigEnd; // Endianness from TIFF header + // Test for TIFF validity and endianness + // 0x4949 and 0x4D4D ('II' and 'MM') marks Little Endian and Big Endian + if (dataView.getUint16(tiffOffset) === 0x4949) { + bigEnd = false; + } + else if (dataView.getUint16(tiffOffset) === 0x4d4d) { + bigEnd = true; + } + else { + reject(new Error('No valid endianness marker found in TIFF header')); + return; + } + if (dataView.getUint16(tiffOffset + 2, !bigEnd) !== 0x002a) { + reject(new Error('Not valid TIFF data! (no 0x002A marker)')); + return; + } + // 32 bit number stating the offset from the start of the 8 Byte MP Header + // to MP Index IFD Least possible value is thus 8 (means 0 offset) + const firstIFDOffset = dataView.getUint32(tiffOffset + 4, !bigEnd); + if (firstIFDOffset < 0x00000008) { + reject(new Error('Not valid TIFF data! (First offset less than 8)')); + return; + } + // Move ahead to MP Index IFD + // Assume we're at the first IFD, so firstIFDOffset points to + // MP Index IFD and not MP Attributes IFD. (If we try extract from a sub image, + // we fail silently here due to this assumption) + // Count (2 Byte) | MP Index Fields a.k.a. MP Entries (count * 12 Byte) | Offset of Next IFD (4 Byte) + const dirStart = tiffOffset + firstIFDOffset; // Start of IFD (Image File Directory) + const count = dataView.getUint16(dirStart, !bigEnd); // Count of MPEntries (2 Byte) + // Extract info from MPEntries (starting after Count) + const entriesStart = dirStart + 2; + let numberOfImages = 0; + for (let i = entriesStart; i < entriesStart + 12 * count; i += 12) { + // Each entry is 12 Bytes long + // Check MP Index IFD tags, here we only take tag 0xb001 = Number of images + if (dataView.getUint16(i, !bigEnd) === 0xb001) { + // stored in Last 4 bytes of its 12 Byte entry. + numberOfImages = dataView.getUint32(i + 8, !bigEnd); + } + } + const nextIFDOffsetLen = 4; // 4 Byte offset field that appears after MP Index IFD tags + const MPImageListValPt = dirStart + 2 + count * 12 + nextIFDOffsetLen; + const images = []; + for (let i = MPImageListValPt; i < MPImageListValPt + numberOfImages * 16; i += 16) { + const image = { + MPType: dataView.getUint32(i, !bigEnd), + size: dataView.getUint32(i + 4, !bigEnd), + // This offset is specified relative to the address of the MP Endian + // field in the MP Header, unless the image is a First Individual Image, + // in which case the value of the offset shall be NULL (0x00000000). + dataOffset: dataView.getUint32(i + 8, !bigEnd), + dependantImages: dataView.getUint32(i + 12, !bigEnd), + start: -1, + end: -1, + isFII: false + }; + if (!image.dataOffset) { + // dataOffset is 0x00000000 for First Individual Image + image.start = 0; + image.isFII = true; + } + else { + image.start = tiffOffset + image.dataOffset; + image.isFII = false; + } + image.end = image.start + image.size; + images.push(image); + } + if (this.options.extractNonFII && images.length) { + const bufferBlob = new Blob([dataView]); + const imgs = []; + for (const image of images) { + if (image.isFII && !this.options.extractFII) { + continue; // Skip FII + } + const imageBlob = bufferBlob.slice(image.start, image.end + 1, 'image/jpeg'); + // we don't need this + // const imageUrl = URL.createObjectURL(imageBlob) + // image.img = document.createElement('img') + // image.img.src = imageUrl + imgs.push(imageBlob); + } + resolve(imgs); + } + } + } + offset += 2 + dataView.getUint16(offset + 2); + } + }); + } +} + +/** + * Extracts XMP Metadata and the gain map recovery image + * from a single JPEG file. + * + * @category Decoding Functions + * @group Decoding Functions + * @param jpegFile an `Uint8Array` containing and encoded JPEG file + * @returns an sdr `Uint8Array` compressed in JPEG, a gainMap `Uint8Array` compressed in JPEG and the XMP parsed XMP metadata + * @throws Error if XMP Metadata is not found + * @throws Error if Gain map image is not found + * @example + * import { FileLoader } from 'three' + * import { extractGainmapFromJPEG } from '@monogrid/gainmap-js' + * + * const jpegFile = await new FileLoader() + * .setResponseType('arraybuffer') + * .loadAsync('image.jpg') + * + * const { sdr, gainMap, metadata } = extractGainmapFromJPEG(jpegFile) + */ +const extractGainmapFromJPEG = async (jpegFile) => { + const metadata = extractXMP(jpegFile); + if (!metadata) + throw new XMPMetadataNotFoundError('Gain map XMP metadata not found'); + const mpfExtractor = new MPFExtractor({ extractFII: true, extractNonFII: true }); + const images = await mpfExtractor.extract(jpegFile); + if (images.length !== 2) + throw new GainMapNotFoundError('Gain map recovery image not found'); + return { + sdr: new Uint8Array(await images[0].arrayBuffer()), + gainMap: new Uint8Array(await images[1].arrayBuffer()), + metadata + }; +}; + +/** + * private function, async get image from blob + * + * @param blob + * @returns + */ +const getHTMLImageFromBlob = (blob) => { + return new Promise((resolve, reject) => { + const img = document.createElement('img'); + img.onload = () => { resolve(img); }; + img.onerror = (e) => { reject(e); }; + img.src = URL.createObjectURL(blob); + }); +}; + +class LoaderBase extends Loader { + /** + * + * @param renderer + * @param manager + */ + constructor(renderer, manager) { + super(manager); + if (renderer) + this._renderer = renderer; + this._internalLoadingManager = new LoadingManager(); + } + /** + * Specify the renderer to use when rendering the gain map + * + * @param renderer + * @returns + */ + setRenderer(renderer) { + this._renderer = renderer; + return this; + } + /** + * Specify the renderTarget options to use when rendering the gain map + * + * @param options + * @returns + */ + setRenderTargetOptions(options) { + this._renderTargetOptions = options; + return this; + } + /** + * @private + * @returns + */ + prepareQuadRenderer() { + if (!this._renderer) + console.warn('WARNING: An existing WebGL Renderer was not passed to this Loader constructor or in setRenderer, the result of this Loader will need to be converted to a Data Texture with toDataTexture() before you can use it in your renderer.'); + // temporary values + const material = new GainMapDecoderMaterial({ + gainMapMax: [1, 1, 1], + gainMapMin: [0, 0, 0], + gamma: [1, 1, 1], + offsetHdr: [1, 1, 1], + offsetSdr: [1, 1, 1], + hdrCapacityMax: 1, + hdrCapacityMin: 0, + maxDisplayBoost: 1, + gainMap: new Texture$1(), + sdr: new Texture$1() + }); + return new QuadRenderer({ + width: 16, + height: 16, + type: HalfFloatType, + colorSpace: LinearSRGBColorSpace, + material, + renderer: this._renderer, + renderTargetOptions: this._renderTargetOptions + }); + } + /** + * @private + * @param quadRenderer + * @param metadata + * @param sdrBuffer + * @param gainMapBuffer + */ + async render(quadRenderer, metadata, sdrBuffer, gainMapBuffer) { + // this is optional, will render a black gain-map if not present + const gainMapBlob = gainMapBuffer ? new Blob([gainMapBuffer], { type: 'image/jpeg' }) : undefined; + const sdrBlob = new Blob([sdrBuffer], { type: 'image/jpeg' }); + let sdrImage; + let gainMapImage; + let needsFlip = false; + if (typeof createImageBitmap === 'undefined') { + const res = await Promise.all([ + gainMapBlob ? getHTMLImageFromBlob(gainMapBlob) : Promise.resolve(undefined), + getHTMLImageFromBlob(sdrBlob) + ]); + gainMapImage = res[0]; + sdrImage = res[1]; + needsFlip = true; + } + else { + const res = await Promise.all([ + gainMapBlob ? createImageBitmap(gainMapBlob, { imageOrientation: 'flipY' }) : Promise.resolve(undefined), + createImageBitmap(sdrBlob, { imageOrientation: 'flipY' }) + ]); + gainMapImage = res[0]; + sdrImage = res[1]; + } + const gainMap = new Texture$1(gainMapImage || new ImageData(2, 2), UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, 1, LinearSRGBColorSpace); + gainMap.flipY = needsFlip; + gainMap.needsUpdate = true; + const sdr = new Texture$1(sdrImage, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, 1, SRGBColorSpace); + sdr.flipY = needsFlip; + sdr.needsUpdate = true; + quadRenderer.width = sdrImage.width; + quadRenderer.height = sdrImage.height; + quadRenderer.material.gainMap = gainMap; + quadRenderer.material.sdr = sdr; + quadRenderer.material.gainMapMin = metadata.gainMapMin; + quadRenderer.material.gainMapMax = metadata.gainMapMax; + quadRenderer.material.offsetHdr = metadata.offsetHdr; + quadRenderer.material.offsetSdr = metadata.offsetSdr; + quadRenderer.material.gamma = metadata.gamma; + quadRenderer.material.hdrCapacityMin = metadata.hdrCapacityMin; + quadRenderer.material.hdrCapacityMax = metadata.hdrCapacityMax; + quadRenderer.material.maxDisplayBoost = Math.pow(2, metadata.hdrCapacityMax); + quadRenderer.material.needsUpdate = true; + quadRenderer.render(); + } +} + +/** + * A Three.js Loader for a JPEG with embedded gainmap metadata. + * + * @category Loaders + * @group Loaders + * + * @example + * import { HDRJPGLoader } from '@monogrid/gainmap-js' + * import { + * EquirectangularReflectionMapping, + * LinearFilter, + * Mesh, + * MeshBasicMaterial, + * PerspectiveCamera, + * PlaneGeometry, + * Scene, + * WebGLRenderer + * } from 'three' + * + * const renderer = new WebGLRenderer() + * + * const loader = new HDRJPGLoader(renderer) + * + * const result = await loader.loadAsync('gainmap.jpeg') + * // `result` can be used to populate a Texture + * + * const scene = new Scene() + * const mesh = new Mesh( + * new PlaneGeometry(), + * new MeshBasicMaterial({ map: result.renderTarget.texture }) + * ) + * scene.add(mesh) + * renderer.render(scene, new PerspectiveCamera()) + * + * // Starting from three.js r159 + * // `result.renderTarget.texture` can + * // also be used as Equirectangular scene background + * // + * // it was previously needed to convert it + * // to a DataTexture with `result.toDataTexture()` + * scene.background = result.renderTarget.texture + * scene.background.mapping = EquirectangularReflectionMapping + * + * // result must be manually disposed + * // when you are done using it + * result.dispose() + * + */ +class HDRJPGLoader extends LoaderBase { + /** + * Loads a JPEG containing gain map metadata + * Renders a normal SDR image if gainmap data is not found + * + * @param url An array in the form of [sdr.jpg, gainmap.jpg, metadata.json] + * @param onLoad Load complete callback, will receive the result + * @param onProgress Progress callback, will receive a {@link ProgressEvent} + * @param onError Error callback + * @returns + */ + load(url, onLoad, onProgress, onError) { + const quadRenderer = this.prepareQuadRenderer(); + const loader = new FileLoader(this._internalLoadingManager); + loader.setResponseType('arraybuffer'); + loader.setRequestHeader(this.requestHeader); + loader.setPath(this.path); + loader.setWithCredentials(this.withCredentials); + this.manager.itemStart(url); + loader.load(url, async (jpeg) => { + /* istanbul ignore if + this condition exists only because of three.js types + strict mode + */ + if (typeof jpeg === 'string') + throw new Error('Invalid buffer, received [string], was expecting [ArrayBuffer]'); + const jpegBuffer = new Uint8Array(jpeg); + let sdrJPEG; + let gainMapJPEG; + let metadata; + try { + const extractionResult = await extractGainmapFromJPEG(jpegBuffer); + // gain map is successfully reconstructed + sdrJPEG = extractionResult.sdr; + gainMapJPEG = extractionResult.gainMap; + metadata = extractionResult.metadata; + } + catch (e) { + // render the SDR version if this is not a gainmap + if (e instanceof XMPMetadataNotFoundError || e instanceof GainMapNotFoundError) { + console.warn(`Failure to reconstruct an HDR image from ${url}: Gain map metadata not found in the file, HDRJPGLoader will render the SDR jpeg`); + metadata = { + gainMapMin: [0, 0, 0], + gainMapMax: [1, 1, 1], + gamma: [1, 1, 1], + hdrCapacityMin: 0, + hdrCapacityMax: 1, + offsetHdr: [0, 0, 0], + offsetSdr: [0, 0, 0] + }; + sdrJPEG = jpegBuffer; + } + else { + throw e; + } + } + // solves #16 + try { + await this.render(quadRenderer, metadata, sdrJPEG, gainMapJPEG); + } + catch (error) { + this.manager.itemError(url); + if (typeof onError === 'function') + onError(error); + quadRenderer.disposeOnDemandRenderer(); + return; + } + if (typeof onLoad === 'function') + onLoad(quadRenderer); + this.manager.itemEnd(url); + quadRenderer.disposeOnDemandRenderer(); + }, onProgress, (error) => { + this.manager.itemError(url); + if (typeof onError === 'function') + onError(error); + }); + return quadRenderer; + } +} + +// https://github.com/mrdoob/three.js/issues/5552 +// http://en.wikipedia.org/wiki/RGBE_image_format + +class RGBELoader extends DataTextureLoader { + + constructor( manager ) { + + super( manager ); + + this.type = HalfFloatType; + + } + + // adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html + + parse( buffer ) { + + const + /* default error routine. change this to change error handling */ + rgbe_read_error = 1, + rgbe_write_error = 2, + rgbe_format_error = 3, + rgbe_memory_error = 4, + rgbe_error = function ( rgbe_error_code, msg ) { + + switch ( rgbe_error_code ) { + + case rgbe_read_error: throw new Error( 'THREE.RGBELoader: Read Error: ' + ( msg || '' ) ); + case rgbe_write_error: throw new Error( 'THREE.RGBELoader: Write Error: ' + ( msg || '' ) ); + case rgbe_format_error: throw new Error( 'THREE.RGBELoader: Bad File Format: ' + ( msg || '' ) ); + default: + case rgbe_memory_error: throw new Error( 'THREE.RGBELoader: Memory Error: ' + ( msg || '' ) ); + + } + + }, + + /* offsets to red, green, and blue components in a data (float) pixel */ + //RGBE_DATA_RED = 0, + //RGBE_DATA_GREEN = 1, + //RGBE_DATA_BLUE = 2, + + /* number of floats per pixel, use 4 since stored in rgba image format */ + //RGBE_DATA_SIZE = 4, + + /* flags indicating which fields in an rgbe_header_info are valid */ + RGBE_VALID_PROGRAMTYPE = 1, + RGBE_VALID_FORMAT = 2, + RGBE_VALID_DIMENSIONS = 4, + + NEWLINE = '\n', + + fgets = function ( buffer, lineLimit, consume ) { + + const chunkSize = 128; + + lineLimit = ! lineLimit ? 1024 : lineLimit; + let p = buffer.pos, + i = -1, len = 0, s = '', + chunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) ); + + while ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) { + + s += chunk; len += chunk.length; + p += chunkSize; + chunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) ); + + } + + if ( -1 < i ) { + + /*for (i=l-1; i>=0; i--) { + byteCode = m.charCodeAt(i); + if (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++; + else if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2; + if (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate + }*/ + buffer.pos += len + i + 1; + return s + chunk.slice( 0, i ); + + } + + return false; + + }, + + /* minimal header reading. modify if you want to parse more information */ + RGBE_ReadHeader = function ( buffer ) { + + + // regexes to parse header info fields + const magic_token_re = /^#\?(\S+)/, + gamma_re = /^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/, + exposure_re = /^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/, + format_re = /^\s*FORMAT=(\S+)\s*$/, + dimensions_re = /^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/, + + // RGBE format header struct + header = { + + valid: 0, /* indicate which fields are valid */ + + string: '', /* the actual header string */ + + comments: '', /* comments found in header */ + + programtype: 'RGBE', /* listed at beginning of file to identify it after "#?". defaults to "RGBE" */ + + format: '', /* RGBE format, default 32-bit_rle_rgbe */ + + gamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */ + + exposure: 1.0, /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */ + + width: 0, height: 0 /* image dimensions, width/height */ + + }; + + let line, match; + + if ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) { + + rgbe_error( rgbe_read_error, 'no header found' ); + + } + + /* if you want to require the magic token then uncomment the next line */ + if ( ! ( match = line.match( magic_token_re ) ) ) { + + rgbe_error( rgbe_format_error, 'bad initial token' ); + + } + + header.valid |= RGBE_VALID_PROGRAMTYPE; + header.programtype = match[ 1 ]; + header.string += line + '\n'; + + while ( true ) { + + line = fgets( buffer ); + if ( false === line ) break; + header.string += line + '\n'; + + if ( '#' === line.charAt( 0 ) ) { + + header.comments += line + '\n'; + continue; // comment line + + } + + if ( match = line.match( gamma_re ) ) { + + header.gamma = parseFloat( match[ 1 ] ); + + } + + if ( match = line.match( exposure_re ) ) { + + header.exposure = parseFloat( match[ 1 ] ); + + } + + if ( match = line.match( format_re ) ) { + + header.valid |= RGBE_VALID_FORMAT; + header.format = match[ 1 ];//'32-bit_rle_rgbe'; + + } + + if ( match = line.match( dimensions_re ) ) { + + header.valid |= RGBE_VALID_DIMENSIONS; + header.height = parseInt( match[ 1 ], 10 ); + header.width = parseInt( match[ 2 ], 10 ); + + } + + if ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break; + + } + + if ( ! ( header.valid & RGBE_VALID_FORMAT ) ) { + + rgbe_error( rgbe_format_error, 'missing format specifier' ); + + } + + if ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) { + + rgbe_error( rgbe_format_error, 'missing image size specifier' ); + + } + + return header; + + }, + + RGBE_ReadPixels_RLE = function ( buffer, w, h ) { + + const scanline_width = w; + + if ( + // run length encoding is not allowed so read flat + ( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) || + // this file is not run length encoded + ( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) ) + ) { + + // return the flat buffer + return new Uint8Array( buffer ); + + } + + if ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) { + + rgbe_error( rgbe_format_error, 'wrong scanline width' ); + + } + + const data_rgba = new Uint8Array( 4 * w * h ); + + if ( ! data_rgba.length ) { + + rgbe_error( rgbe_memory_error, 'unable to allocate buffer space' ); + + } + + let offset = 0, pos = 0; + + const ptr_end = 4 * scanline_width; + const rgbeStart = new Uint8Array( 4 ); + const scanline_buffer = new Uint8Array( ptr_end ); + let num_scanlines = h; + + // read in each successive scanline + while ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) { + + if ( pos + 4 > buffer.byteLength ) { + + rgbe_error( rgbe_read_error ); + + } + + rgbeStart[ 0 ] = buffer[ pos ++ ]; + rgbeStart[ 1 ] = buffer[ pos ++ ]; + rgbeStart[ 2 ] = buffer[ pos ++ ]; + rgbeStart[ 3 ] = buffer[ pos ++ ]; + + if ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) { + + rgbe_error( rgbe_format_error, 'bad rgbe scanline format' ); + + } + + // read each of the four channels for the scanline into the buffer + // first red, then green, then blue, then exponent + let ptr = 0, count; + + while ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) { + + count = buffer[ pos ++ ]; + const isEncodedRun = count > 128; + if ( isEncodedRun ) count -= 128; + + if ( ( 0 === count ) || ( ptr + count > ptr_end ) ) { + + rgbe_error( rgbe_format_error, 'bad scanline data' ); + + } + + if ( isEncodedRun ) { + + // a (encoded) run of the same value + const byteValue = buffer[ pos ++ ]; + for ( let i = 0; i < count; i ++ ) { + + scanline_buffer[ ptr ++ ] = byteValue; + + } + //ptr += count; + + } else { + + // a literal-run + scanline_buffer.set( buffer.subarray( pos, pos + count ), ptr ); + ptr += count; pos += count; + + } + + } + + + // now convert data from buffer into rgba + // first red, then green, then blue, then exponent (alpha) + const l = scanline_width; //scanline_buffer.byteLength; + for ( let i = 0; i < l; i ++ ) { + + let off = 0; + data_rgba[ offset ] = scanline_buffer[ i + off ]; + off += scanline_width; //1; + data_rgba[ offset + 1 ] = scanline_buffer[ i + off ]; + off += scanline_width; //1; + data_rgba[ offset + 2 ] = scanline_buffer[ i + off ]; + off += scanline_width; //1; + data_rgba[ offset + 3 ] = scanline_buffer[ i + off ]; + offset += 4; + + } + + num_scanlines --; + + } + + return data_rgba; + + }; + + const RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) { + + const e = sourceArray[ sourceOffset + 3 ]; + const scale = Math.pow( 2.0, e - 128.0 ) / 255.0; + + destArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale; + destArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale; + destArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale; + destArray[ destOffset + 3 ] = 1; + + }; + + const RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) { + + const e = sourceArray[ sourceOffset + 3 ]; + const scale = Math.pow( 2.0, e - 128.0 ) / 255.0; + + // clamping to 65504, the maximum representable value in float16 + destArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) ); + destArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) ); + destArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) ); + destArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 ); + + }; + + const byteArray = new Uint8Array( buffer ); + byteArray.pos = 0; + const rgbe_header_info = RGBE_ReadHeader( byteArray ); + + const w = rgbe_header_info.width, + h = rgbe_header_info.height, + image_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h ); + + + let data, type; + let numElements; + + switch ( this.type ) { + + case FloatType: + + numElements = image_rgba_data.length / 4; + const floatArray = new Float32Array( numElements * 4 ); + + for ( let j = 0; j < numElements; j ++ ) { + + RGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 ); + + } + + data = floatArray; + type = FloatType; + break; + + case HalfFloatType: + + numElements = image_rgba_data.length / 4; + const halfArray = new Uint16Array( numElements * 4 ); + + for ( let j = 0; j < numElements; j ++ ) { + + RGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 ); + + } + + data = halfArray; + type = HalfFloatType; + break; + + default: + + throw new Error( 'THREE.RGBELoader: Unsupported type: ' + this.type ); + + } + + return { + width: w, height: h, + data: data, + header: rgbe_header_info.string, + gamma: rgbe_header_info.gamma, + exposure: rgbe_header_info.exposure, + type: type + }; + + } + + setDataType( value ) { + + this.type = value; + return this; + + } + + load( url, onLoad, onProgress, onError ) { + + function onLoadCallback( texture, texData ) { + + switch ( texture.type ) { + + case FloatType: + case HalfFloatType: + + texture.colorSpace = LinearSRGBColorSpace; + texture.minFilter = LinearFilter; + texture.magFilter = LinearFilter; + texture.generateMipmaps = false; + texture.flipY = true; + + break; + + } + + if ( onLoad ) onLoad( texture, texData ); + + } + + return super.load( url, onLoadCallback, onProgress, onError ); + + } + +} + +/* @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const legacy = { + topLight: { + intensity: 500, + position: [0.418, 16.199, 0.300], + }, + room: { + position: [-0.757, 13.219, 0.717], + scale: [31.713, 28.305, 28.591], + }, + boxes: [ + { + position: [-10.906, 2.009, 1.846], + rotation: -0.195, + scale: [2.328, 7.905, 4.651], + }, + { + position: [-5.607, -0.754, -0.758], + rotation: 0.994, + scale: [1.970, 1.534, 3.955], + }, + { + position: [6.167, 0.857, 7.803], + rotation: 0.561, + scale: [3.927, 6.285, 3.687], + }, + { + position: [-2.017, 0.018, 6.124], + rotation: 0.333, + scale: [2.002, 4.566, 2.064], + }, + { + position: [2.291, -0.756, -2.621], + rotation: -0.286, + scale: [1.546, 1.552, 1.496], + }, + { + position: [-2.193, -0.369, -5.547], + rotation: 0.516, + scale: [3.875, 3.487, 2.986], + }, + ], + lights: [ + { + intensity: 50, + position: [-16.116, 14.37, 8.208], + scale: [0.1, 2.428, 2.739], + }, + { + intensity: 50, + position: [-16.109, 18.021, -8.207], + scale: [0.1, 2.425, 2.751], + }, + { + intensity: 17, + position: [14.904, 12.198, -1.832], + scale: [0.15, 4.265, 6.331], + }, + { + intensity: 43, + position: [-0.462, 8.89, 14.520], + scale: [4.38, 5.441, 0.088], + }, + { + intensity: 20, + position: [3.235, 11.486, -12.541], + scale: [2.5, 2.0, 0.1], + }, + { + intensity: 100, + position: [0.0, 20.0, 0.0], + scale: [1.0, 0.1, 1.0], + }, + ] +}; +const neutral = { + topLight: { + intensity: 400, + position: [0.5, 14.0, 0.5], + }, + room: { + position: [0.0, 13.2, 0.0], + scale: [31.5, 28.5, 31.5], + }, + boxes: [ + { + position: [-10.906, -1, 1.846], + rotation: -0.195, + scale: [2.328, 7.905, 4.651], + }, + { + position: [-5.607, -0.754, -0.758], + rotation: 0.994, + scale: [1.970, 1.534, 3.955], + }, + { + position: [6.167, -0.16, 7.803], + rotation: 0.561, + scale: [3.927, 6.285, 3.687], + }, + { + position: [-2.017, 0.018, 6.124], + rotation: 0.333, + scale: [2.002, 4.566, 2.064], + }, + { + position: [2.291, -0.756, -2.621], + rotation: -0.286, + scale: [1.546, 1.552, 1.496], + }, + { + position: [-2.193, -0.369, -5.547], + rotation: 0.516, + scale: [3.875, 3.487, 2.986], + }, + ], + lights: [ + { + intensity: 80, + position: [-14, 10.0, 8.0], + scale: [0.1, 2.5, 2.5], + }, + { + intensity: 80, + position: [-14, 14.0, -4], + scale: [0.1, 2.5, 2.5], + }, + { + intensity: 23, + position: [14.0, 12.0, 0.0], + scale: [0.1, 5.0, 5.0], + }, + { + intensity: 16, + position: [0.0, 9.0, 14.0], + scale: [5.0, 5.0, 0.1], + }, + { + intensity: 80, + position: [7.0, 8.0, -14], + scale: [2.5, 2.5, 0.1], + }, + { + intensity: 80, + position: [-7, 16.0, -14], + scale: [2.5, 2.5, 0.1], + }, + { + intensity: 1, + position: [0.0, 20.0, 0.0], + scale: [0.1, 0.1, 0.1], + }, + ] +}; +class EnvironmentScene extends Scene { + constructor(name) { + super(); + this.position.y = -3.5; + const geometry = new BoxGeometry(); + geometry.deleteAttribute('uv'); + const roomMaterial = new MeshStandardMaterial({ metalness: 0, side: BackSide }); + const boxMaterial = new MeshStandardMaterial({ metalness: 0 }); + const data = name == 'legacy' ? legacy : neutral; + const mainLight = new PointLight(0xffffff, data.topLight.intensity, 28, 2); + mainLight.position.set(...data.topLight.position); + this.add(mainLight); + const room = new Mesh(geometry, roomMaterial); + room.position.set(...data.room.position); + room.scale.set(...data.room.scale); + this.add(room); + for (const box of data.boxes) { + const box1 = new Mesh(geometry, boxMaterial); + box1.position.set(...box.position); + box1.rotation.set(0, box.rotation, 0); + box1.scale.set(...box.scale); + this.add(box1); + } + for (const light of data.lights) { + const light1 = new Mesh(geometry, this.createAreaLightMaterial(light.intensity)); + light1.position.set(...light.position); + light1.scale.set(...light.scale); + this.add(light1); + } + } + createAreaLightMaterial(intensity) { + const material = new MeshBasicMaterial(); + material.color.setScalar(intensity); + return material; + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const GENERATED_SIGMA = 0.04; +// The maximum length of the blur for loop. Smaller sigmas will use fewer +// samples and exit early, but not recompile the shader. +const MAX_SAMPLES = 20; +const HDR_FILE_RE = /\.hdr(\.js)?$/; +class TextureUtils { + constructor(threeRenderer) { + this.threeRenderer = threeRenderer; + this.lottieLoaderUrl = ''; + this._ldrLoader = null; + this._imageLoader = null; + this._hdrLoader = null; + this._lottieLoader = null; + this.generatedEnvironmentMap = null; + this.generatedEnvironmentMapAlt = null; + this.skyboxCache = new Map(); + this.blurMaterial = null; + this.blurScene = null; + } + ldrLoader(withCredentials) { + if (this._ldrLoader == null) { + this._ldrLoader = new TextureLoader(); + } + this._ldrLoader.setWithCredentials(withCredentials); + return this._ldrLoader; + } + imageLoader(withCredentials) { + if (this._imageLoader == null) { + this._imageLoader = new HDRJPGLoader(this.threeRenderer); + } + this._imageLoader.setWithCredentials(withCredentials); + return this._imageLoader; + } + hdrLoader(withCredentials) { + if (this._hdrLoader == null) { + this._hdrLoader = new RGBELoader(); + this._hdrLoader.setDataType(HalfFloatType); + } + this._hdrLoader.setWithCredentials(withCredentials); + return this._hdrLoader; + } + async getLottieLoader(withCredentials) { + if (this._lottieLoader == null) { + const { LottieLoader } = await import(/* webpackIgnore: true */ this.lottieLoaderUrl); + this._lottieLoader = new LottieLoader(); + } + this._lottieLoader.setWithCredentials(withCredentials); + return this._lottieLoader; + } + async loadImage(url, withCredentials) { + const texture = await new Promise((resolve, reject) => this.ldrLoader(withCredentials) + .load(url, resolve, () => { }, reject)); + texture.name = url; + texture.flipY = false; + return texture; + } + async loadLottie(url, quality, withCredentials) { + const loader = await this.getLottieLoader(withCredentials); + loader.setQuality(quality); + const texture = await new Promise((resolve, reject) => loader.load(url, resolve, () => { }, reject)); + texture.name = url; + return texture; + } + async loadEquirect(url, withCredentials = false, progressCallback = () => { }) { + try { + const isHDR = HDR_FILE_RE.test(url); + const loader = isHDR ? this.hdrLoader(withCredentials) : + this.imageLoader(withCredentials); + const texture = await new Promise((resolve, reject) => loader.load(url, (result) => { + const { renderTarget } = result; + if (renderTarget != null) { + const { texture } = renderTarget; + result.dispose(false); + resolve(texture); + } + else { + resolve(result); + } + }, (event) => { + progressCallback(event.loaded / event.total * 0.9); + }, reject)); + progressCallback(1.0); + texture.name = url; + texture.mapping = EquirectangularReflectionMapping; + if (!isHDR) { + texture.colorSpace = SRGBColorSpace; + } + return texture; + } + finally { + if (progressCallback) { + progressCallback(1); + } + } + } + /** + * Returns a { skybox, environmentMap } object with the targets/textures + * accordingly. `skybox` is a WebGLRenderCubeTarget, and `environmentMap` + * is a Texture from a WebGLRenderCubeTarget. + */ + async generateEnvironmentMapAndSkybox(skyboxUrl = null, environmentMapUrl = null, progressCallback = () => { }, withCredentials = false) { + const useAltEnvironment = environmentMapUrl !== 'legacy'; + if (environmentMapUrl === 'legacy' || environmentMapUrl === 'neutral') { + environmentMapUrl = null; + } + environmentMapUrl = deserializeUrl(environmentMapUrl); + let skyboxLoads = Promise.resolve(null); + let environmentMapLoads; + // If we have a skybox URL, attempt to load it as a cubemap + if (!!skyboxUrl) { + skyboxLoads = this.loadEquirectFromUrl(skyboxUrl, withCredentials, progressCallback); + } + if (!!environmentMapUrl) { + // We have an available environment map URL + environmentMapLoads = this.loadEquirectFromUrl(environmentMapUrl, withCredentials, progressCallback); + } + else if (!!skyboxUrl) { + // Fallback to deriving the environment map from an available skybox + environmentMapLoads = this.loadEquirectFromUrl(skyboxUrl, withCredentials, progressCallback); + } + else { + // Fallback to generating the environment map + environmentMapLoads = useAltEnvironment ? + this.loadGeneratedEnvironmentMapAlt() : + this.loadGeneratedEnvironmentMap(); + } + const [environmentMap, skybox] = await Promise.all([environmentMapLoads, skyboxLoads]); + if (environmentMap == null) { + throw new Error('Failed to load environment map.'); + } + return { environmentMap, skybox }; + } + /** + * Loads an equirect Texture from a given URL, for use as a skybox. + */ + async loadEquirectFromUrl(url, withCredentials, progressCallback) { + if (!this.skyboxCache.has(url)) { + const skyboxMapLoads = this.loadEquirect(url, withCredentials, progressCallback); + this.skyboxCache.set(url, skyboxMapLoads); + } + return this.skyboxCache.get(url); + } + async GenerateEnvironmentMap(scene, name) { + await timePasses(); + const renderer = this.threeRenderer; + const cubeTarget = new WebGLCubeRenderTarget(256, { + generateMipmaps: false, + type: HalfFloatType, + format: RGBAFormat, + colorSpace: LinearSRGBColorSpace, + depthBuffer: true + }); + const cubeCamera = new CubeCamera(0.1, 100, cubeTarget); + const generatedEnvironmentMap = cubeCamera.renderTarget.texture; + generatedEnvironmentMap.name = name; + const outputColorSpace = renderer.outputColorSpace; + const toneMapping = renderer.toneMapping; + renderer.toneMapping = NoToneMapping; + renderer.outputColorSpace = LinearSRGBColorSpace; + cubeCamera.update(renderer, scene); + this.blurCubemap(cubeTarget, GENERATED_SIGMA); + renderer.toneMapping = toneMapping; + renderer.outputColorSpace = outputColorSpace; + return generatedEnvironmentMap; + } + /** + * Loads a dynamically generated environment map. + */ + async loadGeneratedEnvironmentMap() { + if (this.generatedEnvironmentMap == null) { + this.generatedEnvironmentMap = + this.GenerateEnvironmentMap(new EnvironmentScene('legacy'), 'legacy'); + } + return this.generatedEnvironmentMap; + } + /** + * Loads a dynamically generated environment map, designed to be neutral and + * color-preserving. Shows less contrast around the different sides of the + * object. + */ + async loadGeneratedEnvironmentMapAlt() { + if (this.generatedEnvironmentMapAlt == null) { + this.generatedEnvironmentMapAlt = this.GenerateEnvironmentMap(new EnvironmentScene('neutral'), 'neutral'); + } + return this.generatedEnvironmentMapAlt; + } + blurCubemap(cubeTarget, sigma) { + if (this.blurMaterial == null) { + this.blurMaterial = this.getBlurShader(MAX_SAMPLES); + const box = new BoxGeometry(); + const blurMesh = new Mesh(box, this.blurMaterial); + this.blurScene = new Scene(); + this.blurScene.add(blurMesh); + } + const tempTarget = cubeTarget.clone(); + this.halfblur(cubeTarget, tempTarget, sigma, 'latitudinal'); + this.halfblur(tempTarget, cubeTarget, sigma, 'longitudinal'); + // Disposing this target after we're done with it somehow corrupts Safari's + // whole graphics driver. It's random, but occurs more frequently on + // lower-powered GPUs (macbooks with intel graphics, older iPhones). It goes + // beyond just messing up the PMREM, as it also occasionally causes + // visible corruption on the canvas and even on the rest of the page. + /** tempTarget.dispose(); */ + } + halfblur(targetIn, targetOut, sigmaRadians, direction) { + // Number of standard deviations at which to cut off the discrete + // approximation. + const STANDARD_DEVIATIONS = 3; + const pixels = targetIn.width; + const radiansPerPixel = isFinite(sigmaRadians) ? + Math.PI / (2 * pixels) : + 2 * Math.PI / (2 * MAX_SAMPLES - 1); + const sigmaPixels = sigmaRadians / radiansPerPixel; + const samples = isFinite(sigmaRadians) ? + 1 + Math.floor(STANDARD_DEVIATIONS * sigmaPixels) : + MAX_SAMPLES; + if (samples > MAX_SAMPLES) { + console.warn(`sigmaRadians, ${sigmaRadians}, is too large and will clip, as it requested ${samples} samples when the maximum is set to ${MAX_SAMPLES}`); + } + const weights = []; + let sum = 0; + for (let i = 0; i < MAX_SAMPLES; ++i) { + const x = i / sigmaPixels; + const weight = Math.exp(-x * x / 2); + weights.push(weight); + if (i == 0) { + sum += weight; + } + else if (i < samples) { + sum += 2 * weight; + } + } + for (let i = 0; i < weights.length; i++) { + weights[i] = weights[i] / sum; + } + const blurUniforms = this.blurMaterial.uniforms; + blurUniforms['envMap'].value = targetIn.texture; + blurUniforms['samples'].value = samples; + blurUniforms['weights'].value = weights; + blurUniforms['latitudinal'].value = direction === 'latitudinal'; + blurUniforms['dTheta'].value = radiansPerPixel; + const cubeCamera = new CubeCamera(0.1, 100, targetOut); + cubeCamera.update(this.threeRenderer, this.blurScene); + } + getBlurShader(maxSamples) { + const weights = new Float32Array(maxSamples); + const poleAxis = new Vector3(0, 1, 0); + const shaderMaterial = new ShaderMaterial({ + name: 'SphericalGaussianBlur', + defines: { 'n': maxSamples }, + uniforms: { + 'envMap': { value: null }, + 'samples': { value: 1 }, + 'weights': { value: weights }, + 'latitudinal': { value: false }, + 'dTheta': { value: 0 }, + 'poleAxis': { value: poleAxis } + }, + vertexShader: /* glsl */ ` + + varying vec3 vOutputDirection; + + void main() { + + vOutputDirection = vec3( position ); + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + } + `, + fragmentShader: /* glsl */ ` + varying vec3 vOutputDirection; + + uniform samplerCube envMap; + uniform int samples; + uniform float weights[ n ]; + uniform bool latitudinal; + uniform float dTheta; + uniform vec3 poleAxis; + + vec3 getSample( float theta, vec3 axis ) { + + float cosTheta = cos( theta ); + // Rodrigues' axis-angle rotation + vec3 sampleDirection = vOutputDirection * cosTheta + + cross( axis, vOutputDirection ) * sin( theta ) + + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); + + return vec3( textureCube( envMap, sampleDirection ) ); + + } + + void main() { + + vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); + + if ( all( equal( axis, vec3( 0.0 ) ) ) ) { + + axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); + + } + + axis = normalize( axis ); + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); + + for ( int i = 1; i < n; i++ ) { + + if ( i >= samples ) { + + break; + + } + + float theta = dTheta * float( i ); + gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); + gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); + + } + } + `, + blending: NoBlending, + depthTest: false, + depthWrite: false, + side: BackSide + }); + return shaderMaterial; + } + async dispose() { + for (const [, promise] of this.skyboxCache) { + const skybox = await promise; + skybox.dispose(); + } + if (this.generatedEnvironmentMap != null) { + (await this.generatedEnvironmentMap).dispose(); + this.generatedEnvironmentMap = null; + } + if (this.generatedEnvironmentMapAlt != null) { + (await this.generatedEnvironmentMapAlt).dispose(); + this.generatedEnvironmentMapAlt = null; + } + if (this.blurMaterial != null) { + this.blurMaterial.dispose(); + } + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Between 0 and 1: larger means the average responds faster and is less smooth. +const DURATION_DECAY = 0.2; +const LOW_FRAME_DURATION_MS = 40; +const HIGH_FRAME_DURATION_MS = 60; +const MAX_AVG_CHANGE_MS = 5; +const SCALE_STEPS = [1, 0.79, 0.62, 0.5, 0.4, 0.31, 0.25]; +const DEFAULT_LAST_STEP = 3; +const DEFAULT_POWER_PREFERENCE = 'high-performance'; +const COMMERCE_EXPOSURE = 1.3; +/** + * Registers canvases with Canvas2DRenderingContexts and renders them + * all in the same WebGLRenderingContext, spitting out textures to apply + * to the canvases. Creates a fullscreen WebGL canvas that is not added + * to the DOM, and on each frame, renders each registered canvas on a portion + * of the WebGL canvas, and applies the texture on the registered canvas. + * + * In the future, can use ImageBitmapRenderingContext instead of + * Canvas2DRenderingContext if supported for cheaper transferring of + * the texture. + */ +class Renderer extends EventDispatcher { + static get singleton() { + if (!this._singleton) { + this._singleton = new Renderer({ + powerPreference: (self.ModelViewerElement || {}) + .powerPreference || + DEFAULT_POWER_PREFERENCE, + debug: isDebugMode() + }); + } + return this._singleton; + } + static resetSingleton() { + const elements = this._singleton.dispose(); + for (const element of elements) { + element.disconnectedCallback(); + } + this._singleton = new Renderer({ + powerPreference: (self.ModelViewerElement || {}) + .powerPreference || + DEFAULT_POWER_PREFERENCE, + debug: isDebugMode() + }); + for (const element of elements) { + element.connectedCallback(); + } + } + get canRender() { + return this.threeRenderer != null; + } + get scaleFactor() { + return SCALE_STEPS[this.scaleStep]; + } + set minScale(scale) { + let i = 1; + while (i < SCALE_STEPS.length) { + if (SCALE_STEPS[i] < scale) { + break; + } + ++i; + } + this.lastStep = i - 1; + } + constructor(options) { + super(); + this.loader = new CachingGLTFLoader(ModelViewerGLTFInstance); + this.width = 0; + this.height = 0; + this.dpr = 1; + this.scenes = new Set(); + this.multipleScenesVisible = false; + this.lastTick = performance.now(); + this.renderedLastFrame = false; + this.scaleStep = 0; + this.lastStep = DEFAULT_LAST_STEP; + this.avgFrameDuration = (HIGH_FRAME_DURATION_MS + LOW_FRAME_DURATION_MS) / 2; + this.onWebGLContextLost = (event) => { + this.dispatchEvent({ type: 'contextlost', sourceEvent: event }); + }; + this.onWebGLContextRestored = () => { + var _a; + (_a = this.textureUtils) === null || _a === void 0 ? void 0 : _a.dispose(); + this.textureUtils = new TextureUtils(this.threeRenderer); + for (const scene of this.scenes) { + scene.element[$updateEnvironment](); + } + }; + this.dpr = window.devicePixelRatio; + this.canvas3D = document.createElement('canvas'); + this.canvas3D.id = 'webgl-canvas'; + this.canvas3D.classList.add('show'); + try { + this.threeRenderer = new WebGLRenderer({ + canvas: this.canvas3D, + alpha: true, + antialias: true, + powerPreference: options.powerPreference, + preserveDrawingBuffer: true, + }); + this.threeRenderer.autoClear = true; + this.threeRenderer.setPixelRatio(1); // handle pixel ratio externally + this.threeRenderer.debug = { + checkShaderErrors: !!options.debug, + onShaderError: null + }; + // ACESFilmicToneMapping appears to be the most "saturated", + // and similar to Filament's gltf-viewer. + this.threeRenderer.toneMapping = NeutralToneMapping; + } + catch (error) { + console.warn(error); + } + this.arRenderer = new ARRenderer(this); + this.textureUtils = + this.canRender ? new TextureUtils(this.threeRenderer) : null; + CachingGLTFLoader.initializeKTX2Loader(this.threeRenderer); + this.canvas3D.addEventListener('webglcontextlost', this.onWebGLContextLost); + this.canvas3D.addEventListener('webglcontextrestored', this.onWebGLContextRestored); + this.updateRendererSize(); + } + registerScene(scene) { + this.scenes.add(scene); + scene.forceRescale(); + const size = new Vector2(); + this.threeRenderer.getSize(size); + scene.canvas.width = size.x; + scene.canvas.height = size.y; + if (this.canRender && this.scenes.size > 0) { + this.threeRenderer.setAnimationLoop((time, frame) => this.render(time, frame)); + } + } + unregisterScene(scene) { + this.scenes.delete(scene); + if (this.canvas3D.parentElement === scene.canvas.parentElement) { + scene.canvas.parentElement.removeChild(this.canvas3D); + } + if (this.canRender && this.scenes.size === 0) { + this.threeRenderer.setAnimationLoop(null); + } + } + displayCanvas(scene) { + return scene.element.modelIsVisible && !this.multipleScenesVisible ? + this.canvas3D : + scene.element[$canvas]; + } + /** + * The function enables an optimization, where when there is only a single + * element, we can use the renderer's 3D canvas directly for + * display. Otherwise we need to use the element's 2D canvas and copy the + * renderer's result into it. + */ + countVisibleScenes() { + const { canvas3D } = this; + let visibleScenes = 0; + let canvas3DScene = null; + for (const scene of this.scenes) { + const { element } = scene; + if (element.modelIsVisible && scene.externalRenderer == null) { + ++visibleScenes; + } + if (canvas3D.parentElement === scene.canvas.parentElement) { + canvas3DScene = scene; + } + } + const multipleScenesVisible = visibleScenes > 1; + if (canvas3DScene != null) { + const newlyMultiple = multipleScenesVisible && !this.multipleScenesVisible; + const disappearing = !canvas3DScene.element.modelIsVisible; + if (newlyMultiple || disappearing) { + const { width, height } = this.sceneSize(canvas3DScene); + this.copyPixels(canvas3DScene, width, height); + canvas3D.parentElement.removeChild(canvas3D); + } + } + this.multipleScenesVisible = multipleScenesVisible; + } + /** + * Updates the renderer's size based on the largest scene and any changes to + * device pixel ratio. + */ + updateRendererSize() { + var _a; + const dpr = window.devicePixelRatio; + if (dpr !== this.dpr) { + // If the device pixel ratio has changed due to page zoom, elements + // specified by % width do not fire a resize event even though their CSS + // pixel dimensions change, so we force them to update their size here. + for (const scene of this.scenes) { + const { element } = scene; + element[$updateSize](element.getBoundingClientRect()); + } + } + // Make the renderer the size of the largest scene + let width = 0; + let height = 0; + for (const scene of this.scenes) { + width = Math.max(width, scene.width); + height = Math.max(height, scene.height); + } + if (width === this.width && height === this.height && dpr === this.dpr) { + return; + } + this.width = width; + this.height = height; + this.dpr = dpr; + width = Math.ceil(width * dpr); + height = Math.ceil(height * dpr); + if (this.canRender) { + this.threeRenderer.setSize(width, height, false); + } + // Each scene's canvas must match the renderer size. In general they can be + // larger than the element that contains them, but the overflow is hidden + // and only the portion that is shown is copied over. + for (const scene of this.scenes) { + const { canvas } = scene; + canvas.width = width; + canvas.height = height; + scene.forceRescale(); + (_a = scene.effectRenderer) === null || _a === void 0 ? void 0 : _a.setSize(width, height); + } + } + updateRendererScale(delta) { + const scaleStep = this.scaleStep; + this.avgFrameDuration += clamp(DURATION_DECAY * (delta - this.avgFrameDuration), -5, MAX_AVG_CHANGE_MS); + if (this.avgFrameDuration > HIGH_FRAME_DURATION_MS) { + ++this.scaleStep; + } + else if (this.avgFrameDuration < LOW_FRAME_DURATION_MS && this.scaleStep > 0) { + --this.scaleStep; + } + this.scaleStep = Math.min(this.scaleStep, this.lastStep); + if (scaleStep !== this.scaleStep) { + this.avgFrameDuration = + (HIGH_FRAME_DURATION_MS + LOW_FRAME_DURATION_MS) / 2; + } + } + shouldRender(scene) { + if (!scene.shouldRender()) { + // The first frame we stop rendering the scene (because it stops moving), + // trigger one extra render at full scale. + if (scene.scaleStep != 0) { + scene.scaleStep = 0; + this.rescaleCanvas(scene); + } + else { + return false; + } + } + else if (scene.scaleStep != this.scaleStep) { + // Update render scale + scene.scaleStep = this.scaleStep; + this.rescaleCanvas(scene); + } + return true; + } + rescaleCanvas(scene) { + const scale = SCALE_STEPS[scene.scaleStep]; + const width = Math.ceil(this.width / scale); + const height = Math.ceil(this.height / scale); + const { style } = scene.canvas; + style.width = `${width}px`; + style.height = `${height}px`; + this.canvas3D.style.width = `${width}px`; + this.canvas3D.style.height = `${height}px`; + const renderedDpr = this.dpr * scale; + const reason = scale < 1 ? 'GPU throttling' : + this.dpr !== window.devicePixelRatio ? 'No meta viewport tag' : + ''; + scene.element.dispatchEvent(new CustomEvent('render-scale', { + detail: { + reportedDpr: window.devicePixelRatio, + renderedDpr: renderedDpr, + minimumDpr: this.dpr * SCALE_STEPS[this.lastStep], + pixelWidth: Math.ceil(scene.width * renderedDpr), + pixelHeight: Math.ceil(scene.height * renderedDpr), + reason: reason + } + })); + } + sceneSize(scene) { + const { dpr } = this; + const scaleFactor = SCALE_STEPS[scene.scaleStep]; + // We avoid using the Three.js PixelRatio and handle it ourselves here so + // that we can do proper rounding and avoid white boundary pixels. + const width = Math.min(Math.ceil(scene.width * scaleFactor * dpr), this.canvas3D.width); + const height = Math.min(Math.ceil(scene.height * scaleFactor * dpr), this.canvas3D.height); + return { width, height }; + } + copyPixels(scene, width, height) { + const context2D = scene.context; + if (context2D == null) { + console.log('could not acquire 2d context'); + return; + } + context2D.clearRect(0, 0, width, height); + context2D.drawImage(this.canvas3D, 0, 0, width, height, 0, 0, width, height); + scene.canvas.classList.add('show'); + } + /** + * Returns an array version of this.scenes where the non-visible ones are + * first. This allows eager scenes to be rendered before they are visible, + * without needing the multi-canvas render path. + */ + orderedScenes() { + const scenes = []; + for (const visible of [false, true]) { + for (const scene of this.scenes) { + if (scene.element.modelIsVisible === visible) { + scenes.push(scene); + } + } + } + return scenes; + } + get isPresenting() { + return this.arRenderer.isPresenting; + } + /** + * This method takes care of updating the element and renderer state based on + * the time that has passed since the last rendered frame. + */ + preRender(scene, t, delta) { + const { element, exposure, toneMapping } = scene; + element[$tick](t, delta); + const exposureIsNumber = typeof exposure === 'number' && !Number.isNaN(exposure); + const env = element.environmentImage; + const sky = element.skyboxImage; + const compensateExposure = toneMapping === NeutralToneMapping && + (env === 'neutral' || env === 'legacy' || (!env && !sky)); + this.threeRenderer.toneMappingExposure = + (exposureIsNumber ? exposure : 1.0) * + (compensateExposure ? COMMERCE_EXPOSURE : 1.0); + } + render(t, frame) { + if (frame != null) { + this.arRenderer.onWebXRFrame(t, frame); + return; + } + const delta = t - this.lastTick; + this.lastTick = t; + if (!this.canRender || this.isPresenting) { + return; + } + this.countVisibleScenes(); + this.updateRendererSize(); + if (this.renderedLastFrame) { + this.updateRendererScale(delta); + this.renderedLastFrame = false; + } + const { canvas3D } = this; + for (const scene of this.orderedScenes()) { + const { element } = scene; + if (!element.loaded || + (!element.modelIsVisible && scene.renderCount > 0)) { + continue; + } + this.preRender(scene, t, delta); + if (!this.shouldRender(scene)) { + continue; + } + if (scene.externalRenderer != null) { + const camera = scene.getCamera(); + camera.updateMatrix(); + const { matrix, projectionMatrix } = camera; + const viewMatrix = matrix.elements.slice(); + const target = scene.getTarget(); + viewMatrix[12] += target.x; + viewMatrix[13] += target.y; + viewMatrix[14] += target.z; + scene.externalRenderer.render({ + viewMatrix: viewMatrix, + projectionMatrix: projectionMatrix.elements + }); + continue; + } + if (!element.modelIsVisible && !this.multipleScenesVisible) { + // Here we are pre-rendering on the visible canvas, so we must mark the + // visible scene dirty to ensure it overwrites us. + for (const visibleScene of this.scenes) { + if (visibleScene.element.modelIsVisible) { + visibleScene.queueRender(); + } + } + } + const { width, height } = this.sceneSize(scene); + scene.renderShadow(this.threeRenderer); + // Need to set the render target in order to prevent + // clearing the depth from a different buffer + this.threeRenderer.setRenderTarget(null); + this.threeRenderer.setViewport(0, Math.ceil(this.height * this.dpr) - height, width, height); + if (scene.effectRenderer != null) { + scene.effectRenderer.render(delta); + } + else { + this.threeRenderer.autoClear = + true; // this might get reset by the effectRenderer + this.threeRenderer.toneMapping = scene.toneMapping; + this.threeRenderer.render(scene, scene.camera); + } + if (this.multipleScenesVisible || + (!scene.element.modelIsVisible && scene.renderCount === 0)) { + this.copyPixels(scene, width, height); + } + else if (canvas3D.parentElement !== scene.canvas.parentElement) { + scene.canvas.parentElement.appendChild(canvas3D); + scene.canvas.classList.remove('show'); + } + scene.hasRendered(); + ++scene.renderCount; + this.renderedLastFrame = true; + } + } + dispose() { + if (this.textureUtils != null) { + this.textureUtils.dispose(); + } + if (this.threeRenderer != null) { + this.threeRenderer.dispose(); + } + this.textureUtils = null; + this.threeRenderer = null; + const elements = []; + for (const scene of this.scenes) { + elements.push(scene.element); + } + this.canvas3D.removeEventListener('webglcontextlost', this.onWebGLContextLost); + this.canvas3D.removeEventListener('webglcontextrestored', this.onWebGLContextRestored); + return elements; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $correlatedObjects = Symbol('correlatedObjects'); +const $onUpdate$1 = Symbol('onUpdate'); +/** + * A SerializableThreeDOMElement is the common primitive of all scene graph + * elements that have been facaded in the host execution context. It adds + * a common interface to these elements in support of convenient + * serializability. + */ +class ThreeDOMElement { + constructor(onUpdate, correlatedObjects) { + this[$onUpdate$1] = onUpdate; + this[$correlatedObjects] = correlatedObjects; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const quadMaterial = new MeshBasicMaterial(); +const quad = new PlaneGeometry(2, 2); +let adhocNum = 0; +const $threeTexture$2 = Symbol('threeTexture'); +const $threeTextures$1 = Symbol('threeTextures'); +/** + * Image facade implementation for Three.js textures + */ +let Image$1 = class Image extends ThreeDOMElement { + get [$threeTexture$2]() { + var _a; + return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value; + } + get [$threeTextures$1]() { + return this[$correlatedObjects]; + } + constructor(onUpdate, texture) { + super(onUpdate, new Set(texture ? [texture] : [])); + if (!this[$threeTexture$2].image.src) { + this[$threeTexture$2].image.src = + texture.name ? texture.name : 'adhoc_image' + adhocNum++; + } + if (!this[$threeTexture$2].image.name) { + this[$threeTexture$2].image.name = + (texture && texture.image && texture.image.src) ? + texture.image.src.split('/').pop() : + 'adhoc_image'; + } + } + get name() { + return this[$threeTexture$2].image.name || ''; + } + get uri() { + return this[$threeTexture$2].image.src; + } + get bufferView() { + return this[$threeTexture$2].image.bufferView; + } + get element() { + const texture = this[$threeTexture$2]; + if (texture && (texture.isCanvasTexture || texture.isVideoTexture)) { + return texture.image; + } + return; + } + get animation() { + const texture = this[$threeTexture$2]; + if (texture && texture.isCanvasTexture && texture.animation) { + return texture.animation; + } + return; + } + get type() { + return this.uri != null ? 'external' : 'embedded'; + } + set name(name) { + for (const texture of this[$threeTextures$1]) { + texture.image.name = name; + } + } + update() { + const texture = this[$threeTexture$2]; + // Applies to non-Lottie canvas textures only + if (texture && texture.isCanvasTexture && !texture.animation) { + this[$threeTexture$2].needsUpdate = true; + this[$onUpdate$1](); + } + } + async createThumbnail(width, height) { + const scene = new Scene(); + quadMaterial.map = this[$threeTexture$2]; + const mesh = new Mesh(quad, quadMaterial); + scene.add(mesh); + const camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1); + const { threeRenderer } = Renderer.singleton; + const renderTarget = new WebGLRenderTarget(width, height); + threeRenderer.setRenderTarget(renderTarget); + threeRenderer.render(scene, camera); + threeRenderer.setRenderTarget(null); + const buffer = new Uint8Array(width * height * 4); + threeRenderer.readRenderTargetPixels(renderTarget, 0, 0, width, height, buffer); + blobCanvas.width = width; + blobCanvas.height = height; + const blobContext = blobCanvas.getContext('2d'); + const imageData = blobContext.createImageData(width, height); + imageData.data.set(buffer); + blobContext.putImageData(imageData, 0, 0); + return new Promise(async (resolve, reject) => { + blobCanvas.toBlob(blob => { + if (!blob) { + return reject('Failed to capture thumbnail.'); + } + resolve(URL.createObjectURL(blob)); + }, 'image/png'); + }); + } +}; + +var Filter; +(function (Filter) { + Filter[Filter["Nearest"] = 9728] = "Nearest"; + Filter[Filter["Linear"] = 9729] = "Linear"; + Filter[Filter["NearestMipmapNearest"] = 9984] = "NearestMipmapNearest"; + Filter[Filter["LinearMipmapNearest"] = 9985] = "LinearMipmapNearest"; + Filter[Filter["NearestMipmapLinear"] = 9986] = "NearestMipmapLinear"; + Filter[Filter["LinearMipmapLinear"] = 9987] = "LinearMipmapLinear"; +})(Filter || (Filter = {})); +var Wrap; +(function (Wrap) { + Wrap[Wrap["ClampToEdge"] = 33071] = "ClampToEdge"; + Wrap[Wrap["MirroredRepeat"] = 33648] = "MirroredRepeat"; + Wrap[Wrap["Repeat"] = 10497] = "Repeat"; +})(Wrap || (Wrap = {})); + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Convertion between gltf standards and threejs standards. +const wrapModeToWrapping = new Map([ + [Wrap.Repeat, RepeatWrapping], + [Wrap.ClampToEdge, ClampToEdgeWrapping], + [Wrap.MirroredRepeat, MirroredRepeatWrapping] +]); +const wrappingToWrapMode = new Map([ + [RepeatWrapping, Wrap.Repeat], + [ClampToEdgeWrapping, Wrap.ClampToEdge], + [MirroredRepeatWrapping, Wrap.MirroredRepeat] +]); +const minFilterToMinification = new Map([ + [Filter.Nearest, NearestFilter], + [Filter.Linear, LinearFilter], + [Filter.NearestMipmapNearest, NearestMipmapNearestFilter], + [Filter.LinearMipmapNearest, LinearMipmapNearestFilter], + [Filter.NearestMipmapLinear, NearestMipmapLinearFilter], + [Filter.LinearMipmapLinear, LinearMipmapLinearFilter] +]); +const minificationToMinFilter = new Map([ + [NearestFilter, Filter.Nearest], + [LinearFilter, Filter.Linear], + [NearestMipmapNearestFilter, Filter.NearestMipmapNearest], + [LinearMipmapNearestFilter, Filter.LinearMipmapNearest], + [NearestMipmapLinearFilter, Filter.NearestMipmapLinear], + [LinearMipmapLinearFilter, Filter.LinearMipmapLinear] +]); +const magFilterToMagnification = new Map([[Filter.Nearest, NearestFilter], [Filter.Linear, LinearFilter]]); +const magnificationToMagFilter = new Map([[NearestFilter, Filter.Nearest], [LinearFilter, Filter.Linear]]); +// Checks for threejs standards. +const isMinFilter = (() => { + return (value) => minificationToMinFilter.has(value); +})(); +const isMagFilter = (() => { + return (value) => magnificationToMagFilter.has(value); +})(); +const isWrapping = (() => { + return (value) => wrappingToWrapMode.has(value); +})(); +const isValidSamplerValue = (property, value) => { + switch (property) { + case 'minFilter': + return isMinFilter(value); + case 'magFilter': + return isMagFilter(value); + case 'wrapS': + case 'wrapT': + return isWrapping(value); + case 'rotation': + case 'repeat': + case 'offset': + return true; + default: + throw new Error(`Cannot configure property "${property}" on Sampler`); + } +}; +const $threeTexture$1 = Symbol('threeTexture'); +const $threeTextures = Symbol('threeTextures'); +const $setProperty = Symbol('setProperty'); +/** + * Sampler facade implementation for Three.js textures + */ +class Sampler extends ThreeDOMElement { + get [$threeTexture$1]() { + var _a; + return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value; + } + get [$threeTextures]() { + return this[$correlatedObjects]; + } + constructor(onUpdate, texture) { + super(onUpdate, new Set(texture ? [texture] : [])); + } + get name() { + return this[$threeTexture$1].name || ''; + } + get minFilter() { + return minificationToMinFilter.get(this[$threeTexture$1].minFilter); + } + get magFilter() { + return magnificationToMagFilter.get(this[$threeTexture$1].magFilter); + } + get wrapS() { + return wrappingToWrapMode.get(this[$threeTexture$1].wrapS); + } + get wrapT() { + return wrappingToWrapMode.get(this[$threeTexture$1].wrapT); + } + get rotation() { + return this[$threeTexture$1].rotation; + } + get scale() { + return toVector2D(this[$threeTexture$1].repeat); + } + get offset() { + return toVector2D(this[$threeTexture$1].offset); + } + setMinFilter(filter) { + this[$setProperty]('minFilter', minFilterToMinification.get(filter)); + } + setMagFilter(filter) { + this[$setProperty]('magFilter', magFilterToMagnification.get(filter)); + } + setWrapS(mode) { + this[$setProperty]('wrapS', wrapModeToWrapping.get(mode)); + } + setWrapT(mode) { + this[$setProperty]('wrapT', wrapModeToWrapping.get(mode)); + } + setRotation(rotation) { + if (rotation == null) { + // Reset rotation. + rotation = 0; + } + this[$setProperty]('rotation', rotation); + } + setScale(scale) { + if (scale == null) { + // Reset scale. + scale = { u: 1, v: 1 }; + } + this[$setProperty]('repeat', new Vector2(scale.u, scale.v)); + } + setOffset(offset) { + if (offset == null) { + // Reset offset. + offset = { u: 0, v: 0 }; + } + this[$setProperty]('offset', new Vector2(offset.u, offset.v)); + } + [$setProperty](property, value) { + if (isValidSamplerValue(property, value)) { + for (const texture of this[$threeTextures]) { + texture[property] = value; + texture.needsUpdate = true; + } + } + this[$onUpdate$1](); + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $image = Symbol('image'); +const $sampler = Symbol('sampler'); +const $threeTexture = Symbol('threeTexture'); +/** + * Material facade implementation for Three.js materials + */ +class Texture extends ThreeDOMElement { + get [$threeTexture]() { + var _a; + return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value; + } + constructor(onUpdate, threeTexture) { + super(onUpdate, new Set(threeTexture ? [threeTexture] : [])); + this[$sampler] = new Sampler(onUpdate, threeTexture); + this[$image] = new Image$1(onUpdate, threeTexture); + } + get name() { + return this[$threeTexture].name || ''; + } + set name(name) { + for (const texture of this[$correlatedObjects]) { + texture.name = name; + } + } + get sampler() { + return this[$sampler]; + } + get source() { + return this[$image]; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$4, _b$4, _c$2; +const $texture = Symbol('texture'); +const $transform = Symbol('transform'); +const $materials$1 = Symbol('materials'); +const $usage = Symbol('usage'); +const $onUpdate = Symbol('onUpdate'); +const $activeVideo = Symbol('activeVideo'); +// Defines what a texture will be used for. +var TextureUsage; +(function (TextureUsage) { + TextureUsage[TextureUsage["Base"] = 0] = "Base"; + TextureUsage[TextureUsage["MetallicRoughness"] = 1] = "MetallicRoughness"; + TextureUsage[TextureUsage["Normal"] = 2] = "Normal"; + TextureUsage[TextureUsage["Occlusion"] = 3] = "Occlusion"; + TextureUsage[TextureUsage["Emissive"] = 4] = "Emissive"; + TextureUsage[TextureUsage["Clearcoat"] = 5] = "Clearcoat"; + TextureUsage[TextureUsage["ClearcoatRoughness"] = 6] = "ClearcoatRoughness"; + TextureUsage[TextureUsage["ClearcoatNormal"] = 7] = "ClearcoatNormal"; + TextureUsage[TextureUsage["SheenColor"] = 8] = "SheenColor"; + TextureUsage[TextureUsage["SheenRoughness"] = 9] = "SheenRoughness"; + TextureUsage[TextureUsage["Transmission"] = 10] = "Transmission"; + TextureUsage[TextureUsage["Thickness"] = 11] = "Thickness"; + TextureUsage[TextureUsage["Specular"] = 12] = "Specular"; + TextureUsage[TextureUsage["SpecularColor"] = 13] = "SpecularColor"; + TextureUsage[TextureUsage["Iridescence"] = 14] = "Iridescence"; + TextureUsage[TextureUsage["IridescenceThickness"] = 15] = "IridescenceThickness"; + TextureUsage[TextureUsage["Anisotropy"] = 16] = "Anisotropy"; +})(TextureUsage || (TextureUsage = {})); +/** + * TextureInfo facade implementation for Three.js materials + */ +class TextureInfo { + constructor(onUpdate, usage, threeTexture, material) { + this[_a$4] = null; + this[_b$4] = { + rotation: 0, + scale: new Vector2(1, 1), + offset: new Vector2(0, 0) + }; + this[_c$2] = false; + // Creates image, sampler, and texture if valid texture info is provided. + if (threeTexture) { + this[$transform].rotation = threeTexture.rotation; + this[$transform].scale.copy(threeTexture.repeat); + this[$transform].offset.copy(threeTexture.offset); + this[$texture] = new Texture(onUpdate, threeTexture); + } + this[$onUpdate] = onUpdate; + this[$materials$1] = material; + this[$usage] = usage; + } + get texture() { + return this[$texture]; + } + setTexture(texture) { + var _d, _e; + const threeTexture = texture != null ? texture.source[$threeTexture$2] : null; + const oldTexture = (_d = this[$texture]) === null || _d === void 0 ? void 0 : _d.source[$threeTexture$2]; + if (oldTexture != null && oldTexture.isVideoTexture) { + this[$activeVideo] = false; + } + else if ((_e = this[$texture]) === null || _e === void 0 ? void 0 : _e.source.animation) { + this[$texture].source.animation.removeEventListener('enterFrame', this[$onUpdate]); + } + this[$texture] = texture; + if (threeTexture != null && threeTexture.isVideoTexture) { + const element = threeTexture.image; + this[$activeVideo] = true; + if (element.requestVideoFrameCallback != null) { + const update = () => { + if (!this[$activeVideo]) { + return; + } + this[$onUpdate](); + element.requestVideoFrameCallback(update); + }; + element.requestVideoFrameCallback(update); + } + else { + const update = () => { + if (!this[$activeVideo]) { + return; + } + this[$onUpdate](); + requestAnimationFrame(update); + }; + requestAnimationFrame(update); + } + } + else if ((texture === null || texture === void 0 ? void 0 : texture.source.animation) != null) { + texture.source.animation.addEventListener('enterFrame', this[$onUpdate]); + } + let colorSpace = SRGBColorSpace; + if (this[$materials$1]) { + for (const material of this[$materials$1]) { + switch (this[$usage]) { + case TextureUsage.Base: + material.map = threeTexture; + break; + case TextureUsage.MetallicRoughness: + colorSpace = LinearSRGBColorSpace; + material.metalnessMap = threeTexture; + material.roughnessMap = threeTexture; + break; + case TextureUsage.Normal: + colorSpace = LinearSRGBColorSpace; + material.normalMap = threeTexture; + break; + case TextureUsage.Occlusion: + colorSpace = LinearSRGBColorSpace; + material.aoMap = threeTexture; + break; + case TextureUsage.Emissive: + material.emissiveMap = threeTexture; + break; + case TextureUsage.Clearcoat: + material.clearcoatMap = threeTexture; + break; + case TextureUsage.ClearcoatRoughness: + material.clearcoatRoughnessMap = threeTexture; + break; + case TextureUsage.ClearcoatNormal: + material.clearcoatNormalMap = threeTexture; + break; + case TextureUsage.SheenColor: + material.sheenColorMap = threeTexture; + break; + case TextureUsage.SheenRoughness: + material.sheenRoughnessMap = threeTexture; + break; + case TextureUsage.Transmission: + material.transmissionMap = threeTexture; + break; + case TextureUsage.Thickness: + material.thicknessMap = threeTexture; + break; + case TextureUsage.Specular: + material.specularIntensityMap = threeTexture; + break; + case TextureUsage.SpecularColor: + material.specularColorMap = threeTexture; + break; + case TextureUsage.Iridescence: + material.iridescenceMap = threeTexture; + break; + case TextureUsage.IridescenceThickness: + material.iridescenceThicknessMap = threeTexture; + break; + case TextureUsage.Anisotropy: + material.anisotropyMap = threeTexture; + break; + } + material.needsUpdate = true; + } + } + if (threeTexture) { + // Updates the colorSpace for the texture, affects all references. + threeTexture.colorSpace = colorSpace; + threeTexture.rotation = this[$transform].rotation; + threeTexture.repeat = this[$transform].scale; + threeTexture.offset = this[$transform].offset; + } + this[$onUpdate](); + } +} +_a$4 = $texture, _b$4 = $transform, _c$2 = $activeVideo; + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $threeMaterial = Symbol('threeMaterial'); +const $threeMaterials = Symbol('threeMaterials'); +const $baseColorTexture = Symbol('baseColorTexture'); +const $metallicRoughnessTexture = Symbol('metallicRoughnessTexture'); +/** + * PBR material properties facade implementation for Three.js materials + */ +class PBRMetallicRoughness extends ThreeDOMElement { + get [$threeMaterials]() { + return this[$correlatedObjects]; + } + get [$threeMaterial]() { + var _a; + return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value; + } + constructor(onUpdate, correlatedMaterials) { + super(onUpdate, correlatedMaterials); + const { map, metalnessMap } = correlatedMaterials.values().next().value; + this[$baseColorTexture] = + new TextureInfo(onUpdate, TextureUsage.Base, map, correlatedMaterials); + this[$metallicRoughnessTexture] = new TextureInfo(onUpdate, TextureUsage.MetallicRoughness, metalnessMap, correlatedMaterials); + } + get baseColorFactor() { + const rgba = [0, 0, 0, this[$threeMaterial].opacity]; + this[$threeMaterial].color.toArray(rgba); + return rgba; + } + get metallicFactor() { + return this[$threeMaterial].metalness; + } + get roughnessFactor() { + return this[$threeMaterial].roughness; + } + get baseColorTexture() { + return this[$baseColorTexture]; + } + get metallicRoughnessTexture() { + return this[$metallicRoughnessTexture]; + } + setBaseColorFactor(rgba) { + const color = new Color(); + if (rgba instanceof Array) { + color.fromArray(rgba); + } + else { + color.set(rgba); + } + for (const material of this[$threeMaterials]) { + material.color.set(color); + if (rgba instanceof Array && rgba.length > 3) { + material.opacity = rgba[3]; + } + else { + rgba = [0, 0, 0, material.opacity]; + color.toArray(rgba); + } + } + this[$onUpdate$1](); + } + setMetallicFactor(value) { + for (const material of this[$threeMaterials]) { + material.metalness = value; + } + this[$onUpdate$1](); + } + setRoughnessFactor(value) { + for (const material of this[$threeMaterials]) { + material.roughness = value; + } + this[$onUpdate$1](); + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$3, _b$3; +const $pbrMetallicRoughness = Symbol('pbrMetallicRoughness'); +const $normalTexture = Symbol('normalTexture'); +const $occlusionTexture = Symbol('occlusionTexture'); +const $emissiveTexture = Symbol('emissiveTexture'); +const $backingThreeMaterial = Symbol('backingThreeMaterial'); +const $applyAlphaCutoff = Symbol('applyAlphaCutoff'); +const $getAlphaMode = Symbol('getAlphaMode'); +const $lazyLoadGLTFInfo = Symbol('lazyLoadGLTFInfo'); +const $initialize = Symbol('initialize'); +const $getLoadedMaterial = Symbol('getLoadedMaterial'); +const $ensureMaterialIsLoaded = Symbol('ensureMaterialIsLoaded'); +const $gltfIndex = Symbol('gltfIndex'); +const $setActive = Symbol('setActive'); +const $variantIndices = Symbol('variantIndices'); +const $isActive = Symbol('isActive'); +const $modelVariants = Symbol('modelVariants'); +const $name = Symbol('name'); +const $pbrTextures = Symbol('pbrTextures'); +/** + * Material facade implementation for Three.js materials + */ +class Material extends ThreeDOMElement { + get [(_a$3 = $variantIndices, _b$3 = $pbrTextures, $backingThreeMaterial)]() { + return this[$correlatedObjects] + .values() + .next() + .value; + } + constructor(onUpdate, gltfIndex, isActive, modelVariants, correlatedMaterials, name, lazyLoadInfo = undefined) { + super(onUpdate, correlatedMaterials); + this[_a$3] = new Set(); + this[_b$3] = new Map(); + this[$gltfIndex] = gltfIndex; + this[$isActive] = isActive; + this[$modelVariants] = modelVariants; + this[$name] = name; + if (lazyLoadInfo == null) { + this[$initialize](); + } + else { + this[$lazyLoadGLTFInfo] = lazyLoadInfo; + } + } + [$initialize]() { + const onUpdate = this[$onUpdate$1]; + const correlatedMaterials = this[$correlatedObjects]; + this[$pbrMetallicRoughness] = + new PBRMetallicRoughness(onUpdate, correlatedMaterials); + const { normalMap, aoMap, emissiveMap } = correlatedMaterials.values().next().value; + this[$normalTexture] = new TextureInfo(onUpdate, TextureUsage.Normal, normalMap, correlatedMaterials); + this[$occlusionTexture] = new TextureInfo(onUpdate, TextureUsage.Occlusion, aoMap, correlatedMaterials); + this[$emissiveTexture] = new TextureInfo(onUpdate, TextureUsage.Emissive, emissiveMap, correlatedMaterials); + const createTextureInfo = (usage) => { + this[$pbrTextures].set(usage, new TextureInfo(onUpdate, usage, null, correlatedMaterials)); + }; + createTextureInfo(TextureUsage.Clearcoat); + createTextureInfo(TextureUsage.ClearcoatRoughness); + createTextureInfo(TextureUsage.ClearcoatNormal); + createTextureInfo(TextureUsage.SheenColor); + createTextureInfo(TextureUsage.SheenRoughness); + createTextureInfo(TextureUsage.Transmission); + createTextureInfo(TextureUsage.Thickness); + createTextureInfo(TextureUsage.Specular); + createTextureInfo(TextureUsage.SpecularColor); + createTextureInfo(TextureUsage.Iridescence); + createTextureInfo(TextureUsage.IridescenceThickness); + createTextureInfo(TextureUsage.Anisotropy); + } + async [$getLoadedMaterial]() { + if (this[$lazyLoadGLTFInfo] != null) { + const material = await this[$lazyLoadGLTFInfo].doLazyLoad(); + this[$initialize](); + // Releases lazy load info. + this[$lazyLoadGLTFInfo] = undefined; + // Redefines the method as a noop method. + this.ensureLoaded = async () => { }; + return material; + } + return null; + } + colorFromRgb(rgb) { + const color = new Color(); + if (rgb instanceof Array) { + color.fromArray(rgb); + } + else { + color.set(rgb); + } + return color; + } + [$ensureMaterialIsLoaded]() { + if (this[$lazyLoadGLTFInfo] == null) { + return; + } + throw new Error(`Material "${this.name}" has not been loaded, call 'await + myMaterial.ensureLoaded()' before using an unloaded material.`); + } + async ensureLoaded() { + await this[$getLoadedMaterial](); + } + get isLoaded() { + return this[$lazyLoadGLTFInfo] == null; + } + get isActive() { + return this[$isActive]; + } + [$setActive](isActive) { + this[$isActive] = isActive; + } + get name() { + return this[$name] || ''; + } + set name(name) { + this[$name] = name; + if (this[$correlatedObjects] != null) { + for (const threeMaterial of this[$correlatedObjects]) { + threeMaterial.name = name; + } + } + } + get pbrMetallicRoughness() { + this[$ensureMaterialIsLoaded](); + return this[$pbrMetallicRoughness]; + } + get normalTexture() { + this[$ensureMaterialIsLoaded](); + return this[$normalTexture]; + } + get occlusionTexture() { + this[$ensureMaterialIsLoaded](); + return this[$occlusionTexture]; + } + get emissiveTexture() { + this[$ensureMaterialIsLoaded](); + return this[$emissiveTexture]; + } + get emissiveFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].emissive.toArray(); + } + get index() { + return this[$gltfIndex]; + } + hasVariant(name) { + const variantData = this[$modelVariants].get(name); + return variantData != null && this[$variantIndices].has(variantData.index); + } + setEmissiveFactor(rgb) { + this[$ensureMaterialIsLoaded](); + const color = this.colorFromRgb(rgb); + for (const material of this[$correlatedObjects]) { + material.emissive.set(color); + } + this[$onUpdate$1](); + } + [$getAlphaMode]() { + // Follows implementation of GLTFExporter from three.js + if (this[$backingThreeMaterial].transparent) { + return 'BLEND'; + } + else { + if (this[$backingThreeMaterial].alphaTest > 0.0) { + return 'MASK'; + } + } + return 'OPAQUE'; + } + [$applyAlphaCutoff]() { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + if (this[$getAlphaMode]() === 'MASK') { + if (material.alphaTest == undefined) { + material.alphaTest = 0.5; + } + } + else { + material.alphaTest = undefined; + } + material.needsUpdate = true; + } + } + setAlphaCutoff(cutoff) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.alphaTest = cutoff; + material.needsUpdate = true; + } + // Set AlphaCutoff to undefined if AlphaMode is not MASK. + this[$applyAlphaCutoff](); + this[$onUpdate$1](); + } + getAlphaCutoff() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].alphaTest; + } + setDoubleSided(doubleSided) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + // When double-sided is disabled gltf spec dictates that Back-Face culling + // must be disabled, in three.js parlance that would mean FrontSide + // rendering only. + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#double-sided + material.side = doubleSided ? DoubleSide : FrontSide; + material.needsUpdate = true; + } + this[$onUpdate$1](); + } + getDoubleSided() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].side == DoubleSide; + } + setAlphaMode(alphaMode) { + this[$ensureMaterialIsLoaded](); + const enableTransparency = (material, enabled) => { + material.transparent = enabled; + material.depthWrite = !enabled; + }; + for (const material of this[$correlatedObjects]) { + enableTransparency(material, alphaMode === 'BLEND'); + if (alphaMode === 'MASK') { + material.alphaTest = 0.5; + } + else { + material.alphaTest = undefined; + } + material.needsUpdate = true; + } + this[$onUpdate$1](); + } + getAlphaMode() { + this[$ensureMaterialIsLoaded](); + return this[$getAlphaMode](); + } + /** + * PBR Next properties. + */ + // KHR_materials_emissive_strength + get emissiveStrength() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].emissiveIntensity; + } + setEmissiveStrength(emissiveStrength) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.emissiveIntensity = emissiveStrength; + } + this[$onUpdate$1](); + } + // KHR_materials_clearcoat + get clearcoatFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].clearcoat; + } + get clearcoatRoughnessFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].clearcoatRoughness; + } + get clearcoatTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Clearcoat); + } + get clearcoatRoughnessTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.ClearcoatRoughness); + } + get clearcoatNormalTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.ClearcoatNormal); + } + get clearcoatNormalScale() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].clearcoatNormalScale.x; + } + setClearcoatFactor(clearcoatFactor) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.clearcoat = clearcoatFactor; + } + this[$onUpdate$1](); + } + setClearcoatRoughnessFactor(clearcoatRoughnessFactor) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.clearcoatRoughness = clearcoatRoughnessFactor; + } + this[$onUpdate$1](); + } + setClearcoatNormalScale(clearcoatNormalScale) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.clearcoatNormalScale = + new Vector2(clearcoatNormalScale, clearcoatNormalScale); + } + this[$onUpdate$1](); + } + // KHR_materials_ior + get ior() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].ior; + } + setIor(ior) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.ior = ior; + } + this[$onUpdate$1](); + } + // KHR_materials_sheen + get sheenColorFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].sheenColor.toArray(); + } + get sheenColorTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.SheenColor); + } + get sheenRoughnessFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].sheenRoughness; + } + get sheenRoughnessTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.SheenRoughness); + } + setSheenColorFactor(rgb) { + this[$ensureMaterialIsLoaded](); + const color = this.colorFromRgb(rgb); + for (const material of this[$correlatedObjects]) { + material.sheenColor.set(color); + // Three.js GLTFExporter checks for internal sheen value. + material.sheen = 1; + } + this[$onUpdate$1](); + } + setSheenRoughnessFactor(roughness) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.sheenRoughness = roughness; + // Three.js GLTFExporter checks for internal sheen value. + material.sheen = 1; + } + this[$onUpdate$1](); + } + // KHR_materials_transmission + get transmissionFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].transmission; + } + get transmissionTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Transmission); + } + setTransmissionFactor(transmission) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.transmission = transmission; + } + this[$onUpdate$1](); + } + // KHR_materials_volume + get thicknessFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].thickness; + } + get thicknessTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Thickness); + } + get attenuationDistance() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].attenuationDistance; + } + get attenuationColor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].attenuationColor.toArray(); + } + setThicknessFactor(thickness) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.thickness = thickness; + } + this[$onUpdate$1](); + } + setAttenuationDistance(attenuationDistance) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.attenuationDistance = attenuationDistance; + } + this[$onUpdate$1](); + } + setAttenuationColor(rgb) { + this[$ensureMaterialIsLoaded](); + const color = this.colorFromRgb(rgb); + for (const material of this[$correlatedObjects]) { + material.attenuationColor.set(color); + } + this[$onUpdate$1](); + } + // KHR_materials_specular + get specularFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].specularIntensity; + } + get specularTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Specular); + } + get specularColorFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].specularColor.toArray(); + } + get specularColorTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.SheenColor); + } + setSpecularFactor(specularFactor) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.specularIntensity = specularFactor; + } + this[$onUpdate$1](); + } + setSpecularColorFactor(rgb) { + this[$ensureMaterialIsLoaded](); + const color = this.colorFromRgb(rgb); + for (const material of this[$correlatedObjects]) { + material.specularColor.set(color); + } + this[$onUpdate$1](); + } + // KHR_materials_iridescence + get iridescenceFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].iridescence; + } + get iridescenceTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Iridescence); + } + get iridescenceIor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].iridescenceIOR; + } + get iridescenceThicknessMinimum() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].iridescenceThicknessRange[0]; + } + get iridescenceThicknessMaximum() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].iridescenceThicknessRange[1]; + } + get iridescenceThicknessTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.IridescenceThickness); + } + setIridescenceFactor(iridescence) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.iridescence = iridescence; + } + this[$onUpdate$1](); + } + setIridescenceIor(ior) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.iridescenceIOR = ior; + } + this[$onUpdate$1](); + } + setIridescenceThicknessMinimum(thicknessMin) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.iridescenceThicknessRange[0] = thicknessMin; + } + this[$onUpdate$1](); + } + setIridescenceThicknessMaximum(thicknessMax) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.iridescenceThicknessRange[1] = thicknessMax; + } + this[$onUpdate$1](); + } + // KHR_materials_anisotropy + get anisotropyStrength() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].anisotropy; + } + get anisotropyRotation() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].anisotropyRotation; + } + get anisotropyTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Anisotropy); + } + setAnisotropyStrength(strength) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.anisotropy = strength; + } + this[$onUpdate$1](); + } + setAnisotropyRotation(rotation) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.anisotropyRotation = rotation; + } + this[$onUpdate$1](); + } +} + +// Defines the base level node methods and data. +let Node$1 = class Node { + constructor(name) { + this.name = ''; + this.children = new Array(); + this.name = name; + } +}; +// Represents a primitive in a glTF mesh. +class PrimitiveNode extends Node$1 { + constructor(mesh, mvMaterials, modelVariants, correlatedSceneGraph) { + super(mesh.name); + // Maps glTF material index number to a material that this primitive supports. + this.materials = new Map(); + // Maps variant index to material. + this.variantToMaterialMap = new Map(); + this.initialMaterialIdx = 0; + this.activeMaterialIdx = 0; + this.mesh = mesh; + const { gltf, threeGLTF, threeObjectMap } = correlatedSceneGraph; + this.parser = threeGLTF.parser; + this.modelVariants = modelVariants; + this.mesh.userData.variantData = modelVariants; + // Captures the primitive's initial material. + const materialMappings = threeObjectMap.get(mesh.material); + if (materialMappings.materials != null) { + this.initialMaterialIdx = this.activeMaterialIdx = + materialMappings.materials; + } + else { + console.error(`Primitive (${mesh.name}) missing initial material reference.`); + } + // Gets the mesh index from the node. + const associations = mesh.userData.associations || + {}; + if (associations.meshes == null) { + console.error('Mesh is missing primitive index association'); + return; + } + // The gltf mesh array to sample from. + const meshElementArray = gltf['meshes'] || []; + // List of primitives under the mesh. + const gltfPrimitives = (meshElementArray[associations.meshes].primitives || []); + const gltfPrimitive = gltfPrimitives[associations.primitives]; + if (gltfPrimitive == null) { + console.error('Mesh primitive definition is missing.'); + return; + } + // Maps the gltfPrimitive default to a material. + if (gltfPrimitive.material != null) { + this.materials.set(gltfPrimitive.material, mvMaterials[gltfPrimitive.material]); + } + else { + const defaultIdx = mvMaterials.findIndex((mat) => { + return mat.name === 'Default'; + }); + if (defaultIdx >= 0) { + this.materials.set(defaultIdx, mvMaterials[defaultIdx]); + } + else { + console.warn('gltfPrimitive has no material!'); + } + } + if (gltfPrimitive.extensions && + gltfPrimitive.extensions['KHR_materials_variants']) { + const variantsExtension = gltfPrimitive.extensions['KHR_materials_variants']; + const extensions = threeGLTF.parser.json.extensions; + const variantNames = extensions['KHR_materials_variants'].variants; + // Provides definition now that we know there are variants to + // support. + for (const mapping of variantsExtension.mappings) { + const mvMaterial = mvMaterials[mapping.material]; + // Maps variant indices to Materials. + this.materials.set(mapping.material, mvMaterial); + for (const variant of mapping.variants) { + const { name } = variantNames[variant]; + this.variantToMaterialMap.set(variant, mvMaterial); + // Provides variant info for material self lookup. + mvMaterial[$variantIndices].add(variant); + // Updates the models variant data. + if (!modelVariants.has(name)) { + modelVariants.set(name, { name, index: variant }); + } + } + } + } + } + async setActiveMaterial(material) { + const mvMaterial = this.materials.get(material); + if (material !== this.activeMaterialIdx) { + const backingMaterials = mvMaterial[$correlatedObjects]; + const baseMaterial = await mvMaterial[$getLoadedMaterial](); + if (baseMaterial != null) { + this.mesh.material = baseMaterial; + } + else { + this.mesh.material = backingMaterials.values().next().value; + } + this.parser.assignFinalMaterial(this.mesh); + backingMaterials.add(this.mesh.material); + this.activeMaterialIdx = material; + } + return this.mesh.material; + } + getActiveMaterial() { + return this.materials.get(this.activeMaterialIdx); + } + getMaterial(index) { + return this.materials.get(index); + } + async enableVariant(name) { + if (name == null) { + return this.setActiveMaterial(this.initialMaterialIdx); + } + if (this.variantToMaterialMap != null && this.modelVariants.has(name)) { + const modelVariants = this.modelVariants.get(name); + return this.enableVariantHelper(modelVariants.index); + } + return null; + } + async enableVariantHelper(index) { + if (this.variantToMaterialMap != null && index != null) { + const material = this.variantToMaterialMap.get(index); + if (material != null) { + return this.setActiveMaterial(material.index); + } + } + return null; + } + async instantiateVariants() { + if (this.variantToMaterialMap == null) { + return; + } + for (const index of this.variantToMaterialMap.keys()) { + const variantMaterial = this.mesh.userData.variantMaterials.get(index); + if (variantMaterial.material != null) { + continue; + } + const threeMaterial = await this.enableVariantHelper(index); + if (threeMaterial != null) { + variantMaterial.material = threeMaterial; + } + } + } + get variantInfo() { + return this.variantToMaterialMap; + } + addVariant(materialVariant, variantName) { + if (!this.ensureVariantIsUnused(variantName)) { + return false; + } + // Adds the variant to the model variants if needed. + if (!this.modelVariants.has(variantName)) { + this.modelVariants.set(variantName, { name: variantName, index: this.modelVariants.size }); + } + const modelVariantData = this.modelVariants.get(variantName); + const variantIndex = modelVariantData.index; + // Updates materials mapped to the variant. + materialVariant[$variantIndices].add(variantIndex); + // Updates internal mappings. + this.variantToMaterialMap.set(variantIndex, materialVariant); + this.materials.set(materialVariant.index, materialVariant); + this.updateVariantUserData(variantIndex, materialVariant); + return true; + } + deleteVariant(variantIndex) { + if (this.variantInfo.has(variantIndex)) { + this.variantInfo.delete(variantIndex); + const userDataMap = this.mesh.userData.variantMaterials; + if (userDataMap != null) { + userDataMap.delete(variantIndex); + } + } + } + updateVariantUserData(variantIndex, materialVariant) { + // Adds variants name to material variants set. + materialVariant[$variantIndices].add(variantIndex); + this.mesh.userData.variantData = this.modelVariants; + // Updates import data (see VariantMaterialLoaderPlugin.ts). + this.mesh.userData.variantMaterials = this.mesh.userData.variantMaterials || + new Map(); + const map = this.mesh.userData.variantMaterials; + map.set(variantIndex, { + material: materialVariant[$correlatedObjects].values().next().value, + gltfMaterialIndex: materialVariant.index, + }); + } + ensureVariantIsUnused(variantName) { + const modelVariants = this.modelVariants.get(variantName); + if (modelVariants != null && this.variantInfo.has(modelVariants.index)) { + console.warn(`Primitive cannot add variant '${variantName}' for this material, it already exists.`); + return false; + } + return true; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$2, _b$2, _c$1, _d$1, _e$1, _f$1; +const $materials = Symbol('materials'); +const $hierarchy = Symbol('hierarchy'); +const $roots = Symbol('roots'); +const $primitivesList = Symbol('primitives'); +const $prepareVariantsForExport = Symbol('prepareVariantsForExport'); +const $switchVariant = Symbol('switchVariant'); +const $materialFromPoint = Symbol('materialFromPoint'); +const $nodeFromPoint = Symbol('nodeFromPoint'); +const $nodeFromIndex = Symbol('nodeFromIndex'); +const $variantData = Symbol('variantData'); +const $availableVariants = Symbol('availableVariants'); +const $modelOnUpdate = Symbol('modelOnUpdate'); +const $cloneMaterial = Symbol('cloneMaterial'); +// Holds onto temporary scene context information needed to perform lazy loading +// of a resource. +class LazyLoader { + constructor(gltf, gltfElementMap, mapKey, doLazyLoad) { + this.gltf = gltf; + this.gltfElementMap = gltfElementMap; + this.mapKey = mapKey; + this.doLazyLoad = doLazyLoad; + } +} +/** + * A Model facades the top-level GLTF object returned by Three.js' GLTFLoader. + * Currently, the model only bothers itself with the materials in the Three.js + * scene graph. + */ +class Model { + constructor(correlatedSceneGraph, onUpdate = () => { }) { + this[_a$2] = new Array(); + this[_b$2] = new Array(); + this[_c$1] = new Array(); + this[_d$1] = new Array(); + this[_e$1] = () => { }; + this[_f$1] = new Map(); + this[$modelOnUpdate] = onUpdate; + const { gltf, threeGLTF, gltfElementMap } = correlatedSceneGraph; + for (const [i, material] of gltf.materials.entries()) { + const correlatedMaterial = gltfElementMap.get(material); + if (correlatedMaterial != null) { + this[$materials].push(new Material(onUpdate, i, true, this[$variantData], correlatedMaterial, material.name)); + } + else { + const elementArray = gltf['materials'] || []; + const gltfMaterialDef = elementArray[i]; + const threeMaterialSet = new Set(); + gltfElementMap.set(gltfMaterialDef, threeMaterialSet); + const materialLoadCallback = async () => { + const threeMaterial = await threeGLTF.parser.getDependency('material', i); + threeMaterialSet.add(threeMaterial); + return threeMaterial; + }; + // Configures the material for lazy loading. + this[$materials].push(new Material(onUpdate, i, false, this[$variantData], threeMaterialSet, material.name, new LazyLoader(gltf, gltfElementMap, gltfMaterialDef, materialLoadCallback))); + } + } + // Creates a hierarchy of Nodes. Allows not just for switching which + // material is applied to a mesh but also exposes a way to provide API + // for switching materials and general assignment/modification. + // Prepares for scene iteration. + const parentMap = new Map(); + const nodeStack = new Array(); + for (const object of threeGLTF.scene.children) { + nodeStack.push(object); + } + // Walks the hierarchy and creates a node tree. + while (nodeStack.length > 0) { + const object = nodeStack.pop(); + let node = null; + if (object instanceof Mesh) { + node = new PrimitiveNode(object, this.materials, this[$variantData], correlatedSceneGraph); + this[$primitivesList].push(node); + } + else { + node = new Node$1(object.name); + } + const parent = parentMap.get(object); + if (parent != null) { + parent.children.push(node); + } + else { + this[$roots].push(node); + } + this[$hierarchy].push(node); + for (const child of object.children) { + nodeStack.push(child); + parentMap.set(object, node); + } + } + } + /** + * Materials are listed in the order of the GLTF materials array, plus a + * default material at the end if one is used. + * + * TODO(#1003): How do we handle non-active scenes? + */ + get materials() { + return this[$materials]; + } + [(_a$2 = $materials, _b$2 = $hierarchy, _c$1 = $roots, _d$1 = $primitivesList, _e$1 = $modelOnUpdate, _f$1 = $variantData, $availableVariants)]() { + const variants = Array.from(this[$variantData].values()); + variants.sort((a, b) => { + return a.index - b.index; + }); + return variants.map((data) => { + return data.name; + }); + } + getMaterialByName(name) { + const matches = this[$materials].filter(material => { + return material.name === name; + }); + if (matches.length > 0) { + return matches[0]; + } + return null; + } + [$nodeFromIndex](mesh, primitive) { + const found = this[$hierarchy].find((node) => { + if (node instanceof PrimitiveNode) { + const { meshes, primitives } = node.mesh.userData.associations; + if (meshes == mesh && primitives == primitive) { + return true; + } + } + return false; + }); + return found == null ? null : found; + } + [$nodeFromPoint](hit) { + return this[$hierarchy].find((node) => { + if (node instanceof PrimitiveNode) { + const primitive = node; + if (primitive.mesh === hit.object) { + return true; + } + } + return false; + }); + } + /** + * Intersects a ray with the Model and returns the first material whose + * object was intersected. + */ + [$materialFromPoint](hit) { + return this[$nodeFromPoint](hit).getActiveMaterial(); + } + /** + * Switches model variant to the variant name provided, or switches to + * default/initial materials if 'null' is provided. + */ + async [$switchVariant](variantName) { + for (const primitive of this[$primitivesList]) { + await primitive.enableVariant(variantName); + } + for (const material of this.materials) { + material[$setActive](false); + } + // Marks the materials that are now in use after the variant switch. + for (const primitive of this[$primitivesList]) { + this.materials[primitive.getActiveMaterial().index][$setActive](true); + } + } + async [$prepareVariantsForExport]() { + const promises = new Array(); + for (const primitive of this[$primitivesList]) { + promises.push(primitive.instantiateVariants()); + } + await Promise.all(promises); + } + [$cloneMaterial](index, newMaterialName) { + const material = this.materials[index]; + if (!material.isLoaded) { + console.error(`Cloning an unloaded material, + call 'material.ensureLoaded() before cloning the material.`); + } + const threeMaterialSet = material[$correlatedObjects]; + const clonedSet = new Set(); + for (const [i, threeMaterial] of threeMaterialSet.entries()) { + const clone = threeMaterial.clone(); + clone.name = + newMaterialName + (threeMaterialSet.size > 1 ? '_inst' + i : ''); + clonedSet.add(clone); + } + const clonedMaterial = new Material(this[$modelOnUpdate], this[$materials].length, false, // Cloned as inactive. + this[$variantData], clonedSet, newMaterialName); + this[$materials].push(clonedMaterial); + return clonedMaterial; + } + createMaterialInstanceForVariant(originalMaterialIndex, newMaterialName, variantName, activateVariant = true) { + let variantMaterialInstance = null; + for (const primitive of this[$primitivesList]) { + const variantData = this[$variantData].get(variantName); + // Skips the primitive if the variant already exists. + if (variantData != null && primitive.variantInfo.has(variantData.index)) { + continue; + } + // Skips the primitive if the source/original material does not exist. + if (primitive.getMaterial(originalMaterialIndex) == null) { + continue; + } + if (!this.hasVariant(variantName)) { + this.createVariant(variantName); + } + if (variantMaterialInstance == null) { + variantMaterialInstance = + this[$cloneMaterial](originalMaterialIndex, newMaterialName); + } + primitive.addVariant(variantMaterialInstance, variantName); + } + if (activateVariant && variantMaterialInstance != null) { + variantMaterialInstance[$setActive](true); + this.materials[originalMaterialIndex][$setActive](false); + for (const primitive of this[$primitivesList]) { + primitive.enableVariant(variantName); + } + } + return variantMaterialInstance; + } + createVariant(variantName) { + if (!this[$variantData].has(variantName)) { + // Adds the name if it's not already in the list. + this[$variantData].set(variantName, { name: variantName, index: this[$variantData].size }); + } + else { + console.warn(`Variant '${variantName}'' already exists`); + } + } + hasVariant(variantName) { + return this[$variantData].has(variantName); + } + setMaterialToVariant(materialIndex, targetVariantName) { + if (this[$availableVariants]().find(name => name === targetVariantName) == + null) { + console.warn(`Can't add material to '${targetVariantName}', the variant does not exist.'`); + return; + } + if (materialIndex < 0 || materialIndex >= this.materials.length) { + console.error(`setMaterialToVariant(): materialIndex is out of bounds.`); + return; + } + for (const primitive of this[$primitivesList]) { + const material = primitive.getMaterial(materialIndex); + // Ensures the material exists on the primitive before setting it to a + // variant. + if (material != null) { + primitive.addVariant(material, targetVariantName); + } + } + } + updateVariantName(currentName, newName) { + const variantData = this[$variantData].get(currentName); + if (variantData == null) { + return; + } + variantData.name = newName; + this[$variantData].set(newName, variantData); + this[$variantData].delete(currentName); + } + deleteVariant(variantName) { + const variant = this[$variantData].get(variantName); + if (variant == null) { + return; + } + for (const material of this.materials) { + if (material.hasVariant(variantName)) { + material[$variantIndices].delete(variant.index); + } + } + for (const primitive of this[$primitivesList]) { + primitive.deleteVariant(variant.index); + } + this[$variantData].delete(variantName); + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$5 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +const $currentGLTF = Symbol('currentGLTF'); +const $originalGltfJson = Symbol('originalGltfJson'); +const $model = Symbol('model'); +const $getOnUpdateMethod = Symbol('getOnUpdateMethod'); +const $buildTexture = Symbol('buildTexture'); +/** + * SceneGraphMixin manages exposes a model API in order to support operations on + * the scene graph. + */ +const SceneGraphMixin = (ModelViewerElement) => { + var _a, _b, _c; + class SceneGraphModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this[_a] = undefined; + this[_b] = null; + this[_c] = null; + this.variantName = null; + this.orientation = '0 0 0'; + this.scale = '1 1 1'; + } + // Scene-graph API: + /** @export */ + get model() { + return this[$model]; + } + get availableVariants() { + return this.model ? this.model[$availableVariants]() : []; + } + /** + * Returns a deep copy of the gltf JSON as loaded. It will not reflect + * changes to the scene-graph, nor will editing it have any effect. + */ + get originalGltfJson() { + return this[$originalGltfJson]; + } + [(_a = $model, _b = $currentGLTF, _c = $originalGltfJson, $getOnUpdateMethod)]() { + return () => { + this[$needsRender](); + }; + } + [$buildTexture](texture) { + // Applies glTF default settings. + texture.colorSpace = SRGBColorSpace; + texture.wrapS = RepeatWrapping; + texture.wrapT = RepeatWrapping; + return new Texture(this[$getOnUpdateMethod](), texture); + } + async createTexture(uri, type = 'image/png') { + const { textureUtils } = this[$renderer]; + const texture = await textureUtils.loadImage(uri, this.withCredentials); + texture.userData.mimeType = type; + return this[$buildTexture](texture); + } + async createLottieTexture(uri, quality = 1) { + const { textureUtils } = this[$renderer]; + const texture = await textureUtils.loadLottie(uri, quality, this.withCredentials); + return this[$buildTexture](texture); + } + createVideoTexture(uri) { + const video = document.createElement('video'); + video.crossOrigin = + this.withCredentials ? 'use-credentials' : 'anonymous'; + video.src = uri; + video.muted = true; + video.playsInline = true; + video.loop = true; + video.play(); + const texture = new VideoTexture(video); + return this[$buildTexture](texture); + } + createCanvasTexture() { + const canvas = document.createElement('canvas'); + const texture = new CanvasTexture(canvas); + return this[$buildTexture](texture); + } + async updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('variantName')) { + const updateVariantProgress = this[$progressTracker].beginActivity('variant-update'); + updateVariantProgress(0.1); + const model = this[$model]; + const { variantName } = this; + if (model != null) { + await model[$switchVariant](variantName); + this[$needsRender](); + this.dispatchEvent(new CustomEvent('variant-applied')); + } + updateVariantProgress(1.0); + } + if (changedProperties.has('orientation') || + changedProperties.has('scale')) { + if (!this.loaded) { + return; + } + const scene = this[$scene]; + scene.applyTransform(); + scene.updateBoundingBox(); + scene.updateShadow(); + this[$renderer].arRenderer.onUpdateScene(); + this[$needsRender](); + } + } + [$onModelLoad]() { + super[$onModelLoad](); + const { currentGLTF } = this[$scene]; + if (currentGLTF != null) { + const { correlatedSceneGraph } = currentGLTF; + if (correlatedSceneGraph != null && + currentGLTF !== this[$currentGLTF]) { + this[$model] = + new Model(correlatedSceneGraph, this[$getOnUpdateMethod]()); + this[$originalGltfJson] = + JSON.parse(JSON.stringify(correlatedSceneGraph.gltf)); + } + // KHR_materials_variants extension spec: + // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_variants + if ('variants' in currentGLTF.userData) { + this.requestUpdate('variantName'); + } + } + this[$currentGLTF] = currentGLTF; + } + /** @export */ + async exportScene(options) { + const scene = this[$scene]; + return new Promise(async (resolve, reject) => { + // Defaults + const opts = { + binary: true, + onlyVisible: true, + maxTextureSize: Infinity, + includeCustomExtensions: false, + forceIndices: false + }; + Object.assign(opts, options); + // Not configurable + opts.animations = scene.animations; + opts.truncateDrawRange = true; + const shadow = scene.shadow; + let visible = false; + // Remove shadow from export + if (shadow != null) { + visible = shadow.visible; + shadow.visible = false; + } + await this[$model][$prepareVariantsForExport](); + const exporter = new GLTFExporter() + .register((writer) => new GLTFExporterMaterialsVariantsExtension(writer)); + exporter.parse(scene.model, (gltf) => { + return resolve(new Blob([opts.binary ? gltf : JSON.stringify(gltf)], { + type: opts.binary ? 'application/octet-stream' : + 'application/json' + })); + }, () => { + return reject('glTF export failed'); + }, opts); + if (shadow != null) { + shadow.visible = visible; + } + }); + } + materialFromPoint(pixelX, pixelY) { + const model = this[$model]; + if (model == null) { + return null; + } + const scene = this[$scene]; + const ndcCoords = scene.getNDC(pixelX, pixelY); + const hit = scene.hitFromPoint(ndcCoords); + if (hit == null || hit.face == null) { + return null; + } + return model[$materialFromPoint](hit); + } + } + __decorate$5([ + property({ type: String, attribute: 'variant-name' }) + ], SceneGraphModelViewerElement.prototype, "variantName", void 0); + __decorate$5([ + property({ type: String, attribute: 'orientation' }) + ], SceneGraphModelViewerElement.prototype, "orientation", void 0); + __decorate$5([ + property({ type: String, attribute: 'scale' }) + ], SceneGraphModelViewerElement.prototype, "scale", void 0); + return SceneGraphModelViewerElement; +}; + +/* @license + * Copyright 2023 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +class GroundedSkybox extends Mesh { + constructor() { + super(undefined, new MeshBasicMaterial({ depthWrite: false })); + this.height = 0; + this.radius = 0; + this.resolution = 0; + this.userData.noHit = true; + } + get map() { + return this.material.map; + } + set map(skybox) { + this.material.map = skybox; + } + isUsable() { + return this.height > 0 && this.radius > 0 && this.geometry != null && + this.map != null; + } + updateGeometry(height = this.height, radius = this.radius, resolution = 128) { + if (height != this.height || radius != this.radius || + resolution != this.resolution) { + this.height = height; + this.radius = radius; + this.resolution = resolution; + if (height > 0 && radius > 0) { + this.geometry.dispose(); + this.geometry = makeGeometry(height, radius, resolution); + } + } + } +} +function makeGeometry(height, radius, resolution) { + const geometry = new SphereGeometry(radius, 2 * resolution, resolution); + geometry.scale(1, 1, -1); + const pos = geometry.getAttribute('position'); + const tmp = new Vector3(); + for (let i = 0; i < pos.count; ++i) { + tmp.fromBufferAttribute(pos, i); + if (tmp.y < 0) { + // Smooth out the transition from flat floor to sphere: + const y1 = -height * 3 / 2; + const f = tmp.y < y1 ? -height / tmp.y : (1 - tmp.y * tmp.y / (3 * y1 * y1)); + tmp.multiplyScalar(f); + tmp.toArray(pos.array, 3 * i); + } + } + pos.needsUpdate = true; + return geometry; +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const a = new Vector3(); +const b = new Vector3(); +const c = new Vector3(); +const mat = new Matrix3(); +const triangle = new Triangle(); +const quat = new Quaternion(); +/** + * The Hotspot object is a reference-counted slot. If decrement() returns true, + * it should be removed from the tree so it can be garbage-collected. + */ +class Hotspot extends CSS2DObject { + constructor(config) { + super(document.createElement('div')); + this.normal = new Vector3(0, 1, 0); + this.initialized = false; + this.referenceCount = 1; + this.pivot = document.createElement('div'); + this.slot = document.createElement('slot'); + this.element.classList.add('annotation-wrapper'); + this.slot.name = config.name; + this.element.appendChild(this.pivot); + this.pivot.appendChild(this.slot); + this.updatePosition(config.position); + this.updateNormal(config.normal); + this.surface = config.surface; + } + get facingCamera() { + return !this.element.classList.contains('hide'); + } + /** + * Sets the hotspot to be in the highly visible foreground state. + */ + show() { + if (!this.facingCamera || !this.initialized) { + this.updateVisibility(true); + } + } + /** + * Sets the hotspot to be in the diminished background state. + */ + hide() { + if (this.facingCamera || !this.initialized) { + this.updateVisibility(false); + } + } + /** + * Call this when adding elements to the same slot to keep track. + */ + increment() { + this.referenceCount++; + } + /** + * Call this when removing elements from the slot; returns true when the slot + * is unused. + */ + decrement() { + if (this.referenceCount > 0) { + --this.referenceCount; + } + return this.referenceCount === 0; + } + /** + * Change the position of the hotspot to the input string, in the same format + * as the data-position attribute. + */ + updatePosition(position) { + if (position == null) + return; + const positionNodes = parseExpressions(position)[0].terms; + for (let i = 0; i < 3; ++i) { + this.position.setComponent(i, normalizeUnit(positionNodes[i]).number); + } + this.updateMatrixWorld(); + } + /** + * Change the hotspot's normal to the input string, in the same format as the + * data-normal attribute. + */ + updateNormal(normal) { + if (normal == null) + return; + const normalNodes = parseExpressions(normal)[0].terms; + for (let i = 0; i < 3; ++i) { + this.normal.setComponent(i, normalNodes[i].number); + } + } + updateSurface() { + const { mesh, tri, bary } = this; + if (mesh == null || tri == null || bary == null) { + return; + } + mesh.getVertexPosition(tri.x, a); + mesh.getVertexPosition(tri.y, b); + mesh.getVertexPosition(tri.z, c); + a.toArray(mat.elements, 0); + b.toArray(mat.elements, 3); + c.toArray(mat.elements, 6); + this.position.copy(bary).applyMatrix3(mat); + const target = this.parent; + target.worldToLocal(mesh.localToWorld(this.position)); + triangle.set(a, b, c); + triangle.getNormal(this.normal).transformDirection(mesh.matrixWorld); + const pivot = target.parent; + quat.setFromAxisAngle(a.set(0, 1, 0), -pivot.rotation.y); + this.normal.applyQuaternion(quat); + } + orient(radians) { + this.pivot.style.transform = `rotate(${radians}rad)`; + } + updateVisibility(show) { + this.element.classList.toggle('hide', !show); + // NOTE: ShadyDOM doesn't support slot.assignedElements, otherwise we could + // use that here. + this.slot.assignedNodes().forEach((node) => { + if (node.nodeType !== Node.ELEMENT_NODE) { + return; + } + const element = node; + // Visibility attribute can be configured per-node in the hotspot: + const visibilityAttribute = element.dataset.visibilityAttribute; + if (visibilityAttribute != null) { + const attributeName = `data-${visibilityAttribute}`; + element.toggleAttribute(attributeName, show); + } + element.dispatchEvent(new CustomEvent('hotspot-visibility', { + detail: { + visible: show, + }, + })); + }); + this.initialized = true; + } +} + +/** + * Two pass Gaussian blur filter (horizontal and vertical blur shaders) + * - see http://www.cake23.de/traveling-wavefronts-lit-up.html + * + * - 9 samples per pass + * - standard deviation 2.7 + * - "h" and "v" parameters should be set to "1 / width" and "1 / height" + */ + +const HorizontalBlurShader = { + + name: 'HorizontalBlurShader', + + uniforms: { + + 'tDiffuse': { value: null }, + 'h': { value: 1.0 / 512.0 } + + }, + + vertexShader: /* glsl */` + + varying vec2 vUv; + + void main() { + + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + }`, + + fragmentShader: /* glsl */` + + uniform sampler2D tDiffuse; + uniform float h; + + varying vec2 vUv; + + void main() { + + vec4 sum = vec4( 0.0 ); + + sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051; + sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918; + sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245; + sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633; + sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531; + sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245; + sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918; + sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051; + + gl_FragColor = sum; + + }` + +}; + +/** + * Two pass Gaussian blur filter (horizontal and vertical blur shaders) + * - see http://www.cake23.de/traveling-wavefronts-lit-up.html + * + * - 9 samples per pass + * - standard deviation 2.7 + * - "h" and "v" parameters should be set to "1 / width" and "1 / height" + */ + +const VerticalBlurShader = { + + name: 'VerticalBlurShader', + + uniforms: { + + 'tDiffuse': { value: null }, + 'v': { value: 1.0 / 512.0 } + + }, + + vertexShader: /* glsl */` + + varying vec2 vUv; + + void main() { + + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + }`, + + fragmentShader: /* glsl */` + + uniform sampler2D tDiffuse; + uniform float v; + + varying vec2 vUv; + + void main() { + + vec4 sum = vec4( 0.0 ); + + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051; + + gl_FragColor = sum; + + }` + +}; + +/** + * Returns a value linearly interpolated from two known points based on the given interval - + * `t = 0` will return `x` and `t = 1` will return `y`. + * + * @param {number} x - The start point + * @param {number} y - The end point. + * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. + * @return {number} The interpolated value. + */ +function lerp( x, y, t ) { + + return ( 1 - t ) * x + t * y; + +} + +/* @license + * Copyright 2022 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// The softness [0, 1] of the shadow is mapped to a resolution between +// 2^LOG_MAX_RESOLUTION and 2^LOG_MIN_RESOLUTION. +const LOG_MAX_RESOLUTION = 9; +const LOG_MIN_RESOLUTION = 6; +// Animated models are not in general contained in their bounding box, as this +// is calculated only for their resting pose. We create a cubic shadow volume +// for animated models sized to their largest bounding box dimension multiplied +// by this scale factor. +const ANIMATION_SCALING = 2; +// Since hard shadows are not lightened by blurring and depth, set a lower +// default intensity to make them more perceptually similar to the intensity of +// the soft shadows. +const DEFAULT_HARD_INTENSITY = 0.3; +/** + * The Shadow class creates a shadow that fits a given scene and follows a + * target. This shadow will follow the scene without any updates needed so long + * as the shadow and scene are both parented to the same object (call it the + * scene) and this scene is passed as the target parameter to the shadow's + * constructor. We also must constrain the scene to motion within the horizontal + * plane and call the setRotation() method whenever the scene's Y-axis rotation + * changes. For motion outside of the horizontal plane, this.needsUpdate must be + * set to true. + * + * The softness of the shadow is controlled by changing its resolution, making + * softer shadows faster, but less precise. + */ +class Shadow extends Object3D { + constructor(scene, softness, side) { + super(); + this.camera = new OrthographicCamera(); + // private cameraHelper = new CameraHelper(this.camera); + this.renderTarget = null; + this.renderTargetBlur = null; + this.depthMaterial = new MeshDepthMaterial(); + this.horizontalBlurMaterial = new ShaderMaterial(HorizontalBlurShader); + this.verticalBlurMaterial = new ShaderMaterial(VerticalBlurShader); + this.intensity = 0; + this.softness = 1; + this.boundingBox = new Box3; + this.size = new Vector3; + this.maxDimension = 0; + this.isAnimated = false; + this.needsUpdate = false; + const { camera } = this; + camera.rotation.x = Math.PI / 2; + camera.left = -0.5; + camera.right = 0.5; + camera.bottom = -0.5; + camera.top = 0.5; + this.add(camera); + // this.add(this.cameraHelper); + // this.cameraHelper.updateMatrixWorld = function() { + // this.matrixWorld = this.camera.matrixWorld; + // }; + const plane = new PlaneGeometry(); + const shadowMaterial = new MeshBasicMaterial({ + // color: new Color(1, 0, 0), + opacity: 1, + transparent: true, + side: BackSide, + }); + this.floor = new Mesh(plane, shadowMaterial); + this.floor.userData.noHit = true; + camera.add(this.floor); + // the plane onto which to blur the texture + this.blurPlane = new Mesh(plane); + this.blurPlane.visible = false; + camera.add(this.blurPlane); + scene.target.add(this); + // like MeshDepthMaterial, but goes from black to transparent + this.depthMaterial.onBeforeCompile = function (shader) { + shader.fragmentShader = shader.fragmentShader.replace('gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );', 'gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * opacity );'); + }; + // Render both sides, back sides face the light source and + // front sides supply depth information for soft shadows + this.depthMaterial.side = DoubleSide; + this.horizontalBlurMaterial.depthTest = false; + this.verticalBlurMaterial.depthTest = false; + this.setScene(scene, softness, side); + } + /** + * Update the shadow's size and position for a new scene. Softness is also + * needed, as this controls the shadow's resolution. + */ + setScene(scene, softness, side) { + const { boundingBox, size, rotation, position } = this; + this.isAnimated = scene.animationNames.length > 0; + this.boundingBox.copy(scene.boundingBox); + this.size.copy(scene.size); + this.maxDimension = Math.max(size.x, size.y, size.z) * + (this.isAnimated ? ANIMATION_SCALING : 1); + this.boundingBox.getCenter(position); + if (side === 'back') { + const { min, max } = boundingBox; + [min.y, min.z] = [min.z, min.y]; + [max.y, max.z] = [max.z, max.y]; + [size.y, size.z] = [size.z, size.y]; + rotation.x = Math.PI / 2; + rotation.y = Math.PI; + } + else { + rotation.x = 0; + rotation.y = 0; + } + if (this.isAnimated) { + const minY = boundingBox.min.y; + const maxY = boundingBox.max.y; + size.y = this.maxDimension; + boundingBox.expandByVector(size.subScalar(this.maxDimension).multiplyScalar(-0.5)); + boundingBox.min.y = minY; + boundingBox.max.y = maxY; + size.set(this.maxDimension, maxY - minY, this.maxDimension); + } + if (side === 'bottom') { + position.y = boundingBox.min.y; + } + else { + position.z = boundingBox.min.y; + } + this.setSoftness(softness); + } + /** + * Update the shadow's resolution based on softness (between 0 and 1). Should + * not be called frequently, as this results in reallocation. + */ + setSoftness(softness) { + this.softness = softness; + const { size, camera } = this; + const scaleY = (this.isAnimated ? ANIMATION_SCALING : 1); + const resolution = scaleY * + Math.pow(2, LOG_MAX_RESOLUTION - + softness * (LOG_MAX_RESOLUTION - LOG_MIN_RESOLUTION)); + this.setMapSize(resolution); + const softFar = size.y / 2; + const hardFar = size.y * scaleY; + camera.near = 0; + camera.far = lerp(hardFar, softFar, softness); + // we have co-opted opacity to scale the depth to clip + this.depthMaterial.opacity = 1.0 / softness; + camera.updateProjectionMatrix(); + // this.cameraHelper.update(); + this.setIntensity(this.intensity); + this.setOffset(0); + } + /** + * Lower-level version of the above function. + */ + setMapSize(maxMapSize) { + const { size } = this; + if (this.isAnimated) { + maxMapSize *= ANIMATION_SCALING; + } + const baseWidth = Math.floor(size.x > size.z ? maxMapSize : maxMapSize * size.x / size.z); + const baseHeight = Math.floor(size.x > size.z ? maxMapSize * size.z / size.x : maxMapSize); + // width of blur filter in pixels (not adjustable) + const TAP_WIDTH = 10; + const width = TAP_WIDTH + baseWidth; + const height = TAP_WIDTH + baseHeight; + if (this.renderTarget != null && + (this.renderTarget.width !== width || + this.renderTarget.height !== height)) { + this.renderTarget.dispose(); + this.renderTarget = null; + this.renderTargetBlur.dispose(); + this.renderTargetBlur = null; + } + if (this.renderTarget == null) { + const params = { format: RGBAFormat }; + this.renderTarget = new WebGLRenderTarget(width, height, params); + this.renderTargetBlur = new WebGLRenderTarget(width, height, params); + this.floor.material.map = + this.renderTarget.texture; + } + // These pads account for the softening radius around the shadow. + this.camera.scale.set(size.x * (1 + TAP_WIDTH / baseWidth), size.z * (1 + TAP_WIDTH / baseHeight), 1); + this.needsUpdate = true; + } + /** + * Set the shadow's intensity (0 to 1), which is just its opacity. Turns off + * shadow rendering if zero. + */ + setIntensity(intensity) { + this.intensity = intensity; + if (intensity > 0) { + this.visible = true; + this.floor.visible = true; + this.floor.material.opacity = intensity * + lerp(DEFAULT_HARD_INTENSITY, 1, this.softness * this.softness); + } + else { + this.visible = false; + this.floor.visible = false; + } + } + getIntensity() { + return this.intensity; + } + /** + * An offset can be specified to move the + * shadow vertically relative to the bottom of the scene. Positive is up, so + * values are generally negative. A small offset keeps our shadow from + * z-fighting with any baked-in shadow plane. + */ + setOffset(offset) { + this.floor.position.z = -offset + this.gap(); + } + gap() { + return 0.001 * this.maxDimension; + } + render(renderer, scene) { + // this.cameraHelper.visible = false; + // force the depthMaterial to everything + scene.overrideMaterial = this.depthMaterial; + // set renderer clear alpha + const initialClearAlpha = renderer.getClearAlpha(); + renderer.setClearAlpha(0); + this.floor.visible = false; + // disable XR for offscreen rendering + const xrEnabled = renderer.xr.enabled; + renderer.xr.enabled = false; + // render to the render target to get the depths + const oldRenderTarget = renderer.getRenderTarget(); + renderer.setRenderTarget(this.renderTarget); + renderer.render(scene, this.camera); + // and reset the override material + scene.overrideMaterial = null; + this.floor.visible = true; + this.blurShadow(renderer); + // reset and render the normal scene + renderer.xr.enabled = xrEnabled; + renderer.setRenderTarget(oldRenderTarget); + renderer.setClearAlpha(initialClearAlpha); + // this.cameraHelper.visible = true; + } + blurShadow(renderer) { + const { camera, horizontalBlurMaterial, verticalBlurMaterial, renderTarget, renderTargetBlur, blurPlane } = this; + blurPlane.visible = true; + // blur horizontally and draw in the renderTargetBlur + blurPlane.material = horizontalBlurMaterial; + horizontalBlurMaterial.uniforms.h.value = 1 / this.renderTarget.width; + horizontalBlurMaterial.uniforms.tDiffuse.value = this.renderTarget.texture; + renderer.setRenderTarget(renderTargetBlur); + renderer.render(blurPlane, camera); + // blur vertically and draw in the main renderTarget + blurPlane.material = verticalBlurMaterial; + verticalBlurMaterial.uniforms.v.value = 1 / this.renderTarget.height; + verticalBlurMaterial.uniforms.tDiffuse.value = + this.renderTargetBlur.texture; + renderer.setRenderTarget(renderTarget); + renderer.render(blurPlane, camera); + blurPlane.visible = false; + } + dispose() { + if (this.renderTarget != null) { + this.renderTarget.dispose(); + } + if (this.renderTargetBlur != null) { + this.renderTargetBlur.dispose(); + } + this.depthMaterial.dispose(); + this.horizontalBlurMaterial.dispose(); + this.verticalBlurMaterial.dispose(); + this.floor.material.dispose(); + this.floor.geometry.dispose(); + this.blurPlane.geometry.dispose(); + this.removeFromParent(); + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const GROUNDED_SKYBOX_SIZE = 10; +const MIN_SHADOW_RATIO = 100; +const view = new Vector3(); +const target = new Vector3(); +const normalWorld = new Vector3(); +const raycaster = new Raycaster(); +const vector3 = new Vector3(); +const ndc = new Vector2(); +/** + * A THREE.Scene object that takes a Model and CanvasHTMLElement and + * constructs a framed scene based off of the canvas dimensions. + * Provides lights and cameras to be used in a renderer. + */ +class ModelScene extends Scene { + constructor({ canvas, element, width, height }) { + super(); + this.annotationRenderer = new CSS2DRenderer(); + this.effectRenderer = null; + this.schemaElement = document.createElement('script'); + this.width = 1; + this.height = 1; + this.aspect = 1; + this.scaleStep = 0; + this.renderCount = 0; + this.externalRenderer = null; + this.appendedAnimations = []; + this.markedAnimations = []; + // These default camera values are never used, as they are reset once the + // model is loaded and framing is computed. + this.camera = new PerspectiveCamera(45, 1, 0.1, 100); + this.xrCamera = null; + this.url = null; + this.pivot = new Object3D(); + this.target = new Object3D(); + this.animationNames = []; + this.boundingBox = new Box3(); + this.boundingSphere = new Sphere(); + this.size = new Vector3(); + this.idealAspect = 0; + this.framedFoVDeg = 0; + this.shadow = null; + this.shadowIntensity = 0; + this.shadowSoftness = 1; + this.bakedShadows = new Set(); + this.exposure = 1; + this.toneMapping = NeutralToneMapping; + this.canScale = true; + this.isDirty = false; + this.goalTarget = new Vector3(); + this.targetDamperX = new Damper(); + this.targetDamperY = new Damper(); + this.targetDamperZ = new Damper(); + this._currentGLTF = null; + this._model = null; + this.cancelPendingSourceChange = null; + this.animationsByName = new Map(); + this.currentAnimationAction = null; + this.groundedSkybox = new GroundedSkybox(); + this.name = 'ModelScene'; + this.element = element; + this.canvas = canvas; + // These default camera values are never used, as they are reset once the + // model is loaded and framing is computed. + this.camera = new PerspectiveCamera(45, 1, 0.1, 100); + this.camera.name = 'MainCamera'; + this.add(this.pivot); + this.pivot.name = 'Pivot'; + this.pivot.add(this.target); + this.setSize(width, height); + this.target.name = 'Target'; + this.mixer = new AnimationMixer(this.target); + const { domElement } = this.annotationRenderer; + const { style } = domElement; + style.display = 'none'; + style.pointerEvents = 'none'; + style.position = 'absolute'; + style.top = '0'; + this.element.shadowRoot.querySelector('.default').appendChild(domElement); + this.schemaElement.setAttribute('type', 'application/ld+json'); + } + /** + * Function to create the context lazily, as when there is only one + * element, the renderer's 3D context can be displayed + * directly. This extra context is necessary to copy the renderings into when + * there are more than one. + */ + get context() { + return this.canvas.getContext('2d'); + } + getCamera() { + return this.xrCamera != null ? this.xrCamera : this.camera; + } + queueRender() { + this.isDirty = true; + } + shouldRender() { + return this.isDirty; + } + hasRendered() { + this.isDirty = false; + } + forceRescale() { + this.scaleStep = -1; + this.queueRender(); + } + /** + * Pass in a THREE.Object3D to be controlled + * by this model. + */ + async setObject(model) { + this.reset(); + this._model = model; + this.target.add(model); + await this.setupScene(); + } + /** + * Sets the model via URL. + */ + async setSource(url, progressCallback = () => { }) { + if (!url || url === this.url) { + progressCallback(1); + return; + } + this.reset(); + this.url = url; + if (this.externalRenderer != null) { + const framingInfo = await this.externalRenderer.load(progressCallback); + this.boundingSphere.radius = framingInfo.framedRadius; + this.idealAspect = framingInfo.fieldOfViewAspect; + return; + } + // If we have pending work due to a previous source change in progress, + // cancel it so that we do not incur a race condition: + if (this.cancelPendingSourceChange != null) { + this.cancelPendingSourceChange(); + this.cancelPendingSourceChange = null; + } + let gltf; + try { + gltf = await new Promise(async (resolve, reject) => { + this.cancelPendingSourceChange = () => reject(); + try { + const result = await this.element[$renderer].loader.load(url, this.element, progressCallback); + resolve(result); + } + catch (error) { + reject(error); + } + }); + } + catch (error) { + if (error == null) { + // Loading was cancelled, so silently return + return; + } + throw error; + } + this.cancelPendingSourceChange = null; + this.reset(); + this.url = url; + this._currentGLTF = gltf; + if (gltf != null) { + this._model = gltf.scene; + this.target.add(gltf.scene); + } + const { animations } = gltf; + const animationsByName = new Map(); + const animationNames = []; + for (const animation of animations) { + animationsByName.set(animation.name, animation); + animationNames.push(animation.name); + } + this.animations = animations; + this.animationsByName = animationsByName; + this.animationNames = animationNames; + await this.setupScene(); + } + async setupScene() { + this.applyTransform(); + this.updateBoundingBox(); + await this.updateFraming(); + this.updateShadow(); + this.setShadowIntensity(this.shadowIntensity); + this.setGroundedSkybox(); + } + reset() { + this.url = null; + this.renderCount = 0; + this.queueRender(); + if (this.shadow != null) { + this.shadow.setIntensity(0); + } + this.bakedShadows.clear(); + const { _model } = this; + if (_model != null) { + _model.removeFromParent(); + this._model = null; + } + const gltf = this._currentGLTF; + if (gltf != null) { + gltf.dispose(); + this._currentGLTF = null; + } + if (this.currentAnimationAction != null) { + this.currentAnimationAction.stop(); + this.currentAnimationAction = null; + } + this.mixer.stopAllAction(); + this.mixer.uncacheRoot(this); + } + dispose() { + this.reset(); + if (this.shadow != null) { + this.shadow.dispose(); + this.shadow = null; + } + this.element[$currentGLTF] = null; + this.element[$originalGltfJson] = null; + this.element[$model] = null; + } + get currentGLTF() { + return this._currentGLTF; + } + /** + * Updates the ModelScene for a new container size in CSS pixels. + */ + setSize(width, height) { + if (this.width === width && this.height === height) { + return; + } + this.width = Math.max(width, 1); + this.height = Math.max(height, 1); + this.annotationRenderer.setSize(width, height); + this.aspect = this.width / this.height; + if (this.externalRenderer != null) { + const dpr = window.devicePixelRatio; + this.externalRenderer.resize(width * dpr, height * dpr); + } + this.queueRender(); + } + markBakedShadow(mesh) { + mesh.userData.noHit = true; + this.bakedShadows.add(mesh); + } + unmarkBakedShadow(mesh) { + mesh.userData.noHit = false; + mesh.visible = true; + this.bakedShadows.delete(mesh); + this.boundingBox.expandByObject(mesh); + } + findBakedShadows(group) { + const boundingBox = new Box3(); + group.traverse((object) => { + const mesh = object; + if (!mesh.material) { + return; + } + const material = mesh.material; + if (!material.transparent) { + return; + } + boundingBox.setFromObject(mesh); + const size = boundingBox.getSize(vector3); + const minDim = Math.min(size.x, size.y, size.z); + const maxDim = Math.max(size.x, size.y, size.z); + if (maxDim < MIN_SHADOW_RATIO * minDim) { + return; + } + this.markBakedShadow(mesh); + }); + } + checkBakedShadows() { + const { min, max } = this.boundingBox; + const shadowBox = new Box3(); + this.boundingBox.getSize(this.size); + for (const mesh of this.bakedShadows) { + shadowBox.setFromObject(mesh); + if (shadowBox.min.y < min.y + this.size.y / MIN_SHADOW_RATIO && + shadowBox.min.x <= min.x && shadowBox.max.x >= max.x && + shadowBox.min.z <= min.z && shadowBox.max.z >= max.z) { + // floor shadow + continue; + } + if (shadowBox.min.z < min.z + this.size.z / MIN_SHADOW_RATIO && + shadowBox.min.x <= min.x && shadowBox.max.x >= max.x && + shadowBox.min.y <= min.y && shadowBox.max.y >= max.y) { + // wall shadow + continue; + } + this.unmarkBakedShadow(mesh); + } + } + applyTransform() { + const { model } = this; + if (model == null) { + return; + } + const orientation = parseExpressions(this.element.orientation)[0] + .terms; + const roll = normalizeUnit(orientation[0]).number; + const pitch = normalizeUnit(orientation[1]).number; + const yaw = normalizeUnit(orientation[2]).number; + model.quaternion.setFromEuler(new Euler(pitch, yaw, roll, 'YXZ')); + const scale = parseExpressions(this.element.scale)[0] + .terms; + model.scale.set(scale[0].number, scale[1].number, scale[2].number); + } + updateBoundingBox() { + const { model } = this; + if (model == null) { + return; + } + this.target.remove(model); + this.findBakedShadows(model); + const bound = (box, vertex) => { + return box.expandByPoint(vertex); + }; + this.setBakedShadowVisibility(false); + this.boundingBox = reduceVertices(model, bound, new Box3()); + // If there's nothing but the baked shadow, then it's not a baked shadow. + if (this.boundingBox.isEmpty()) { + this.setBakedShadowVisibility(true); + this.bakedShadows.forEach((mesh) => this.unmarkBakedShadow(mesh)); + this.boundingBox = reduceVertices(model, bound, new Box3()); + } + this.checkBakedShadows(); + this.setBakedShadowVisibility(); + this.boundingBox.getSize(this.size); + this.target.add(model); + } + /** + * Calculates the boundingSphere and idealAspect that allows the 3D + * object to be framed tightly in a 2D window of any aspect ratio without + * clipping at any camera orbit. The camera's center target point can be + * optionally specified. If no center is specified, it defaults to the center + * of the bounding box, which means asymmetric models will tend to be tight on + * one side instead of both. Proper choice of center can correct this. + */ + async updateFraming() { + const { model } = this; + if (model == null) { + return; + } + this.target.remove(model); + this.setBakedShadowVisibility(false); + const { center } = this.boundingSphere; + this.element.requestUpdate('cameraTarget'); + await this.element.updateComplete; + center.copy(this.getTarget()); + const radiusSquared = (value, vertex) => { + return Math.max(value, center.distanceToSquared(vertex)); + }; + this.boundingSphere.radius = + Math.sqrt(reduceVertices(model, radiusSquared, 0)); + const horizontalTanFov = (value, vertex) => { + vertex.sub(center); + const radiusXZ = Math.sqrt(vertex.x * vertex.x + vertex.z * vertex.z); + return Math.max(value, radiusXZ / (this.idealCameraDistance() - Math.abs(vertex.y))); + }; + this.idealAspect = reduceVertices(model, horizontalTanFov, 0) / + Math.tan((this.framedFoVDeg / 2) * Math.PI / 180); + this.setBakedShadowVisibility(); + this.target.add(model); + } + setBakedShadowVisibility(visible = this.shadowIntensity <= 0) { + for (const shadow of this.bakedShadows) { + shadow.visible = visible; + } + } + idealCameraDistance() { + const halfFovRad = (this.framedFoVDeg / 2) * Math.PI / 180; + return this.boundingSphere.radius / Math.sin(halfFovRad); + } + /** + * Set's the framedFieldOfView based on the aspect ratio of the window in + * order to keep the model fully visible at any camera orientation. + */ + adjustedFoV(fovDeg) { + const vertical = Math.tan((fovDeg / 2) * Math.PI / 180) * + Math.max(1, this.idealAspect / this.aspect); + return 2 * Math.atan(vertical) * 180 / Math.PI; + } + getNDC(clientX, clientY) { + if (this.xrCamera != null) { + ndc.set(clientX / window.screen.width, clientY / window.screen.height); + } + else { + const rect = this.element.getBoundingClientRect(); + ndc.set((clientX - rect.x) / this.width, (clientY - rect.y) / this.height); + } + ndc.multiplyScalar(2).subScalar(1); + ndc.y *= -1; + return ndc; + } + /** + * Returns the size of the corresponding canvas element. + */ + getSize() { + return { width: this.width, height: this.height }; + } + setEnvironmentAndSkybox(environment, skybox) { + if (this.element[$renderer].arRenderer.presentedScene === this) { + return; + } + this.environment = environment; + this.setBackground(skybox); + this.queueRender(); + } + setBackground(skybox) { + this.groundedSkybox.map = skybox; + if (this.groundedSkybox.isUsable()) { + this.target.add(this.groundedSkybox); + this.background = null; + } + else { + this.target.remove(this.groundedSkybox); + this.background = skybox; + } + } + farRadius() { + return this.boundingSphere.radius * + (this.groundedSkybox.parent != null ? GROUNDED_SKYBOX_SIZE : 1); + } + setGroundedSkybox() { + const heightNode = parseExpressions(this.element.skyboxHeight)[0].terms[0]; + const height = normalizeUnit(heightNode).number; + const radius = GROUNDED_SKYBOX_SIZE * this.boundingSphere.radius; + this.groundedSkybox.updateGeometry(height, radius); + this.groundedSkybox.position.y = + height - (this.shadow ? 2 * this.shadow.gap() : 0); + this.setBackground(this.groundedSkybox.map); + } + /** + * Sets the point in model coordinates the model should orbit/pivot around. + */ + setTarget(modelX, modelY, modelZ) { + this.goalTarget.set(-modelX, -modelY, -modelZ); + } + /** + * Set the decay time of, affects the speed of target transitions. + */ + setTargetDamperDecayTime(decayMilliseconds) { + this.targetDamperX.setDecayTime(decayMilliseconds); + this.targetDamperY.setDecayTime(decayMilliseconds); + this.targetDamperZ.setDecayTime(decayMilliseconds); + } + /** + * Gets the point in model coordinates the model should orbit/pivot around. + */ + getTarget() { + return this.goalTarget.clone().multiplyScalar(-1); + } + /** + * Gets the current target point, which may not equal the goal returned by + * getTarget() due to finite input decay smoothing. + */ + getDynamicTarget() { + return this.target.position.clone().multiplyScalar(-1); + } + /** + * Shifts the model to the target point immediately instead of easing in. + */ + jumpToGoal() { + this.updateTarget(SETTLING_TIME); + } + /** + * This should be called every frame with the frame delta to cause the target + * to transition to its set point. + */ + updateTarget(delta) { + const goal = this.goalTarget; + const target = this.target.position; + if (!goal.equals(target)) { + const normalization = this.boundingSphere.radius / 10; + let { x, y, z } = target; + x = this.targetDamperX.update(x, goal.x, delta, normalization); + y = this.targetDamperY.update(y, goal.y, delta, normalization); + z = this.targetDamperZ.update(z, goal.z, delta, normalization); + this.groundedSkybox.position.x = -x; + this.groundedSkybox.position.z = -z; + this.target.position.set(x, y, z); + this.target.updateMatrixWorld(); + this.queueRender(); + return true; + } + else { + return false; + } + } + /** + * Yaw the +z (front) of the model toward the indicated world coordinates. + */ + pointTowards(worldX, worldZ) { + const { x, z } = this.position; + this.yaw = Math.atan2(worldX - x, worldZ - z); + } + get model() { + return this._model; + } + /** + * Yaw is the scene's orientation about the y-axis, around the rotation + * center. + */ + set yaw(radiansY) { + this.pivot.rotation.y = radiansY; + this.groundedSkybox.rotation.y = -radiansY; + this.queueRender(); + } + get yaw() { + return this.pivot.rotation.y; + } + set animationTime(value) { + this.mixer.setTime(value); + this.queueShadowRender(); + } + get animationTime() { + if (this.currentAnimationAction != null) { + const loopCount = Math.max(this.currentAnimationAction._loopCount, 0); + if (this.currentAnimationAction.loop === LoopPingPong && + (loopCount & 1) === 1) { + return this.duration - this.currentAnimationAction.time; + } + else { + return this.currentAnimationAction.time; + } + } + return 0; + } + set animationTimeScale(value) { + this.mixer.timeScale = value; + } + get animationTimeScale() { + return this.mixer.timeScale; + } + get duration() { + if (this.currentAnimationAction != null && + this.currentAnimationAction.getClip()) { + return this.currentAnimationAction.getClip().duration; + } + return 0; + } + get hasActiveAnimation() { + return this.currentAnimationAction != null; + } + /** + * Plays an animation if there are any associated with the current model. + * Accepts an optional string name of an animation to play. If no name is + * provided, or if no animation is found by the given name, always falls back + * to playing the first animation. + */ + playAnimation(name = null, crossfadeTime = 0, loopMode = LoopRepeat, repetitionCount = Infinity) { + if (this._currentGLTF == null) { + return; + } + const { animations } = this; + if (animations == null || animations.length === 0) { + return; + } + let animationClip = null; + if (name != null) { + animationClip = this.animationsByName.get(name); + if (animationClip == null) { + const parsedAnimationIndex = parseInt(name); + if (!isNaN(parsedAnimationIndex) && parsedAnimationIndex >= 0 && + parsedAnimationIndex < animations.length) { + animationClip = animations[parsedAnimationIndex]; + } + } + } + if (animationClip == null) { + animationClip = animations[0]; + } + try { + const { currentAnimationAction: lastAnimationAction } = this; + const action = this.mixer.clipAction(animationClip, this); + // Reset animationAction timeScale + if (action.timeScale != this.element.timeScale) { + action.timeScale = this.element.timeScale; + } + this.currentAnimationAction = action; + if (this.element.paused) { + this.mixer.stopAllAction(); + } + else { + action.paused = false; + if (lastAnimationAction != null && action !== lastAnimationAction) { + action.crossFadeFrom(lastAnimationAction, crossfadeTime, false); + } + else if (this.animationTimeScale > 0 && + this.animationTime == this.duration) { + // This is a workaround for what I believe is a three.js bug. + this.animationTime = 0; + } + } + action.setLoop(loopMode, repetitionCount); + action.enabled = true; + action.clampWhenFinished = true; + action.play(); + } + catch (error) { + console.error(error); + } + } + appendAnimation(name = '', loopMode = LoopRepeat, repetitionCount = Infinity, weight = 1, timeScale = 1, fade = false, warp = false, relativeWarp = true, time = null, needsToStop = false) { + if (this._currentGLTF == null || name === this.element.animationName) { + return; + } + const { animations } = this; + if (animations == null || animations.length === 0) { + return; + } + let animationClip = null; + const defaultFade = 1.25; + if (name) { + animationClip = this.animationsByName.get(name); + } + if (animationClip == null) { + return; + } + // validate function parameters + if (typeof repetitionCount === 'string') { + if (!isNaN(repetitionCount)) { + repetitionCount = Math.max(parseInt(repetitionCount), 1); + } + else { + repetitionCount = Infinity; + console.warn('Invalid repetitionCount value, repetitionCount is set to Infinity'); + } + } + else if (typeof repetitionCount === 'number' && repetitionCount < 1) { + repetitionCount = 1; + } + if (repetitionCount === 1 && loopMode !== LoopOnce) { + loopMode = LoopOnce; + } + if (typeof weight === 'string') { + if (!isNaN(weight)) { + weight = parseFloat(weight); + } + else { + weight = 1; + console.warn('Invalid weight value, weight is set to 1'); + } + } + if (typeof timeScale === 'string') { + if (!isNaN(timeScale)) { + timeScale = parseFloat(timeScale); + } + else { + timeScale = 1; + console.warn('Invalid timeScale value, timeScale is set to 1'); + } + } + if (typeof fade === 'string') { + // @ts-ignore: Unreachable code error + if (fade.toLowerCase().trim() === 'true') { + fade = true; + // @ts-ignore: Unreachable code error + } + else if (fade.toLowerCase().trim() === 'false') { + fade = false; + } + else if (!isNaN(fade)) { + fade = parseFloat(fade); + } + else { + fade = false; + console.warn('Invalid fade value, fade is set to false'); + } + } + if (typeof warp === 'string') { + // @ts-ignore: Unreachable code error + if (warp.toLowerCase().trim() === 'true') { + warp = true; + // @ts-ignore: Unreachable code error + } + else if (warp.toLowerCase().trim() === 'false') { + warp = false; + } + else if (!isNaN(warp)) { + warp = parseFloat(warp); + } + else { + warp = false; + console.warn('Invalid warp value, warp is set to false'); + } + } + if (typeof time === 'string') { + if (!isNaN(time)) { + time = parseFloat(time); + } + } + try { + const action = this.mixer.existingAction(animationClip) || + this.mixer.clipAction(animationClip, this); + const currentTimeScale = action.timeScale; + if (needsToStop && this.appendedAnimations.includes(name)) { + if (!this.markedAnimations.map(e => e.name).includes(name)) { + this.markedAnimations.push({ name, loopMode, repetitionCount }); + } + } + if (typeof time === 'number') { + action.time = Math.min(Math.max(time, 0), animationClip.duration); + } + if (typeof fade === 'boolean' && fade) { + action.fadeIn(defaultFade); + } + else if (typeof fade === 'number') { + action.fadeIn(Math.max(fade, 0)); + } + else { + if (weight >= 0) { + action.weight = Math.min(Math.max(weight, 0), 1); + } + } + if (typeof warp === 'boolean' && warp) { + action.warp(relativeWarp ? currentTimeScale : 0, timeScale, defaultFade); + } + else if (typeof warp === 'number') { + action.warp(relativeWarp ? currentTimeScale : 0, timeScale, Math.max(warp, 0)); + } + else { + action.timeScale = timeScale; + } + if (!action.isRunning()) { + if (action.time == animationClip.duration) { + action.stop(); + } + action.setLoop(loopMode, repetitionCount); + action.paused = false; + action.enabled = true; + action.clampWhenFinished = true; + action.play(); + } + if (!this.appendedAnimations.includes(name)) { + this.element[$scene].appendedAnimations.push(name); + } + } + catch (error) { + console.error(error); + } + } + detachAnimation(name = '', fade = true) { + if (this._currentGLTF == null || name === this.element.animationName) { + return; + } + const { animations } = this; + if (animations == null || animations.length === 0) { + return; + } + let animationClip = null; + const defaultFade = 1.5; + if (name) { + animationClip = this.animationsByName.get(name); + } + if (animationClip == null) { + return; + } + if (typeof fade === 'string') { + // @ts-ignore: Unreachable code error + if (fade.toLowerCase().trim() === 'true') { + fade = true; + // @ts-ignore: Unreachable code error + } + else if (fade.toLowerCase().trim() === 'false') { + fade = false; + } + else if (!isNaN(fade)) { + fade = parseFloat(fade); + } + else { + fade = true; + console.warn('Invalid fade value, fade is set to true'); + } + } + try { + const action = this.mixer.existingAction(animationClip) || + this.mixer.clipAction(animationClip, this); + if (typeof fade === 'boolean' && fade) { + action.fadeOut(defaultFade); + } + else if (typeof fade === 'number') { + action.fadeOut(Math.max(fade, 0)); + } + else { + action.stop(); + } + const result = this.element[$scene].appendedAnimations.filter(i => i !== name); + this.element[$scene].appendedAnimations = result; + } + catch (error) { + console.error(error); + } + } + updateAnimationLoop(name = '', loopMode = LoopRepeat, repetitionCount = Infinity) { + if (this._currentGLTF == null || name === this.element.animationName) { + return; + } + const { animations } = this; + if (animations == null || animations.length === 0) { + return; + } + let animationClip = null; + if (name) { + animationClip = this.animationsByName.get(name); + } + if (animationClip == null) { + return; + } + try { + const action = this.mixer.existingAction(animationClip) || + this.mixer.clipAction(animationClip, this); + action.stop(); + action.setLoop(loopMode, repetitionCount); + action.play(); + } + catch (error) { + console.error(error); + } + } + stopAnimation() { + this.currentAnimationAction = null; + this.mixer.stopAllAction(); + } + updateAnimation(step) { + this.mixer.update(step); + this.queueShadowRender(); + } + subscribeMixerEvent(event, callback) { + this.mixer.addEventListener(event, callback); + } + /** + * Call if the object has been changed in such a way that the shadow's + * shape has changed (not a rotation about the Y axis). + */ + updateShadow() { + const shadow = this.shadow; + if (shadow != null) { + const side = this.element.arPlacement === 'wall' ? 'back' : + this.element.arPlacement === 'ceiling' ? 'top' : 'bottom'; + shadow.setScene(this, this.shadowSoftness, side); + shadow.needsUpdate = true; + } + } + renderShadow(renderer) { + const shadow = this.shadow; + if (shadow != null && shadow.needsUpdate == true) { + shadow.render(renderer, this); + shadow.needsUpdate = false; + } + } + queueShadowRender() { + if (this.shadow != null) { + this.shadow.needsUpdate = true; + } + } + /** + * Sets the shadow's intensity, lazily creating the shadow as necessary. + */ + setShadowIntensity(shadowIntensity) { + this.shadowIntensity = shadowIntensity; + if (this._currentGLTF == null) { + return; + } + this.setBakedShadowVisibility(); + if (shadowIntensity <= 0 && this.shadow == null) { + return; + } + if (this.shadow == null) { + const side = this.element.arPlacement === 'wall' ? 'back' : 'bottom'; + this.shadow = new Shadow(this, this.shadowSoftness, side); + } + this.shadow.setIntensity(shadowIntensity); + } + /** + * Sets the shadow's softness by mapping a [0, 1] softness parameter to + * the shadow's resolution. This involves reallocation, so it should not + * be changed frequently. Softer shadows are cheaper to render. + */ + setShadowSoftness(softness) { + this.shadowSoftness = softness; + const shadow = this.shadow; + if (shadow != null) { + shadow.setSoftness(softness); + } + } + /** + * Shift the floor vertically from the bottom of the model's bounding box + * by offset (should generally be negative). + */ + setShadowOffset(offset) { + const shadow = this.shadow; + if (shadow != null) { + shadow.setOffset(offset); + } + } + getHit(object = this) { + const hits = raycaster.intersectObject(object, true); + return hits.find((hit) => hit.object.visible && !hit.object.userData.noHit); + } + hitFromController(controller, object = this) { + raycaster.setFromXRController(controller); + return this.getHit(object); + } + hitFromPoint(ndcPosition, object = this) { + raycaster.setFromCamera(ndcPosition, this.getCamera()); + return this.getHit(object); + } + /** + * This method returns the world position, model-space normal and texture + * coordinate of the point on the mesh corresponding to the input pixel + * coordinates given relative to the model-viewer element. If the mesh + * is not hit, the result is null. + */ + positionAndNormalFromPoint(ndcPosition, object = this) { + var _a; + const hit = this.hitFromPoint(ndcPosition, object); + if (hit == null) { + return null; + } + const position = hit.point; + const normal = hit.face != null ? + hit.face.normal.clone().applyNormalMatrix(new Matrix3().getNormalMatrix(hit.object.matrixWorld)) : + raycaster.ray.direction.clone().multiplyScalar(-1); + const uv = (_a = hit.uv) !== null && _a !== void 0 ? _a : null; + return { position, normal, uv }; + } + /** + * This method returns a dynamic hotspot ID string of the point on the + * mesh corresponding to the input pixel coordinates given relative to the + * model-viewer element. The ID string can be used in the data-surface + * attribute of the hotspot to make it follow this point on the surface + * even as the model animates. If the mesh is not hit, the result is null. + */ + surfaceFromPoint(ndcPosition, object = this) { + const model = this.element.model; + if (model == null) { + return null; + } + const hit = this.hitFromPoint(ndcPosition, object); + if (hit == null || hit.face == null) { + return null; + } + const node = model[$nodeFromPoint](hit); + const { meshes, primitives } = node.mesh.userData.associations; + const va = new Vector3(); + const vb = new Vector3(); + const vc = new Vector3(); + const { a, b, c } = hit.face; + const mesh = hit.object; + mesh.getVertexPosition(a, va); + mesh.getVertexPosition(b, vb); + mesh.getVertexPosition(c, vc); + const tri = new Triangle(va, vb, vc); + const uvw = new Vector3(); + tri.getBarycoord(mesh.worldToLocal(hit.point), uvw); + return `${meshes} ${primitives} ${a} ${b} ${c} ${uvw.x.toFixed(3)} ${uvw.y.toFixed(3)} ${uvw.z.toFixed(3)}`; + } + /** + * The following methods are for operating on the set of Hotspot objects + * attached to the scene. These come from DOM elements, provided to slots + * by the Annotation Mixin. + */ + addHotspot(hotspot) { + this.target.add(hotspot); + // This happens automatically in render(), but we do it early so that + // the slots appear in the shadow DOM and the elements get attached, + // allowing us to dispatch events on them. + this.annotationRenderer.domElement.appendChild(hotspot.element); + this.updateSurfaceHotspot(hotspot); + } + removeHotspot(hotspot) { + this.target.remove(hotspot); + } + /** + * Helper method to apply a function to all hotspots. + */ + forHotspots(func) { + const { children } = this.target; + for (let i = 0, l = children.length; i < l; i++) { + const hotspot = children[i]; + if (hotspot instanceof Hotspot) { + func(hotspot); + } + } + } + /** + * Lazy initializer for surface hotspots - will only run once. + */ + updateSurfaceHotspot(hotspot) { + if (hotspot.surface == null || this.element.model == null) { + return; + } + const nodes = parseExpressions(hotspot.surface)[0].terms; + if (nodes.length != 8) { + console.warn(hotspot.surface + ' does not have exactly 8 numbers.'); + return; + } + const primitiveNode = this.element.model[$nodeFromIndex](nodes[0].number, nodes[1].number); + if (primitiveNode == null) { + console.warn(hotspot.surface + + ' does not match a node/primitive in this glTF! Skipping this hotspot.'); + return; + } + const numVert = primitiveNode.mesh.geometry.attributes.position.count; + const tri = new Vector3(nodes[2].number, nodes[3].number, nodes[4].number); + if (tri.x >= numVert || tri.y >= numVert || tri.z >= numVert) { + console.warn(hotspot.surface + + ' vertex indices out of range in this glTF! Skipping this hotspot.'); + return; + } + const bary = new Vector3(nodes[5].number, nodes[6].number, nodes[7].number); + hotspot.mesh = primitiveNode.mesh; + hotspot.tri = tri; + hotspot.bary = bary; + hotspot.updateSurface(); + } + /** + * Update positions of surface hotspots to follow model animation. + */ + animateSurfaceHotspots() { + if (this.element.paused) { + return; + } + this.forHotspots((hotspot) => { + hotspot.updateSurface(); + }); + } + /** + * Update the CSS visibility of the hotspots based on whether their + * normals point toward the camera. + */ + updateHotspotsVisibility(viewerPosition) { + this.forHotspots((hotspot) => { + view.copy(viewerPosition); + target.setFromMatrixPosition(hotspot.matrixWorld); + view.sub(target); + normalWorld.copy(hotspot.normal) + .transformDirection(this.target.matrixWorld); + if (view.dot(normalWorld) < 0) { + hotspot.hide(); + } + else { + hotspot.show(); + } + }); + } + /** + * Rotate all hotspots to an absolute orientation given by the input + * number of radians. Zero returns them to upright. + */ + orientHotspots(radians) { + this.forHotspots((hotspot) => { + hotspot.orient(radians); + }); + } + /** + * Set the rendering visibility of all hotspots. This is used to hide them + * during transitions and such. + */ + setHotspotsVisibility(visible) { + this.forHotspots((hotspot) => { + hotspot.visible = visible; + }); + } + updateSchema(src) { + var _a; + const { schemaElement, element } = this; + const { alt, poster, iosSrc } = element; + if (src != null) { + const encoding = [{ + '@type': 'MediaObject', + contentUrl: src, + encodingFormat: ((_a = src.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'gltf' ? + 'model/gltf+json' : + 'model/gltf-binary' + }]; + if (iosSrc) { + encoding.push({ + '@type': 'MediaObject', + contentUrl: iosSrc, + encodingFormat: 'model/vnd.usdz+zip' + }); + } + const structuredData = { + '@context': 'http://schema.org/', + '@type': '3DModel', + image: poster !== null && poster !== void 0 ? poster : undefined, + name: alt !== null && alt !== void 0 ? alt : undefined, + encoding + }; + schemaElement.textContent = JSON.stringify(structuredData); + document.head.appendChild(schemaElement); + } + else if (schemaElement.parentElement != null) { + schemaElement.parentElement.removeChild(schemaElement); + } + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * ProgressTracker is an event emitter that helps to track the ongoing progress + * of many simultaneous actions. + * + * ProgressTracker reports progress activity in the form of a progress event. + * The event.detail.totalProgress value indicates the elapsed progress of all + * activities being tracked by the ProgressTracker. + * + * The value of totalProgress is a number that progresses from 0 to 1. The + * ProgressTracker allows for the lazy accumulation of tracked actions, so the + * total progress represents an abstract, non-absolute progress towards the + * completion of all currently tracked events. + * + * When all currently tracked activities are finished, the ProgressTracker + * emits one final progress event and then resets the list of its currently + * tracked activities. This means that from an observer's perspective, + * ongoing activities will accumulate and collectively contribute to the notion + * of total progress until all currently tracked ongoing activities have + * completed. + */ +class ProgressTracker extends EventTarget { + constructor() { + super(...arguments); + this.ongoingActivities = new Set(); + this.totalProgress = 0; + } + /** + * The total number of activities currently being tracked. + */ + get ongoingActivityCount() { + return this.ongoingActivities.size; + } + /** + * Registers a new activity to be tracked by the progress tracker. The method + * returns a special callback that should be invoked whenever new progress is + * ready to be reported. The progress should be reported as a value between 0 + * and 1, where 0 would represent the beginning of the action and 1 would + * represent its completion. + * + * There is no built-in notion of a time-out for ongoing activities, so once + * an ongoing activity is begun, it is up to the consumer of this API to + * update the progress until that activity is no longer ongoing. + * + * Progress is only allowed to move forward for any given activity. If a lower + * progress is reported than the previously reported progress, it will be + * ignored. + */ + beginActivity(reason) { + const activity = { progress: 0, completed: false }; + this.ongoingActivities.add(activity); + if (this.ongoingActivityCount === 1) { + // Announce the first progress event (which should always be 0 / 1 + // total progress): + this.announceTotalProgress(activity, 0, reason); + } + return (progress) => { + let nextProgress; + nextProgress = Math.max(clamp(progress, 0, 1), activity.progress); + if (nextProgress !== activity.progress) { + this.announceTotalProgress(activity, nextProgress, reason); + } + return activity.progress; + }; + } + announceTotalProgress(updatedActivity, nextProgress, reason) { + let progressLeft = 0; + let completedActivities = 0; + if (nextProgress == 1.0) + updatedActivity.completed = true; + for (const activity of this.ongoingActivities) { + const { progress } = activity; + progressLeft += 1.0 - progress; + if (activity.completed) { + completedActivities++; + } + } + const lastProgress = updatedActivity.progress; + updatedActivity.progress = nextProgress; + // Advance the total progress by the fraction of total remaining progress + // due to this activity. + this.totalProgress += (nextProgress - lastProgress) * + (1.0 - this.totalProgress) / progressLeft; + const totalProgress = completedActivities === this.ongoingActivityCount ? + 1.0 : + this.totalProgress; + this.dispatchEvent(new CustomEvent('progress', { detail: { totalProgress, reason } })); + if (completedActivities === this.ongoingActivityCount) { + this.totalProgress = 0.0; + this.ongoingActivities.clear(); + } + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$4 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var _a$1, _b$1, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; +const CLEAR_MODEL_TIMEOUT_MS = 10; +const FALLBACK_SIZE_UPDATE_THRESHOLD_MS = 50; +const ANNOUNCE_MODEL_VISIBILITY_DEBOUNCE_THRESHOLD = 0; +const UNSIZED_MEDIA_WIDTH = 300; +const UNSIZED_MEDIA_HEIGHT = 150; +const blobCanvas = document.createElement('canvas'); +const $fallbackResizeHandler = Symbol('fallbackResizeHandler'); +const $defaultAriaLabel = Symbol('defaultAriaLabel'); +const $resizeObserver = Symbol('resizeObserver'); +const $clearModelTimeout = Symbol('clearModelTimeout'); +const $onContextLost = Symbol('onContextLost'); +const $loaded = Symbol('loaded'); +const $status = Symbol('status'); +const $onFocus = Symbol('onFocus'); +const $onBlur = Symbol('onBlur'); +const $updateSize = Symbol('updateSize'); +const $intersectionObserver = Symbol('intersectionObserver'); +const $isElementInViewport = Symbol('isElementInViewport'); +const $announceModelVisibility = Symbol('announceModelVisibility'); +const $ariaLabel = Symbol('ariaLabel'); +const $altDefaulted = Symbol('altDefaulted'); +const $statusElement = Symbol('statusElement'); +const $updateStatus = Symbol('updateStatus'); +const $loadedTime = Symbol('loadedTime'); +const $updateSource = Symbol('updateSource'); +const $markLoaded = Symbol('markLoaded'); +const $container = Symbol('container'); +const $userInputElement = Symbol('input'); +const $canvas = Symbol('canvas'); +const $scene = Symbol('scene'); +const $needsRender = Symbol('needsRender'); +const $tick = Symbol('tick'); +const $onModelLoad = Symbol('onModelLoad'); +const $onResize = Symbol('onResize'); +const $renderer = Symbol('renderer'); +const $progressTracker = Symbol('progressTracker'); +const $getLoaded = Symbol('getLoaded'); +const $getModelIsVisible = Symbol('getModelIsVisible'); +const $shouldAttemptPreload = Symbol('shouldAttemptPreload'); +const toVector3D = (v) => { + return { + x: v.x, + y: v.y, + z: v.z, + toString() { + return `${this.x}m ${this.y}m ${this.z}m`; + } + }; +}; +const toVector2D = (v) => { + return { + u: v.x, + v: v.y, + toString() { + return `${this.u} ${this.v}`; + } + }; +}; +/** + * Definition for a basic element. + */ +class ModelViewerElementBase extends ReactiveElement { + static get is() { + return 'model-viewer'; + } + /** @export */ + static set modelCacheSize(value) { + CachingGLTFLoader[$evictionPolicy].evictionThreshold = value; + } + /** @export */ + static get modelCacheSize() { + return CachingGLTFLoader[$evictionPolicy].evictionThreshold; + } + /** @export */ + static set minimumRenderScale(value) { + if (value > 1) { + console.warn(' minimumRenderScale has been clamped to a maximum value of 1.'); + } + if (value <= 0) { + console.warn(' minimumRenderScale has been clamped to a minimum value of 0.25.'); + } + Renderer.singleton.minScale = value; + } + /** @export */ + static get minimumRenderScale() { + return Renderer.singleton.minScale; + } + /** @export */ + get loaded() { + return this[$getLoaded](); + } + get [(_a$1 = $isElementInViewport, _b$1 = $loaded, _c = $loadedTime, _d = $status, _e = $clearModelTimeout, _f = $fallbackResizeHandler, _g = $announceModelVisibility, _h = $resizeObserver, _j = $intersectionObserver, _k = $progressTracker, $renderer)]() { + return Renderer.singleton; + } + /** @export */ + get modelIsVisible() { + return this[$getModelIsVisible](); + } + /** + * Creates a new ModelViewerElement. + */ + constructor() { + super(); + this.alt = null; + this.src = null; + this.withCredentials = false; + /** + * Generates a 3D model schema https://schema.org/3DModel associated with + * the loaded src and inserts it into the header of the page for search + * engines to crawl. + */ + this.generateSchema = false; + this[_a$1] = false; + this[_b$1] = false; + this[_c] = 0; + this[_d] = ''; + this[_e] = null; + this[_f] = debounce(() => { + const boundingRect = this.getBoundingClientRect(); + this[$updateSize](boundingRect); + }, FALLBACK_SIZE_UPDATE_THRESHOLD_MS); + this[_g] = debounce((oldVisibility) => { + const newVisibility = this.modelIsVisible; + if (newVisibility !== oldVisibility) { + this.dispatchEvent(new CustomEvent('model-visibility', { detail: { visible: newVisibility } })); + } + }, ANNOUNCE_MODEL_VISIBILITY_DEBOUNCE_THRESHOLD); + this[_h] = null; + this[_j] = null; + this[_k] = new ProgressTracker(); + this[_l] = () => { + this[$statusElement].textContent = this[$status]; + }; + this[_m] = () => { + this[$statusElement].textContent = ''; + }; + this[_o] = (event) => { + this.dispatchEvent(new CustomEvent('error', { detail: { type: 'webglcontextlost', sourceError: event.sourceEvent } })); + }; + this.attachShadow({ mode: 'open' }); + const shadowRoot = this.shadowRoot; + makeTemplate(shadowRoot); + this[$container] = shadowRoot.querySelector('.container'); + this[$userInputElement] = + shadowRoot.querySelector('.userInput'); + this[$canvas] = shadowRoot.querySelector('canvas'); + this[$statusElement] = + shadowRoot.querySelector('#status'); + this[$defaultAriaLabel] = + this[$userInputElement].getAttribute('aria-label'); + // Because of potential race conditions related to invoking the constructor + // we only use the bounding rect to set the initial size if the element is + // already connected to the document: + let width, height; + if (this.isConnected) { + const rect = this.getBoundingClientRect(); + width = rect.width; + height = rect.height; + } + else { + width = UNSIZED_MEDIA_WIDTH; + height = UNSIZED_MEDIA_HEIGHT; + } + // Create the underlying ModelScene. + this[$scene] = + new ModelScene({ canvas: this[$canvas], element: this, width, height }); + // Update initial size on microtask timing so that subclasses have a + // chance to initialize + Promise.resolve().then(() => { + this[$updateSize](this.getBoundingClientRect()); + }); + if (HAS_RESIZE_OBSERVER) { + // Set up a resize observer so we can scale our canvas + // if our changes + this[$resizeObserver] = + new ResizeObserver((entries) => { + // Don't resize anything if in AR mode; otherwise the canvas + // scaling to fullscreen on entering AR will clobber the flat/2d + // dimensions of the element. + if (this[$renderer].isPresenting) { + return; + } + for (let entry of entries) { + if (entry.target === this) { + this[$updateSize](entry.contentRect); + } + } + }); + } + if (HAS_INTERSECTION_OBSERVER) { + this[$intersectionObserver] = new IntersectionObserver(entries => { + for (let entry of entries) { + if (entry.target === this) { + const oldVisibility = this.modelIsVisible; + this[$isElementInViewport] = entry.isIntersecting; + this[$announceModelVisibility](oldVisibility); + if (this[$isElementInViewport] && !this.loaded) { + this[$updateSource](); + } + } + } + }, { + root: null, + // We used to have margin here, but it was causing animated models below + // the fold to steal the frame budget. Weirder still, it would also + // cause input events to be swallowed, sometimes for seconds on the + // model above the fold, but only when the animated model was completely + // below. Setting this margin to zero fixed it. + rootMargin: '0px', + // With zero threshold, an element adjacent to but not intersecting the + // viewport will be reported as intersecting, which will cause + // unnecessary rendering. Any slight positive threshold alleviates this. + threshold: 0.00001, + }); + } + else { + // If there is no intersection observer, then all models should be visible + // at all times: + this[$isElementInViewport] = true; + } + } + connectedCallback() { + super.connectedCallback && super.connectedCallback(); + if (HAS_RESIZE_OBSERVER) { + this[$resizeObserver].observe(this); + } + else { + self.addEventListener('resize', this[$fallbackResizeHandler]); + } + if (HAS_INTERSECTION_OBSERVER) { + this[$intersectionObserver].observe(this); + } + this.addEventListener('focus', this[$onFocus]); + this.addEventListener('blur', this[$onBlur]); + const renderer = this[$renderer]; + renderer.addEventListener('contextlost', this[$onContextLost]); + renderer.registerScene(this[$scene]); + if (this[$clearModelTimeout] != null) { + self.clearTimeout(this[$clearModelTimeout]); + this[$clearModelTimeout] = null; + // Force an update in case the model has been evicted from our GLTF cache + // @see https://lit-element.polymer-project.org/guide/lifecycle#requestupdate + this.requestUpdate('src', null); + } + } + disconnectedCallback() { + super.disconnectedCallback && super.disconnectedCallback(); + if (HAS_RESIZE_OBSERVER) { + this[$resizeObserver].unobserve(this); + } + else { + self.removeEventListener('resize', this[$fallbackResizeHandler]); + } + if (HAS_INTERSECTION_OBSERVER) { + this[$intersectionObserver].unobserve(this); + } + this.removeEventListener('focus', this[$onFocus]); + this.removeEventListener('blur', this[$onBlur]); + const renderer = this[$renderer]; + renderer.removeEventListener('contextlost', this[$onContextLost]); + renderer.unregisterScene(this[$scene]); + this[$clearModelTimeout] = self.setTimeout(() => { + this[$scene].dispose(); + this[$clearModelTimeout] = null; + }, CLEAR_MODEL_TIMEOUT_MS); + } + updated(changedProperties) { + super.updated(changedProperties); + // NOTE(cdata): If a property changes from values A -> B -> A in the space + // of a microtask, LitElement/UpdatingElement will notify of a change even + // though the value has effectively not changed, so we need to check to make + // sure that the value has actually changed before changing the loaded flag. + if (changedProperties.has('src')) { + if (this.src == null) { + this[$loaded] = false; + this[$loadedTime] = 0; + this[$scene].reset(); + } + else if (this.src !== this[$scene].url) { + this[$loaded] = false; + this[$loadedTime] = 0; + this[$updateSource](); + } + } + if (changedProperties.has('alt')) { + this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]); + } + if (changedProperties.has('generateSchema')) { + if (this.generateSchema) { + this[$scene].updateSchema(this.src); + } + else { + this[$scene].updateSchema(null); + } + } + } + /** @export */ + toDataURL(type, encoderOptions) { + return this[$renderer] + .displayCanvas(this[$scene]) + .toDataURL(type, encoderOptions); + } + /** @export */ + async toBlob(options) { + const mimeType = options ? options.mimeType : undefined; + const qualityArgument = options ? options.qualityArgument : undefined; + const useIdealAspect = options ? options.idealAspect : undefined; + const { width, height, idealAspect, aspect } = this[$scene]; + const { dpr, scaleFactor } = this[$renderer]; + let outputWidth = width * scaleFactor * dpr; + let outputHeight = height * scaleFactor * dpr; + let offsetX = 0; + let offsetY = 0; + if (useIdealAspect === true) { + if (idealAspect > aspect) { + const oldHeight = outputHeight; + outputHeight = Math.round(outputWidth / idealAspect); + offsetY = (oldHeight - outputHeight) / 2; + } + else { + const oldWidth = outputWidth; + outputWidth = Math.round(outputHeight * idealAspect); + offsetX = (oldWidth - outputWidth) / 2; + } + } + blobCanvas.width = outputWidth; + blobCanvas.height = outputHeight; + try { + return new Promise(async (resolve, reject) => { + blobCanvas.getContext('2d').drawImage(this[$renderer].displayCanvas(this[$scene]), offsetX, offsetY, outputWidth, outputHeight, 0, 0, outputWidth, outputHeight); + blobCanvas.toBlob((blob) => { + if (!blob) { + return reject(new Error('Unable to retrieve canvas blob')); + } + resolve(blob); + }, mimeType, qualityArgument); + }); + } + finally { + this[$updateSize]({ width, height }); + } + } + /** + * Registers a new EffectComposer as the main rendering pipeline, + * instead of the default ThreeJs renderer. + * This method also calls setRenderer, setMainScene, and setMainCamera on + * your effectComposer. + * @param effectComposer An EffectComposer from `pmndrs/postprocessing` + */ + registerEffectComposer(effectComposer) { + effectComposer.setRenderer(this[$renderer].threeRenderer); + effectComposer.setMainCamera(this[$scene].getCamera()); + effectComposer.setMainScene(this[$scene]); + this[$scene].effectRenderer = effectComposer; + } + /** + * Removes the registered EffectComposer + */ + unregisterEffectComposer() { + this[$scene].effectRenderer = null; + } + registerRenderer(renderer) { + this[$scene].externalRenderer = renderer; + } + unregisterRenderer() { + this[$scene].externalRenderer = null; + } + get [$ariaLabel]() { + return this[$altDefaulted]; + } + get [$altDefaulted]() { + return (this.alt == null || this.alt === 'null') ? this[$defaultAriaLabel] : + this.alt; + } + // NOTE(cdata): Although this may seem extremely redundant, it is required in + // order to support overloading when TypeScript is compiled to ES5 + // @see https://github.com/Polymer/lit-element/pull/745 + // @see https://github.com/microsoft/TypeScript/issues/338 + [$getLoaded]() { + return this[$loaded]; + } + // @see [$getLoaded] + [$getModelIsVisible]() { + return this.loaded && this[$isElementInViewport]; + } + [$shouldAttemptPreload]() { + return !!this.src && this[$isElementInViewport]; + } + /** + * Called on initialization and when the resize observer fires. + */ + [$updateSize]({ width, height }) { + if (width === 0 || height === 0) { + return; + } + this[$container].style.width = `${width}px`; + this[$container].style.height = `${height}px`; + this[$onResize]({ width, height }); + } + [$tick](time, delta) { + var _p; + (_p = this[$scene].effectRenderer) === null || _p === void 0 ? void 0 : _p.beforeRender(time, delta); + } + [$markLoaded]() { + if (this[$loaded]) { + return; + } + this[$loaded] = true; + this[$loadedTime] = performance.now(); + } + [$needsRender]() { + this[$scene].queueRender(); + } + [$onModelLoad]() { + } + [$updateStatus](status) { + this[$status] = status; + const rootNode = this.getRootNode(); + // Only change the aria-label if is currently focused: + if (rootNode != null && rootNode.activeElement === this && + this[$statusElement].textContent != status) { + this[$statusElement].textContent = status; + } + } + [(_l = $onFocus, _m = $onBlur, $onResize)](e) { + this[$scene].setSize(e.width, e.height); + } + /** + * Parses the element for an appropriate source URL and + * sets the views to use the new model based. + */ + async [(_o = $onContextLost, $updateSource)]() { + const scene = this[$scene]; + if (this.loaded || !this[$shouldAttemptPreload]() || + this.src === scene.url) { + return; + } + if (this.generateSchema) { + scene.updateSchema(this.src); + } + this[$updateStatus]('Loading'); + // If we are loading a new model, we need to stop the animation of + // the current one (if any is playing). Otherwise, we might lose + // the reference to the scene root and running actions start to + // throw exceptions and/or behave in unexpected ways: + scene.stopAnimation(); + const updateSourceProgress = this[$progressTracker].beginActivity('model-load'); + const source = this.src; + try { + const srcUpdated = scene.setSource(source, (progress) => updateSourceProgress(clamp(progress, 0, 1) * 0.95)); + const envUpdated = this[$updateEnvironment](); + await Promise.all([srcUpdated, envUpdated]); + this[$markLoaded](); + this[$onModelLoad](); + this.updateComplete.then(() => { + this.dispatchEvent(new CustomEvent('before-render')); + }); + // Wait for shaders to compile and pixels to be drawn. + await new Promise(resolve => { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + this.dispatchEvent(new CustomEvent('load', { detail: { url: source } })); + resolve(); + }); + }); + }); + } + catch (error) { + this.dispatchEvent(new CustomEvent('error', { detail: { type: 'loadfailure', sourceError: error } })); + } + finally { + updateSourceProgress(1.0); + } + } +} +__decorate$4([ + property({ type: String }) +], ModelViewerElementBase.prototype, "alt", void 0); +__decorate$4([ + property({ type: String }) +], ModelViewerElementBase.prototype, "src", void 0); +__decorate$4([ + property({ type: Boolean, attribute: 'with-credentials' }) +], ModelViewerElementBase.prototype, "withCredentials", void 0); +__decorate$4([ + property({ type: Boolean, attribute: 'generate-schema' }) +], ModelViewerElementBase.prototype, "generateSchema", void 0); + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$3 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +const MILLISECONDS_PER_SECOND = 1000.0; +const $changeAnimation = Symbol('changeAnimation'); +const $appendAnimation = Symbol('appendAnimation'); +const $detachAnimation = Symbol('detachAnimation'); +const $paused = Symbol('paused'); +const DEFAULT_PLAY_OPTIONS = { + repetitions: Infinity, + pingpong: false +}; +const DEFAULT_APPEND_OPTIONS = { + pingpong: false, + repetitions: null, + weight: 1, + timeScale: 1, + fade: false, + warp: false, + relativeWarp: true, + time: null +}; +const DEFAULT_DETACH_OPTIONS = { + fade: true +}; +const AnimationMixin = (ModelViewerElement) => { + var _a; + class AnimationModelViewerElement extends ModelViewerElement { + constructor(...args) { + super(args); + this.autoplay = false; + this.animationName = undefined; + this.animationCrossfadeDuration = 300; + this[_a] = true; + this[$scene].subscribeMixerEvent('loop', (e) => { + const count = e.action._loopCount; + const name = e.action._clip.name; + const uuid = e.action._clip.uuid; + const targetAnimation = this[$scene].markedAnimations.find(e => e.name === name); + if (targetAnimation) { + this[$scene].updateAnimationLoop(targetAnimation.name, targetAnimation.loopMode, targetAnimation.repetitionCount); + const filtredArr = this[$scene].markedAnimations.filter(e => e.name !== name); + this[$scene].markedAnimations = filtredArr; + } + this.dispatchEvent(new CustomEvent('loop', { detail: { count, name, uuid } })); + }); + this[$scene].subscribeMixerEvent('finished', (e) => { + if (!this[$scene].appendedAnimations.includes(e.action._clip.name)) { + this[$paused] = true; + } + else { + const filteredList = this[$scene].appendedAnimations.filter(i => i !== e.action._clip.name); + this[$scene].appendedAnimations = filteredList; + } + this.dispatchEvent(new CustomEvent('finished')); + }); + } + /** + * Returns an array + */ + get availableAnimations() { + if (this.loaded) { + return this[$scene].animationNames; + } + return []; + } + get duration() { + return this[$scene].duration; + } + get paused() { + return this[$paused]; + } + get currentTime() { + return this[$scene].animationTime; + } + get appendedAnimations() { + return this[$scene].appendedAnimations; + } + set currentTime(value) { + this[$scene].animationTime = value; + this[$needsRender](); + } + get timeScale() { + return this[$scene].animationTimeScale; + } + set timeScale(value) { + this[$scene].animationTimeScale = value; + } + pause() { + if (this[$paused]) { + return; + } + this[$paused] = true; + this.dispatchEvent(new CustomEvent('pause')); + } + play(options) { + if (this.availableAnimations.length > 0) { + this[$paused] = false; + this[$changeAnimation](options); + this.dispatchEvent(new CustomEvent('play')); + } + } + appendAnimation(animationName, options) { + if (this.availableAnimations.length > 0) { + this[$paused] = false; + this[$appendAnimation](animationName, options); + this.dispatchEvent(new CustomEvent('append-animation')); + } + } + detachAnimation(animationName, options) { + if (this.availableAnimations.length > 0) { + this[$paused] = false; + this[$detachAnimation](animationName, options); + this.dispatchEvent(new CustomEvent('detach-animation')); + } + } + [(_a = $paused, $onModelLoad)]() { + super[$onModelLoad](); + this[$paused] = true; + if (this.animationName != null) { + this[$changeAnimation](); + } + if (this.autoplay) { + this.play(); + } + } + [$tick](_time, delta) { + super[$tick](_time, delta); + if (this[$paused] || + (!this[$getModelIsVisible]() && !this[$renderer].isPresenting)) { + return; + } + this[$scene].updateAnimation(delta / MILLISECONDS_PER_SECOND); + this[$needsRender](); + } + updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('autoplay') && this.autoplay) { + this.play(); + } + if (changedProperties.has('animationName')) { + this[$changeAnimation](); + } + } + [$changeAnimation](options = DEFAULT_PLAY_OPTIONS) { + var _b; + const repetitions = (_b = options.repetitions) !== null && _b !== void 0 ? _b : Infinity; + const mode = options.pingpong ? + LoopPingPong : + (repetitions === 1 ? LoopOnce : LoopRepeat); + this[$scene].playAnimation(this.animationName, this.animationCrossfadeDuration / MILLISECONDS_PER_SECOND, mode, repetitions); + // If we are currently paused, we need to force a render so that + // the scene updates to the first frame of the new animation + if (this[$paused]) { + this[$scene].updateAnimation(0); + this[$needsRender](); + } + } + [$appendAnimation](animationName = '', options = DEFAULT_APPEND_OPTIONS) { + var _b; + const repetitions = (_b = options.repetitions) !== null && _b !== void 0 ? _b : Infinity; + const mode = options.pingpong ? + LoopPingPong : + (repetitions === 1 ? LoopOnce : LoopRepeat); + const needsToStop = !!options.repetitions || 'pingpong' in options; + this[$scene].appendAnimation(animationName ? animationName : this.animationName, mode, repetitions, options.weight, options.timeScale, options.fade, options.warp, options.relativeWarp, options.time, needsToStop); + // If we are currently paused, we need to force a render so that + // the scene updates to the first frame of the new animation + if (this[$paused]) { + this[$scene].updateAnimation(0); + this[$needsRender](); + } + } + [$detachAnimation](animationName = '', options = DEFAULT_DETACH_OPTIONS) { + this[$scene].detachAnimation(animationName ? animationName : this.animationName, options.fade); + // If we are currently paused, we need to force a render so that + // the scene updates to the first frame of the new animation + if (this[$paused]) { + this[$scene].updateAnimation(0); + this[$needsRender](); + } + } + } + __decorate$3([ + property({ type: Boolean }) + ], AnimationModelViewerElement.prototype, "autoplay", void 0); + __decorate$3([ + property({ type: String, attribute: 'animation-name' }) + ], AnimationModelViewerElement.prototype, "animationName", void 0); + __decorate$3([ + property({ type: Number, attribute: 'animation-crossfade-duration' }) + ], AnimationModelViewerElement.prototype, "animationCrossfadeDuration", void 0); + return AnimationModelViewerElement; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $hotspotMap = Symbol('hotspotMap'); +const $mutationCallback = Symbol('mutationCallback'); +const $observer = Symbol('observer'); +const $addHotspot = Symbol('addHotspot'); +const $removeHotspot = Symbol('removeHotspot'); +const worldToModel = new Matrix4(); +/** + * AnnotationMixin implements a declarative API to add hotspots and annotations. + * Child elements of the element that have a slot name that + * begins with "hotspot" and data-position and data-normal attributes in + * the format of the camera-target attribute will be added to the scene and + * track the specified model coordinates. + */ +const AnnotationMixin = (ModelViewerElement) => { + var _a, _b, _c; + class AnnotationModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this[_a] = new Map(); + this[_b] = (mutations) => { + mutations.forEach((mutation) => { + // NOTE: Be wary that in ShadyDOM cases, the MutationRecord + // only has addedNodes and removedNodes (and no other details). + if (!(mutation instanceof MutationRecord) || + mutation.type === 'childList') { + mutation.addedNodes.forEach((node) => { + this[$addHotspot](node); + }); + mutation.removedNodes.forEach((node) => { + this[$removeHotspot](node); + }); + this[$needsRender](); + } + }); + }; + this[_c] = new MutationObserver(this[$mutationCallback]); + } + connectedCallback() { + super.connectedCallback(); + for (let i = 0; i < this.children.length; ++i) { + this[$addHotspot](this.children[i]); + } + const { ShadyDOM } = self; + if (ShadyDOM == null) { + this[$observer].observe(this, { childList: true }); + } + else { + this[$observer] = + ShadyDOM.observeChildren(this, this[$mutationCallback]); + } + } + disconnectedCallback() { + super.disconnectedCallback(); + const { ShadyDOM } = self; + if (ShadyDOM == null) { + this[$observer].disconnect(); + } + else { + ShadyDOM.unobserveChildren(this[$observer]); + } + } + [(_a = $hotspotMap, _b = $mutationCallback, _c = $observer, $onModelLoad)]() { + super[$onModelLoad](); + const scene = this[$scene]; + scene.forHotspots((hotspot) => { + scene.updateSurfaceHotspot(hotspot); + }); + } + [$tick](time, delta) { + super[$tick](time, delta); + const scene = this[$scene]; + const { annotationRenderer } = scene; + const camera = scene.getCamera(); + if (scene.shouldRender()) { + scene.animateSurfaceHotspots(); + scene.updateHotspotsVisibility(camera.position); + annotationRenderer.domElement.style.display = ''; + annotationRenderer.render(scene, camera); + } + } + /** + * Since the data-position and data-normal attributes are not observed, use + * this method to move a hotspot. Keep in mind that all hotspots with the + * same slot name use a single location and the first definition takes + * precedence, until updated with this method. + */ + updateHotspot(config) { + const hotspot = this[$hotspotMap].get(config.name); + if (hotspot == null) { + return; + } + hotspot.updatePosition(config.position); + hotspot.updateNormal(config.normal); + hotspot.surface = config.surface; + this[$scene].updateSurfaceHotspot(hotspot); + this[$needsRender](); + } + /** + * This method returns in-scene data about a requested hotspot including + * its position in screen (canvas) space and its current visibility. + */ + queryHotspot(name) { + const hotspot = this[$hotspotMap].get(name); + if (hotspot == null) { + return null; + } + const position = toVector3D(hotspot.position); + const normal = toVector3D(hotspot.normal); + const facingCamera = hotspot.facingCamera; + const scene = this[$scene]; + const camera = scene.getCamera(); + const vector = new Vector3(); + vector.setFromMatrixPosition(hotspot.matrixWorld); + vector.project(camera); + const widthHalf = scene.width / 2; + const heightHalf = scene.height / 2; + vector.x = (vector.x * widthHalf) + widthHalf; + vector.y = -(vector.y * heightHalf) + heightHalf; + const canvasPosition = toVector3D(new Vector3(vector.x, vector.y, vector.z)); + if (!Number.isFinite(canvasPosition.x) || + !Number.isFinite(canvasPosition.y)) { + return null; + } + return { position, normal, canvasPosition, facingCamera }; + } + /** + * This method returns the model position, normal and texture coordinate + * of the point on the mesh corresponding to the input pixel coordinates + * given relative to the model-viewer element. The position and normal + * are returned as strings in the format suitable for putting in a + * hotspot's data-position and data-normal attributes. If the mesh is + * not hit, the result is null. + */ + positionAndNormalFromPoint(pixelX, pixelY) { + const scene = this[$scene]; + const ndcPosition = scene.getNDC(pixelX, pixelY); + const hit = scene.positionAndNormalFromPoint(ndcPosition); + if (hit == null) { + return null; + } + worldToModel.copy(scene.target.matrixWorld).invert(); + const position = toVector3D(hit.position.applyMatrix4(worldToModel)); + const normal = toVector3D(hit.normal.transformDirection(worldToModel)); + let uv = null; + if (hit.uv != null) { + uv = toVector2D(hit.uv); + } + return { position: position, normal: normal, uv: uv }; + } + /** + * This method returns a dynamic hotspot ID string of the point on the mesh + * corresponding to the input pixel coordinates given relative to the + * model-viewer element. The ID string can be used in the data-surface + * attribute of the hotspot to make it follow this point on the surface even + * as the model animates. If the mesh is not hit, the result is null. + */ + surfaceFromPoint(pixelX, pixelY) { + const scene = this[$scene]; + const ndcPosition = scene.getNDC(pixelX, pixelY); + return scene.surfaceFromPoint(ndcPosition); + } + [$addHotspot](node) { + if (!(node instanceof HTMLElement && + node.slot.indexOf('hotspot') === 0)) { + return; + } + let hotspot = this[$hotspotMap].get(node.slot); + if (hotspot != null) { + hotspot.increment(); + } + else { + hotspot = new Hotspot({ + name: node.slot, + position: node.dataset.position, + normal: node.dataset.normal, + surface: node.dataset.surface, + }); + this[$hotspotMap].set(node.slot, hotspot); + this[$scene].addHotspot(hotspot); + } + this[$scene].queueRender(); + } + [$removeHotspot](node) { + if (!(node instanceof HTMLElement)) { + return; + } + const hotspot = this[$hotspotMap].get(node.slot); + if (!hotspot) { + return; + } + if (hotspot.decrement()) { + this[$scene].removeHotspot(hotspot); + this[$hotspotMap].delete(node.slot); + } + this[$scene].queueRender(); + } + } + return AnnotationModelViewerElement; +}; + +/*! +fflate - fast JavaScript compression/decompression + +Licensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE +version 0.8.2 +*/ + + +// aliases for shorter compressed code (most minifers don't do this) +var u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array; +// fixed length extra bits +var fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]); +// fixed distance extra bits +var fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]); +// code length index map +var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +// get base, reverse index map from extra bits +var freb = function (eb, start) { + var b = new u16(31); + for (var i = 0; i < 31; ++i) { + b[i] = start += 1 << eb[i - 1]; + } + // numbers here are at max 18 bits + var r = new i32(b[30]); + for (var i = 1; i < 30; ++i) { + for (var j = b[i]; j < b[i + 1]; ++j) { + r[j] = ((j - b[i]) << 5) | i; + } + } + return { b: b, r: r }; +}; +var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r; +// we can ignore the fact that the other numbers are wrong; they never happen anyway +fl[28] = 258, revfl[258] = 28; +var _b = freb(fdeb, 0), revfd = _b.r; +// map of value to reverse (assuming 16 bits) +var rev = new u16(32768); +for (var i = 0; i < 32768; ++i) { + // reverse table algorithm from SO + var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1); + x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2); + x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4); + rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1; +} +// create huffman tree from u8 "map": index -> code length for code index +// mb (max bits) must be at most 15 +// TODO: optimize/split up? +var hMap = (function (cd, mb, r) { + var s = cd.length; + // index + var i = 0; + // u16 "map": index -> # of codes with bit length = index + var l = new u16(mb); + // length of cd must be 288 (total # of codes) + for (; i < s; ++i) { + if (cd[i]) + ++l[cd[i] - 1]; + } + // u16 "map": index -> minimum code for bit length = index + var le = new u16(mb); + for (i = 1; i < mb; ++i) { + le[i] = (le[i - 1] + l[i - 1]) << 1; + } + var co; + if (r) { + // u16 "map": index -> number of actual bits, symbol for code + co = new u16(1 << mb); + // bits to remove for reverser + var rvb = 15 - mb; + for (i = 0; i < s; ++i) { + // ignore 0 lengths + if (cd[i]) { + // num encoding both symbol and bits read + var sv = (i << 4) | cd[i]; + // free bits + var r_1 = mb - cd[i]; + // start value + var v = le[cd[i] - 1]++ << r_1; + // m is end value + for (var m = v | ((1 << r_1) - 1); v <= m; ++v) { + // every 16 bit value starting with the code yields the same result + co[rev[v] >> rvb] = sv; + } + } + } + } + else { + co = new u16(s); + for (i = 0; i < s; ++i) { + if (cd[i]) { + co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]); + } + } + } + return co; +}); +// fixed length tree +var flt = new u8(288); +for (var i = 0; i < 144; ++i) + flt[i] = 8; +for (var i = 144; i < 256; ++i) + flt[i] = 9; +for (var i = 256; i < 280; ++i) + flt[i] = 7; +for (var i = 280; i < 288; ++i) + flt[i] = 8; +// fixed distance tree +var fdt = new u8(32); +for (var i = 0; i < 32; ++i) + fdt[i] = 5; +// fixed length map +var flm = /*#__PURE__*/ hMap(flt, 9, 0); +// fixed distance map +var fdm = /*#__PURE__*/ hMap(fdt, 5, 0); +// get end of byte +var shft = function (p) { return ((p + 7) / 8) | 0; }; +// typed array slice - allows garbage collector to free original reference, +// while being more compatible than .slice +var slc = function (v, s, e) { + if (e == null || e > v.length) + e = v.length; + // can't use .constructor in case user-supplied + return new u8(v.subarray(s, e)); +}; +// error codes +var ec = [ + 'unexpected EOF', + 'invalid block type', + 'invalid length/literal', + 'invalid distance', + 'stream finished', + 'no stream handler', + , + 'no callback', + 'invalid UTF-8 data', + 'extra field too long', + 'date not in range 1980-2099', + 'filename too long', + 'stream finishing', + 'invalid zip data' + // determined by unknown compression method +]; +var err = function (ind, msg, nt) { + var e = new Error(msg || ec[ind]); + e.code = ind; + if (Error.captureStackTrace) + Error.captureStackTrace(e, err); + if (!nt) + throw e; + return e; +}; +// starting at p, write the minimum number of bits that can hold v to d +var wbits = function (d, p, v) { + v <<= p & 7; + var o = (p / 8) | 0; + d[o] |= v; + d[o + 1] |= v >> 8; +}; +// starting at p, write the minimum number of bits (>8) that can hold v to d +var wbits16 = function (d, p, v) { + v <<= p & 7; + var o = (p / 8) | 0; + d[o] |= v; + d[o + 1] |= v >> 8; + d[o + 2] |= v >> 16; +}; +// creates code lengths from a frequency table +var hTree = function (d, mb) { + // Need extra info to make a tree + var t = []; + for (var i = 0; i < d.length; ++i) { + if (d[i]) + t.push({ s: i, f: d[i] }); + } + var s = t.length; + var t2 = t.slice(); + if (!s) + return { t: et, l: 0 }; + if (s == 1) { + var v = new u8(t[0].s + 1); + v[t[0].s] = 1; + return { t: v, l: 1 }; + } + t.sort(function (a, b) { return a.f - b.f; }); + // after i2 reaches last ind, will be stopped + // freq must be greater than largest possible number of symbols + t.push({ s: -1, f: 25001 }); + var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2; + t[0] = { s: -1, f: l.f + r.f, l: l, r: r }; + // efficient algorithm from UZIP.js + // i0 is lookbehind, i2 is lookahead - after processing two low-freq + // symbols that combined have high freq, will start processing i2 (high-freq, + // non-composite) symbols instead + // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/ + while (i1 != s - 1) { + l = t[t[i0].f < t[i2].f ? i0++ : i2++]; + r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++]; + t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r }; + } + var maxSym = t2[0].s; + for (var i = 1; i < s; ++i) { + if (t2[i].s > maxSym) + maxSym = t2[i].s; + } + // code lengths + var tr = new u16(maxSym + 1); + // max bits in tree + var mbt = ln(t[i1 - 1], tr, 0); + if (mbt > mb) { + // more algorithms from UZIP.js + // TODO: find out how this code works (debt) + // ind debt + var i = 0, dt = 0; + // left cost + var lft = mbt - mb, cst = 1 << lft; + t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; }); + for (; i < s; ++i) { + var i2_1 = t2[i].s; + if (tr[i2_1] > mb) { + dt += cst - (1 << (mbt - tr[i2_1])); + tr[i2_1] = mb; + } + else + break; + } + dt >>= lft; + while (dt > 0) { + var i2_2 = t2[i].s; + if (tr[i2_2] < mb) + dt -= 1 << (mb - tr[i2_2]++ - 1); + else + ++i; + } + for (; i >= 0 && dt; --i) { + var i2_3 = t2[i].s; + if (tr[i2_3] == mb) { + --tr[i2_3]; + ++dt; + } + } + mbt = mb; + } + return { t: new u8(tr), l: mbt }; +}; +// get the max length and assign length codes +var ln = function (n, l, d) { + return n.s == -1 + ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) + : (l[n.s] = d); +}; +// length codes generation +var lc = function (c) { + var s = c.length; + // Note that the semicolon was intentional + while (s && !c[--s]) + ; + var cl = new u16(++s); + // ind num streak + var cli = 0, cln = c[0], cls = 1; + var w = function (v) { cl[cli++] = v; }; + for (var i = 1; i <= s; ++i) { + if (c[i] == cln && i != s) + ++cls; + else { + if (!cln && cls > 2) { + for (; cls > 138; cls -= 138) + w(32754); + if (cls > 2) { + w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305); + cls = 0; + } + } + else if (cls > 3) { + w(cln), --cls; + for (; cls > 6; cls -= 6) + w(8304); + if (cls > 2) + w(((cls - 3) << 5) | 8208), cls = 0; + } + while (cls--) + w(cln); + cls = 1; + cln = c[i]; + } + } + return { c: cl.subarray(0, cli), n: s }; +}; +// calculate the length of output from tree, code lengths +var clen = function (cf, cl) { + var l = 0; + for (var i = 0; i < cl.length; ++i) + l += cf[i] * cl[i]; + return l; +}; +// writes a fixed block +// returns the new bit pos +var wfblk = function (out, pos, dat) { + // no need to write 00 as type: TypedArray defaults to 0 + var s = dat.length; + var o = shft(pos + 2); + out[o] = s & 255; + out[o + 1] = s >> 8; + out[o + 2] = out[o] ^ 255; + out[o + 3] = out[o + 1] ^ 255; + for (var i = 0; i < s; ++i) + out[o + i + 4] = dat[i]; + return (o + 4 + s) * 8; +}; +// writes a block +var wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) { + wbits(out, p++, final); + ++lf[256]; + var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l; + var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l; + var _c = lc(dlt), lclt = _c.c, nlc = _c.n; + var _d = lc(ddt), lcdt = _d.c, ndc = _d.n; + var lcfreq = new u16(19); + for (var i = 0; i < lclt.length; ++i) + ++lcfreq[lclt[i] & 31]; + for (var i = 0; i < lcdt.length; ++i) + ++lcfreq[lcdt[i] & 31]; + var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l; + var nlcc = 19; + for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc) + ; + var flen = (bl + 5) << 3; + var ftlen = clen(lf, flt) + clen(df, fdt) + eb; + var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]; + if (bs >= 0 && flen <= ftlen && flen <= dtlen) + return wfblk(out, p, dat.subarray(bs, bs + bl)); + var lm, ll, dm, dl; + wbits(out, p, 1 + (dtlen < ftlen)), p += 2; + if (dtlen < ftlen) { + lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt; + var llm = hMap(lct, mlcb, 0); + wbits(out, p, nlc - 257); + wbits(out, p + 5, ndc - 1); + wbits(out, p + 10, nlcc - 4); + p += 14; + for (var i = 0; i < nlcc; ++i) + wbits(out, p + 3 * i, lct[clim[i]]); + p += 3 * nlcc; + var lcts = [lclt, lcdt]; + for (var it = 0; it < 2; ++it) { + var clct = lcts[it]; + for (var i = 0; i < clct.length; ++i) { + var len = clct[i] & 31; + wbits(out, p, llm[len]), p += lct[len]; + if (len > 15) + wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12; + } + } + } + else { + lm = flm, ll = flt, dm = fdm, dl = fdt; + } + for (var i = 0; i < li; ++i) { + var sym = syms[i]; + if (sym > 255) { + var len = (sym >> 18) & 31; + wbits16(out, p, lm[len + 257]), p += ll[len + 257]; + if (len > 7) + wbits(out, p, (sym >> 23) & 31), p += fleb[len]; + var dst = sym & 31; + wbits16(out, p, dm[dst]), p += dl[dst]; + if (dst > 3) + wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst]; + } + else { + wbits16(out, p, lm[sym]), p += ll[sym]; + } + } + wbits16(out, p, lm[256]); + return p + ll[256]; +}; +// deflate options (nice << 13) | chain +var deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]); +// empty +var et = /*#__PURE__*/ new u8(0); +// compresses data into a raw DEFLATE buffer +var dflt = function (dat, lvl, plvl, pre, post, st) { + var s = st.z || dat.length; + var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post); + // writing to this writes to the output buffer + var w = o.subarray(pre, o.length - post); + var lst = st.l; + var pos = (st.r || 0) & 7; + if (lvl) { + if (pos) + w[0] = st.r >> 3; + var opt = deo[lvl - 1]; + var n = opt >> 13, c = opt & 8191; + var msk_1 = (1 << plvl) - 1; + // prev 2-byte val map curr 2-byte val map + var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1); + var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1; + var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; }; + // 24576 is an arbitrary number of maximum symbols per block + // 424 buffer for last block + var syms = new i32(25000); + // length/literal freq distance freq + var lf = new u16(288), df = new u16(32); + // l/lcnt exbits index l/lind waitdx blkpos + var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0; + for (; i + 2 < s; ++i) { + // hash value + var hv = hsh(i); + // index mod 32768 previous index mod + var imod = i & 32767, pimod = head[hv]; + prev[imod] = pimod; + head[hv] = imod; + // We always should modify head and prev, but only add symbols if + // this data is not yet processed ("wait" for wait index) + if (wi <= i) { + // bytes remaining + var rem = s - i; + if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) { + pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos); + li = lc_1 = eb = 0, bs = i; + for (var j = 0; j < 286; ++j) + lf[j] = 0; + for (var j = 0; j < 30; ++j) + df[j] = 0; + } + // len dist chain + var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767; + if (rem > 2 && hv == hsh(i - dif)) { + var maxn = Math.min(n, rem) - 1; + var maxd = Math.min(32767, i); + // max possible length + // not capped at dif because decompressors implement "rolling" index population + var ml = Math.min(258, rem); + while (dif <= maxd && --ch_1 && imod != pimod) { + if (dat[i + l] == dat[i + l - dif]) { + var nl = 0; + for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl) + ; + if (nl > l) { + l = nl, d = dif; + // break out early when we reach "nice" (we are satisfied enough) + if (nl > maxn) + break; + // now, find the rarest 2-byte sequence within this + // length of literals and search for that instead. + // Much faster than just using the start + var mmd = Math.min(dif, nl - 2); + var md = 0; + for (var j = 0; j < mmd; ++j) { + var ti = i - dif + j & 32767; + var pti = prev[ti]; + var cd = ti - pti & 32767; + if (cd > md) + md = cd, pimod = ti; + } + } + } + // check the previous match + imod = pimod, pimod = prev[imod]; + dif += imod - pimod & 32767; + } + } + // d will be nonzero only when a match was found + if (d) { + // store both dist and len data in one int32 + // Make sure this is recognized as a len/dist with 28th bit (2^28) + syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d]; + var lin = revfl[l] & 31, din = revfd[d] & 31; + eb += fleb[lin] + fdeb[din]; + ++lf[257 + lin]; + ++df[din]; + wi = i + l; + ++lc_1; + } + else { + syms[li++] = dat[i]; + ++lf[dat[i]]; + } + } + } + for (i = Math.max(i, wi); i < s; ++i) { + syms[li++] = dat[i]; + ++lf[dat[i]]; + } + pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos); + if (!lst) { + st.r = (pos & 7) | w[(pos / 8) | 0] << 3; + // shft(pos) now 1 less if pos & 7 != 0 + pos -= 7; + st.h = head, st.p = prev, st.i = i, st.w = wi; + } + } + else { + for (var i = st.w || 0; i < s + lst; i += 65535) { + // end + var e = i + 65535; + if (e >= s) { + // write final block + w[(pos / 8) | 0] = lst; + e = s; + } + pos = wfblk(w, pos + 1, dat.subarray(i, e)); + } + st.i = s; + } + return slc(o, 0, pre + shft(pos) + post); +}; +// CRC32 table +var crct = /*#__PURE__*/ (function () { + var t = new Int32Array(256); + for (var i = 0; i < 256; ++i) { + var c = i, k = 9; + while (--k) + c = ((c & 1) && -306674912) ^ (c >>> 1); + t[i] = c; + } + return t; +})(); +// CRC32 +var crc = function () { + var c = -1; + return { + p: function (d) { + // closures have awful performance + var cr = c; + for (var i = 0; i < d.length; ++i) + cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8); + c = cr; + }, + d: function () { return ~c; } + }; +}; +// deflate with opts +var dopt = function (dat, opt, pre, post, st) { + if (!st) { + st = { l: 1 }; + if (opt.dictionary) { + var dict = opt.dictionary.subarray(-32768); + var newDat = new u8(dict.length + dat.length); + newDat.set(dict); + newDat.set(dat, dict.length); + dat = newDat; + st.w = dict.length; + } + } + return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st); +}; +// Walmart object spread +var mrg = function (a, b) { + var o = {}; + for (var k in a) + o[k] = a[k]; + for (var k in b) + o[k] = b[k]; + return o; +}; +// write bytes +var wbytes = function (d, b, v) { + for (; v; ++b) + d[b] = v, v >>>= 8; +}; +/** + * Compresses data with DEFLATE without any wrapper + * @param data The data to compress + * @param opts The compression options + * @returns The deflated version of the data + */ +function deflateSync(data, opts) { + return dopt(data, opts || {}, 0, 0); +} +// flatten a directory structure +var fltn = function (d, p, t, o) { + for (var k in d) { + var val = d[k], n = p + k, op = o; + if (Array.isArray(val)) + op = mrg(o, val[1]), val = val[0]; + if (val instanceof u8) + t[n] = [val, op]; + else { + t[n += '/'] = [new u8(0), op]; + fltn(val, n, t, o); + } + } +}; +// text encoder +var te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder(); +// text decoder +var td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder(); +// text decoder stream +var tds = 0; +try { + td.decode(et, { stream: true }); + tds = 1; +} +catch (e) { } +/** + * Converts a string into a Uint8Array for use with compression/decompression methods + * @param str The string to encode + * @param latin1 Whether or not to interpret the data as Latin-1. This should + * not need to be true unless decoding a binary string. + * @returns The string encoded in UTF-8/Latin-1 binary + */ +function strToU8(str, latin1) { + var i; + if (te) + return te.encode(str); + var l = str.length; + var ar = new u8(str.length + (str.length >> 1)); + var ai = 0; + var w = function (v) { ar[ai++] = v; }; + for (var i = 0; i < l; ++i) { + if (ai + 5 > ar.length) { + var n = new u8(ai + 8 + ((l - i) << 1)); + n.set(ar); + ar = n; + } + var c = str.charCodeAt(i); + if (c < 128 || latin1) + w(c); + else if (c < 2048) + w(192 | (c >> 6)), w(128 | (c & 63)); + else if (c > 55295 && c < 57344) + c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023), + w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63)); + else + w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63)); + } + return slc(ar, 0, ai); +} +// extra field length +var exfl = function (ex) { + var le = 0; + if (ex) { + for (var k in ex) { + var l = ex[k].length; + if (l > 65535) + err(9); + le += l + 4; + } + } + return le; +}; +// write zip header +var wzh = function (d, b, f, fn, u, c, ce, co) { + var fl = fn.length, ex = f.extra, col = co && co.length; + var exl = exfl(ex); + wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4; + if (ce != null) + d[b++] = 20, d[b++] = f.os; + d[b] = 20, b += 2; // spec compliance? what's that? + d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8; + d[b++] = f.compression & 255, d[b++] = f.compression >> 8; + var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980; + if (y < 0 || y > 119) + err(10); + wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4; + if (c != -1) { + wbytes(d, b, f.crc); + wbytes(d, b + 4, c < 0 ? -c - 2 : c); + wbytes(d, b + 8, f.size); + } + wbytes(d, b + 12, fl); + wbytes(d, b + 14, exl), b += 16; + if (ce != null) { + wbytes(d, b, col); + wbytes(d, b + 6, f.attrs); + wbytes(d, b + 10, ce), b += 14; + } + d.set(fn, b); + b += fl; + if (exl) { + for (var k in ex) { + var exf = ex[k], l = exf.length; + wbytes(d, b, +k); + wbytes(d, b + 2, l); + d.set(exf, b + 4), b += 4 + l; + } + } + if (col) + d.set(co, b), b += col; + return b; +}; +// write zip footer (end of central directory) +var wzf = function (o, b, c, d, e) { + wbytes(o, b, 0x6054B50); // skip disk + wbytes(o, b + 8, c); + wbytes(o, b + 10, c); + wbytes(o, b + 12, d); + wbytes(o, b + 16, e); +}; +/** + * Synchronously creates a ZIP file. Prefer using `zip` for better performance + * with more than one file. + * @param data The directory structure for the ZIP archive + * @param opts The main options, merged with per-file options + * @returns The generated ZIP archive + */ +function zipSync(data, opts) { + if (!opts) + opts = {}; + var r = {}; + var files = []; + fltn(data, '', r, opts); + var o = 0; + var tot = 0; + for (var fn in r) { + var _a = r[fn], file = _a[0], p = _a[1]; + var compression = p.level == 0 ? 0 : 8; + var f = strToU8(fn), s = f.length; + var com = p.comment, m = com && strToU8(com), ms = m && m.length; + var exl = exfl(p.extra); + if (s > 65535) + err(11); + var d = compression ? deflateSync(file, p) : file, l = d.length; + var c = crc(); + c.p(file); + files.push(mrg(p, { + size: file.length, + crc: c.d(), + c: d, + f: f, + m: m, + u: s != fn.length || (m && (com.length != ms)), + o: o, + compression: compression + })); + o += 30 + s + exl + l; + tot += 76 + 2 * (s + exl) + (ms || 0) + l; + } + var out = new u8(tot + 22), oe = o, cdl = tot - o; + for (var i = 0; i < files.length; ++i) { + var f = files[i]; + wzh(out, f.o, f, f.f, f.u, f.c.length); + var badd = 30 + f.f.length + exfl(f.extra); + out.set(f.c, f.o + badd); + wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0); + } + wzf(out, o, files.length, cdl, oe); + return out; +} + +class USDZExporter { + + constructor() { + + this.textureUtils = null; + + } + + setTextureUtils( utils ) { + + this.textureUtils = utils; + + } + + parse( scene, onDone, onError, options ) { + + this.parseAsync( scene, options ).then( onDone ).catch( onError ); + + } + + async parseAsync( scene, options = {} ) { + + options = Object.assign( { + ar: { + anchoring: { type: 'plane' }, + planeAnchoring: { alignment: 'horizontal' } + }, + includeAnchoringProperties: true, + quickLookCompatible: false, + maxTextureSize: 1024, + }, options ); + + const files = {}; + const modelFileName = 'model.usda'; + + // model file should be first in USDZ archive so we init it here + files[ modelFileName ] = null; + + let output = buildHeader(); + + output += buildSceneStart( options ); + + const materials = {}; + const textures = {}; + + scene.traverseVisible( ( object ) => { + + if ( object.isMesh ) { + + const geometry = object.geometry; + const material = object.material; + + if ( material.isMeshStandardMaterial ) { + + const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usda'; + + if ( ! ( geometryFileName in files ) ) { + + const meshObject = buildMeshObject( geometry ); + files[ geometryFileName ] = buildUSDFileAsString( meshObject ); + + } + + if ( ! ( material.uuid in materials ) ) { + + materials[ material.uuid ] = material; + + } + + output += buildXform( object, geometry, material ); + + } else { + + console.warn( 'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)', object ); + + } + + } else if ( object.isCamera ) { + + output += buildCamera( object ); + + } + + } ); + + + output += buildSceneEnd(); + + output += buildMaterials( materials, textures, options.quickLookCompatible ); + + files[ modelFileName ] = strToU8( output ); + output = null; + + for ( const id in textures ) { + + let texture = textures[ id ]; + + if ( texture.isCompressedTexture === true ) { + + if ( this.textureUtils === null ) { + + throw new Error( 'THREE.USDZExporter: setTextureUtils() must be called to process compressed textures.' ); + + } else { + + texture = await this.textureUtils.decompress( texture ); + + } + + } + + const canvas = imageToCanvas( texture.image, texture.flipY, options.maxTextureSize ); + const blob = await new Promise( resolve => canvas.toBlob( resolve, 'image/png', 1 ) ); + + files[ `textures/Texture_${ id }.png` ] = new Uint8Array( await blob.arrayBuffer() ); + + } + + // 64 byte alignment + // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109 + + let offset = 0; + + for ( const filename in files ) { + + const file = files[ filename ]; + const headerSize = 34 + filename.length; + + offset += headerSize; + + const offsetMod64 = offset & 63; + + if ( offsetMod64 !== 4 ) { + + const padLength = 64 - offsetMod64; + const padding = new Uint8Array( padLength ); + + files[ filename ] = [ file, { extra: { 12345: padding } } ]; + + } + + offset = file.length; + + } + + return zipSync( files, { level: 0 } ); + + } + +} + +function imageToCanvas( image, flipY, maxTextureSize ) { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + const scale = maxTextureSize / Math.max( image.width, image.height ); + + const canvas = document.createElement( 'canvas' ); + canvas.width = image.width * Math.min( 1, scale ); + canvas.height = image.height * Math.min( 1, scale ); + + const context = canvas.getContext( '2d' ); + + // TODO: We should be able to do this in the UsdTransform2d? + + if ( flipY === true ) { + + context.translate( 0, canvas.height ); + context.scale( 1, -1 ); + + } + + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + return canvas; + + } else { + + throw new Error( 'THREE.USDZExporter: No valid image data found. Unable to process texture.' ); + + } + +} + +// + +const PRECISION = 7; + +function buildHeader() { + + return `#usda 1.0 +( + customLayerData = { + string creator = "Three.js USDZExporter" + } + defaultPrim = "Root" + metersPerUnit = 1 + upAxis = "Y" +) + +`; + +} + +function buildSceneStart( options ) { + + const alignment = options.includeAnchoringProperties === true ? ` + token preliminary:anchoring:type = "${options.ar.anchoring.type}" + token preliminary:planeAnchoring:alignment = "${options.ar.planeAnchoring.alignment}" + ` : ''; + return `def Xform "Root" +{ + def Scope "Scenes" ( + kind = "sceneLibrary" + ) + { + def Xform "Scene" ( + customData = { + bool preliminary_collidesWithEnvironment = 0 + string sceneName = "Scene" + } + sceneName = "Scene" + ) + {${alignment} +`; + +} + +function buildSceneEnd() { + + return ` + } + } +} + +`; + +} + +function buildUSDFileAsString( dataToInsert ) { + + let output = buildHeader(); + output += dataToInsert; + return strToU8( output ); + +} + +// Xform + +function buildXform( object, geometry, material ) { + + const name = 'Object_' + object.id; + const transform = buildMatrix( object.matrixWorld ); + + if ( object.matrixWorld.determinant() < 0 ) { + + console.warn( 'THREE.USDZExporter: USDZ does not support negative scales', object ); + + } + + return `def Xform "${ name }" ( + prepend references = @./geometries/Geometry_${ geometry.id }.usda@ + prepend apiSchemas = ["MaterialBindingAPI"] +) +{ + matrix4d xformOp:transform = ${ transform } + uniform token[] xformOpOrder = ["xformOp:transform"] + + rel material:binding = +} + +`; + +} + +function buildMatrix( matrix ) { + + const array = matrix.elements; + + return `( ${ buildMatrixRow( array, 0 ) }, ${ buildMatrixRow( array, 4 ) }, ${ buildMatrixRow( array, 8 ) }, ${ buildMatrixRow( array, 12 ) } )`; + +} + +function buildMatrixRow( array, offset ) { + + return `(${ array[ offset + 0 ] }, ${ array[ offset + 1 ] }, ${ array[ offset + 2 ] }, ${ array[ offset + 3 ] })`; + +} + +// Mesh + +function buildMeshObject( geometry ) { + + const mesh = buildMesh( geometry ); + return ` +def "Geometry" +{ +${mesh} +} +`; + +} + +function buildMesh( geometry ) { + + const name = 'Geometry'; + const attributes = geometry.attributes; + const count = attributes.position.count; + + return ` + def Mesh "${ name }" + { + int[] faceVertexCounts = [${ buildMeshVertexCount( geometry ) }] + int[] faceVertexIndices = [${ buildMeshVertexIndices( geometry ) }] + normal3f[] normals = [${ buildVector3Array( attributes.normal, count )}] ( + interpolation = "vertex" + ) + point3f[] points = [${ buildVector3Array( attributes.position, count )}] +${ buildPrimvars( attributes ) } + uniform token subdivisionScheme = "none" + } +`; + +} + +function buildMeshVertexCount( geometry ) { + + const count = geometry.index !== null ? geometry.index.count : geometry.attributes.position.count; + + return Array( count / 3 ).fill( 3 ).join( ', ' ); + +} + +function buildMeshVertexIndices( geometry ) { + + const index = geometry.index; + const array = []; + + if ( index !== null ) { + + for ( let i = 0; i < index.count; i ++ ) { + + array.push( index.getX( i ) ); + + } + + } else { + + const length = geometry.attributes.position.count; + + for ( let i = 0; i < length; i ++ ) { + + array.push( i ); + + } + + } + + return array.join( ', ' ); + +} + +function buildVector3Array( attribute, count ) { + + if ( attribute === undefined ) { + + console.warn( 'USDZExporter: Normals missing.' ); + return Array( count ).fill( '(0, 0, 0)' ).join( ', ' ); + + } + + const array = []; + + for ( let i = 0; i < attribute.count; i ++ ) { + + const x = attribute.getX( i ); + const y = attribute.getY( i ); + const z = attribute.getZ( i ); + + array.push( `(${ x.toPrecision( PRECISION ) }, ${ y.toPrecision( PRECISION ) }, ${ z.toPrecision( PRECISION ) })` ); + + } + + return array.join( ', ' ); + +} + +function buildVector2Array( attribute ) { + + const array = []; + + for ( let i = 0; i < attribute.count; i ++ ) { + + const x = attribute.getX( i ); + const y = attribute.getY( i ); + + array.push( `(${ x.toPrecision( PRECISION ) }, ${ 1 - y.toPrecision( PRECISION ) })` ); + + } + + return array.join( ', ' ); + +} + +function buildPrimvars( attributes ) { + + let string = ''; + + for ( let i = 0; i < 4; i ++ ) { + + const id = ( i > 0 ? i : '' ); + const attribute = attributes[ 'uv' + id ]; + + if ( attribute !== undefined ) { + + string += ` + texCoord2f[] primvars:st${ id } = [${ buildVector2Array( attribute )}] ( + interpolation = "vertex" + )`; + + } + + } + + // vertex colors + + const colorAttribute = attributes.color; + + if ( colorAttribute !== undefined ) { + + const count = colorAttribute.count; + + string += ` + color3f[] primvars:displayColor = [${buildVector3Array( colorAttribute, count )}] ( + interpolation = "vertex" + )`; + + } + + return string; + +} + +// Materials + +function buildMaterials( materials, textures, quickLookCompatible = false ) { + + const array = []; + + for ( const uuid in materials ) { + + const material = materials[ uuid ]; + + array.push( buildMaterial( material, textures, quickLookCompatible ) ); + + } + + return `def "Materials" +{ +${ array.join( '' ) } +} + +`; + +} + +function buildMaterial( material, textures, quickLookCompatible = false ) { + + // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html + + const pad = ' '; + const inputs = []; + const samplers = []; + + function buildTexture( texture, mapType, color ) { + + const id = texture.source.id + '_' + texture.flipY; + + textures[ id ] = texture; + + const uv = texture.channel > 0 ? 'st' + texture.channel : 'st'; + + const WRAPPINGS = { + 1000: 'repeat', // RepeatWrapping + 1001: 'clamp', // ClampToEdgeWrapping + 1002: 'mirror' // MirroredRepeatWrapping + }; + + const repeat = texture.repeat.clone(); + const offset = texture.offset.clone(); + const rotation = texture.rotation; + + // rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot + const xRotationOffset = Math.sin( rotation ); + const yRotationOffset = Math.cos( rotation ); + + // texture coordinates start in the opposite corner, need to correct + offset.y = 1 - offset.y - repeat.y; + + // turns out QuickLook is buggy and interprets texture repeat inverted/applies operations in a different order. + // Apple Feedback: FB10036297 and FB11442287 + if ( quickLookCompatible ) { + + // This is NOT correct yet in QuickLook, but comes close for a range of models. + // It becomes more incorrect the bigger the offset is + + offset.x = offset.x / repeat.x; + offset.y = offset.y / repeat.y; + + offset.x += xRotationOffset / repeat.x; + offset.y += yRotationOffset - 1; + + } else { + + // results match glTF results exactly. verified correct in usdview. + offset.x += xRotationOffset * repeat.x; + offset.y += ( 1 - yRotationOffset ) * repeat.y; + + } + + return ` + def Shader "PrimvarReader_${ mapType }" + { + uniform token info:id = "UsdPrimvarReader_float2" + float2 inputs:fallback = (0.0, 0.0) + token inputs:varname = "${ uv }" + float2 outputs:result + } + + def Shader "Transform2d_${ mapType }" + { + uniform token info:id = "UsdTransform2d" + token inputs:in.connect = + float inputs:rotation = ${ ( rotation * ( 180 / Math.PI ) ).toFixed( PRECISION ) } + float2 inputs:scale = ${ buildVector2( repeat ) } + float2 inputs:translation = ${ buildVector2( offset ) } + float2 outputs:result + } + + def Shader "Texture_${ texture.id }_${ mapType }" + { + uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/Texture_${ id }.png@ + float2 inputs:st.connect = + ${ color !== undefined ? 'float4 inputs:scale = ' + buildColor4( color ) : '' } + token inputs:sourceColorSpace = "${ texture.colorSpace === NoColorSpace ? 'raw' : 'sRGB' }" + token inputs:wrapS = "${ WRAPPINGS[ texture.wrapS ] }" + token inputs:wrapT = "${ WRAPPINGS[ texture.wrapT ] }" + float outputs:r + float outputs:g + float outputs:b + float3 outputs:rgb + ${ material.transparent || material.alphaTest > 0.0 ? 'float outputs:a' : '' } + }`; + + } + + + if ( material.side === DoubleSide ) { + + console.warn( 'THREE.USDZExporter: USDZ does not support double sided materials', material ); + + } + + if ( material.map !== null ) { + + inputs.push( `${ pad }color3f inputs:diffuseColor.connect = ` ); + + if ( material.transparent ) { + + inputs.push( `${ pad }float inputs:opacity.connect = ` ); + + } else if ( material.alphaTest > 0.0 ) { + + inputs.push( `${ pad }float inputs:opacity.connect = ` ); + inputs.push( `${ pad }float inputs:opacityThreshold = ${material.alphaTest}` ); + + } + + samplers.push( buildTexture( material.map, 'diffuse', material.color ) ); + + } else { + + inputs.push( `${ pad }color3f inputs:diffuseColor = ${ buildColor( material.color ) }` ); + + } + + if ( material.emissiveMap !== null ) { + + inputs.push( `${ pad }color3f inputs:emissiveColor.connect = ` ); + + samplers.push( buildTexture( material.emissiveMap, 'emissive', new Color( material.emissive.r * material.emissiveIntensity, material.emissive.g * material.emissiveIntensity, material.emissive.b * material.emissiveIntensity ) ) ); + + } else if ( material.emissive.getHex() > 0 ) { + + inputs.push( `${ pad }color3f inputs:emissiveColor = ${ buildColor( material.emissive ) }` ); + + } + + if ( material.normalMap !== null ) { + + inputs.push( `${ pad }normal3f inputs:normal.connect = ` ); + + samplers.push( buildTexture( material.normalMap, 'normal' ) ); + + } + + if ( material.aoMap !== null ) { + + inputs.push( `${ pad }float inputs:occlusion.connect = ` ); + + samplers.push( buildTexture( material.aoMap, 'occlusion', new Color( material.aoMapIntensity, material.aoMapIntensity, material.aoMapIntensity ) ) ); + + } + + if ( material.roughnessMap !== null ) { + + inputs.push( `${ pad }float inputs:roughness.connect = ` ); + + samplers.push( buildTexture( material.roughnessMap, 'roughness', new Color( material.roughness, material.roughness, material.roughness ) ) ); + + } else { + + inputs.push( `${ pad }float inputs:roughness = ${ material.roughness }` ); + + } + + if ( material.metalnessMap !== null ) { + + inputs.push( `${ pad }float inputs:metallic.connect = ` ); + + samplers.push( buildTexture( material.metalnessMap, 'metallic', new Color( material.metalness, material.metalness, material.metalness ) ) ); + + } else { + + inputs.push( `${ pad }float inputs:metallic = ${ material.metalness }` ); + + } + + if ( material.alphaMap !== null ) { + + inputs.push( `${pad}float inputs:opacity.connect = ` ); + inputs.push( `${pad}float inputs:opacityThreshold = 0.0001` ); + + samplers.push( buildTexture( material.alphaMap, 'opacity' ) ); + + } else { + + inputs.push( `${pad}float inputs:opacity = ${material.opacity}` ); + + } + + if ( material.isMeshPhysicalMaterial ) { + + if ( material.clearcoatMap !== null ) { + + inputs.push( `${pad}float inputs:clearcoat.connect = ` ); + samplers.push( buildTexture( material.clearcoatMap, 'clearcoat', new Color( material.clearcoat, material.clearcoat, material.clearcoat ) ) ); + + } else { + + inputs.push( `${pad}float inputs:clearcoat = ${material.clearcoat}` ); + + } + + if ( material.clearcoatRoughnessMap !== null ) { + + inputs.push( `${pad}float inputs:clearcoatRoughness.connect = ` ); + samplers.push( buildTexture( material.clearcoatRoughnessMap, 'clearcoatRoughness', new Color( material.clearcoatRoughness, material.clearcoatRoughness, material.clearcoatRoughness ) ) ); + + } else { + + inputs.push( `${pad}float inputs:clearcoatRoughness = ${material.clearcoatRoughness}` ); + + } + + inputs.push( `${ pad }float inputs:ior = ${ material.ior }` ); + + } + + return ` + def Material "Material_${ material.id }" + { + def Shader "PreviewSurface" + { + uniform token info:id = "UsdPreviewSurface" +${ inputs.join( '\n' ) } + int inputs:useSpecularWorkflow = 0 + token outputs:surface + } + + token outputs:surface.connect = + +${ samplers.join( '\n' ) } + + } +`; + +} + +function buildColor( color ) { + + return `(${ color.r }, ${ color.g }, ${ color.b })`; + +} + +function buildColor4( color ) { + + return `(${ color.r }, ${ color.g }, ${ color.b }, 1.0)`; + +} + +function buildVector2( vector ) { + + return `(${ vector.x }, ${ vector.y })`; + +} + + +function buildCamera( camera ) { + + const name = camera.name ? camera.name : 'Camera_' + camera.id; + + const transform = buildMatrix( camera.matrixWorld ); + + if ( camera.matrixWorld.determinant() < 0 ) { + + console.warn( 'THREE.USDZExporter: USDZ does not support negative scales', camera ); + + } + + if ( camera.isOrthographicCamera ) { + + return `def Camera "${name}" + { + matrix4d xformOp:transform = ${ transform } + uniform token[] xformOpOrder = ["xformOp:transform"] + + float2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) }) + float horizontalAperture = ${ ( ( Math.abs( camera.left ) + Math.abs( camera.right ) ) * 10 ).toPrecision( PRECISION ) } + float verticalAperture = ${ ( ( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) * 10 ).toPrecision( PRECISION ) } + token projection = "orthographic" + } + + `; + + } else { + + return `def Camera "${name}" + { + matrix4d xformOp:transform = ${ transform } + uniform token[] xformOpOrder = ["xformOp:transform"] + + float2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) }) + float focalLength = ${ camera.getFocalLength().toPrecision( PRECISION ) } + float focusDistance = ${ camera.focus.toPrecision( PRECISION ) } + float horizontalAperture = ${ camera.getFilmWidth().toPrecision( PRECISION ) } + token projection = "perspective" + float verticalAperture = ${ camera.getFilmHeight().toPrecision( PRECISION ) } + } + + `; + + } + +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * For our purposes, an enumeration is a fixed set of CSS-expression-compatible + * names. When serialized, a selected subset of the members may be specified as + * whitespace-separated strings. An enumeration deserializer is a function that + * parses a serialized subset of an enumeration and returns any members that are + * found as a Set. + * + * The following example will produce a deserializer for the days of the + * week: + * + * const deserializeDaysOfTheWeek = enumerationDeserializer([ + * 'Monday', + * 'Tuesday', + * 'Wednesday', + * 'Thursday', + * 'Friday', + * 'Saturday', + * 'Sunday' + * ]); + */ +const enumerationDeserializer = (allowedNames) => (valueString) => { + try { + const expressions = parseExpressions(valueString); + const names = (expressions.length ? expressions[0].terms : []) + .filter((valueNode) => valueNode && valueNode.type === 'ident') + .map(valueNode => valueNode.value) + .filter(name => allowedNames.indexOf(name) > -1); + return new Set(names); + } + catch (_error) { + } + return new Set(); +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$2 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +let isWebXRBlocked = false; +let isSceneViewerBlocked = false; +const noArViewerSigil = '#model-viewer-no-ar-fallback'; +const deserializeARModes = enumerationDeserializer(['quick-look', 'scene-viewer', 'webxr', 'none']); +const DEFAULT_AR_MODES = 'webxr scene-viewer quick-look'; +const ARMode = { + QUICK_LOOK: 'quick-look', + SCENE_VIEWER: 'scene-viewer', + WEBXR: 'webxr', + NONE: 'none' +}; +const $arButtonContainer = Symbol('arButtonContainer'); +const $enterARWithWebXR = Symbol('enterARWithWebXR'); +const $openSceneViewer = Symbol('openSceneViewer'); +const $openIOSARQuickLook = Symbol('openIOSARQuickLook'); +const $canActivateAR = Symbol('canActivateAR'); +const $arMode = Symbol('arMode'); +const $arModes = Symbol('arModes'); +const $arAnchor = Symbol('arAnchor'); +const $preload = Symbol('preload'); +const $onARButtonContainerClick = Symbol('onARButtonContainerClick'); +const $onARStatus = Symbol('onARStatus'); +const $onARTracking = Symbol('onARTracking'); +const $onARTap = Symbol('onARTap'); +const $selectARMode = Symbol('selectARMode'); +const $triggerLoad = Symbol('triggerLoad'); +const ARMixin = (ModelViewerElement) => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; + class ARModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this.ar = false; + this.arScale = 'auto'; + this.arUsdzMaxTextureSize = 'auto'; + this.arPlacement = 'floor'; + this.arModes = DEFAULT_AR_MODES; + this.iosSrc = null; + this.xrEnvironment = false; + this[_a] = false; + // TODO: Add this to the shadow root as part of this mixin's + // implementation: + this[_b] = this.shadowRoot.querySelector('.ar-button'); + this[_c] = document.createElement('a'); + this[_d] = new Set(); + this[_e] = ARMode.NONE; + this[_f] = false; + this[_g] = (event) => { + event.preventDefault(); + this.activateAR(); + }; + this[_h] = ({ status }) => { + if (status === ARStatus.NOT_PRESENTING || + this[$renderer].arRenderer.presentedScene === this[$scene]) { + this.setAttribute('ar-status', status); + this.dispatchEvent(new CustomEvent('ar-status', { detail: { status } })); + if (status === ARStatus.NOT_PRESENTING) { + this.removeAttribute('ar-tracking'); + } + else if (status === ARStatus.SESSION_STARTED) { + this.setAttribute('ar-tracking', ARTracking.TRACKING); + } + } + }; + this[_j] = ({ status }) => { + this.setAttribute('ar-tracking', status); + this.dispatchEvent(new CustomEvent('ar-tracking', { detail: { status } })); + }; + this[_k] = (event) => { + if (event.data == '_apple_ar_quicklook_button_tapped') { + this.dispatchEvent(new CustomEvent('quick-look-button-tapped')); + } + }; + } + get canActivateAR() { + return this[$arMode] !== ARMode.NONE; + } + connectedCallback() { + super.connectedCallback(); + this[$renderer].arRenderer.addEventListener('status', this[$onARStatus]); + this.setAttribute('ar-status', ARStatus.NOT_PRESENTING); + this[$renderer].arRenderer.addEventListener('tracking', this[$onARTracking]); + this[$arAnchor].addEventListener('message', this[$onARTap]); + } + disconnectedCallback() { + super.disconnectedCallback(); + this[$renderer].arRenderer.removeEventListener('status', this[$onARStatus]); + this[$renderer].arRenderer.removeEventListener('tracking', this[$onARTracking]); + this[$arAnchor].removeEventListener('message', this[$onARTap]); + } + update(changedProperties) { + super.update(changedProperties); + if (changedProperties.has('arScale')) { + this[$scene].canScale = this.arScale !== 'fixed'; + } + if (changedProperties.has('arPlacement')) { + this[$scene].updateShadow(); + this[$needsRender](); + } + if (changedProperties.has('arModes')) { + this[$arModes] = deserializeARModes(this.arModes); + } + if (changedProperties.has('ar') || changedProperties.has('arModes') || + changedProperties.has('src') || changedProperties.has('iosSrc') || + changedProperties.has('arUsdzMaxTextureSize')) { + this[$selectARMode](); + } + } + /** + * Activates AR. Note that for any mode that is not WebXR-based, this + * method most likely has to be called synchronous from a user + * interaction handler. Otherwise, attempts to activate modes that + * require user interaction will most likely be ignored. + */ + async activateAR() { + switch (this[$arMode]) { + case ARMode.QUICK_LOOK: + await this[$openIOSARQuickLook](); + break; + case ARMode.WEBXR: + await this[$enterARWithWebXR](); + break; + case ARMode.SCENE_VIEWER: + this[$openSceneViewer](); + break; + default: + console.warn('No AR Mode can be activated. This is probably due to missing \ +configuration or device capabilities'); + break; + } + } + async [(_a = $canActivateAR, _b = $arButtonContainer, _c = $arAnchor, _d = $arModes, _e = $arMode, _f = $preload, _g = $onARButtonContainerClick, _h = $onARStatus, _j = $onARTracking, _k = $onARTap, $selectARMode)]() { + var _l; + let arMode = ARMode.NONE; + if (this.ar) { + if (this.src != null) { + for (const value of this[$arModes]) { + if (value === 'webxr' && IS_WEBXR_AR_CANDIDATE && !isWebXRBlocked && + await this[$renderer].arRenderer.supportsPresentation()) { + arMode = ARMode.WEBXR; + break; + } + if (value === 'scene-viewer' && !isSceneViewerBlocked && + (IS_SCENEVIEWER_CANDIDATE || + (navigator.userAgentData && + navigator.userAgentData.getHighEntropyValues && + ((_l = (await navigator.userAgentData.getHighEntropyValues([ + 'formFactor' + ])).formFactor) === null || _l === void 0 ? void 0 : _l.includes('XR'))))) { + arMode = ARMode.SCENE_VIEWER; + break; + } + if (value === 'quick-look' && IS_AR_QUICKLOOK_CANDIDATE) { + arMode = ARMode.QUICK_LOOK; + break; + } + } + } + // The presence of ios-src overrides the absence of quick-look + // ar-mode. + if (arMode === ARMode.NONE && this.iosSrc != null && + IS_AR_QUICKLOOK_CANDIDATE) { + arMode = ARMode.QUICK_LOOK; + } + } + if (arMode !== ARMode.NONE) { + this[$arButtonContainer].classList.add('enabled'); + this[$arButtonContainer].addEventListener('click', this[$onARButtonContainerClick]); + } + else if (this[$arButtonContainer].classList.contains('enabled')) { + this[$arButtonContainer].removeEventListener('click', this[$onARButtonContainerClick]); + this[$arButtonContainer].classList.remove('enabled'); + // If AR went from working to not, notify the element. + const status = ARStatus.FAILED; + this.setAttribute('ar-status', status); + this.dispatchEvent(new CustomEvent('ar-status', { detail: { status } })); + } + this[$arMode] = arMode; + } + async [$enterARWithWebXR]() { + console.log('Attempting to present in AR with WebXR...'); + await this[$triggerLoad](); + try { + this[$arButtonContainer].removeEventListener('click', this[$onARButtonContainerClick]); + const { arRenderer } = this[$renderer]; + if (this.arPlacement === 'wall') { + arRenderer.placementMode = 'wall'; + } + else if (this.arPlacement === 'ceiling') { + arRenderer.placementMode = 'ceiling'; + } + else { + arRenderer.placementMode = 'floor'; + } + await arRenderer.present(this[$scene], this.xrEnvironment); + } + catch (error) { + console.warn('Error while trying to present in AR with WebXR'); + console.error(error); + await this[$renderer].arRenderer.stopPresenting(); + isWebXRBlocked = true; + console.warn('Falling back to next ar-mode'); + await this[$selectARMode](); + this.activateAR(); + } + finally { + this[$selectARMode](); + } + } + async [$triggerLoad]() { + if (!this.loaded) { + this[$preload] = true; + this[$updateSource](); + await waitForEvent(this, 'load'); + this[$preload] = false; + } + } + [$shouldAttemptPreload]() { + return super[$shouldAttemptPreload]() || this[$preload]; + } + /** + * Takes a URL and a title string, and attempts to launch Scene Viewer on + * the current device. + */ + [$openSceneViewer]() { + const location = self.location.toString(); + const locationUrl = new URL(location); + const modelUrl = new URL(this.src, location); + if (modelUrl.hash) + modelUrl.hash = ''; + const params = new URLSearchParams(modelUrl.search); + locationUrl.hash = noArViewerSigil; + // modelUrl can contain title/link/sound etc. + params.set('mode', 'ar_preferred'); + if (!params.has('disable_occlusion')) { + params.set('disable_occlusion', 'true'); + } + if (this.arScale === 'fixed') { + params.set('resizable', 'false'); + } + if (this.arPlacement === 'wall') { + params.set('enable_vertical_placement', 'true'); + } + if (params.has('sound')) { + const soundUrl = new URL(params.get('sound'), location); + params.set('sound', soundUrl.toString()); + } + if (params.has('link')) { + const linkUrl = new URL(params.get('link'), location); + params.set('link', linkUrl.toString()); + } + const intent = `intent://arvr.google.com/scene-viewer/1.2?${params.toString() + '&file=' + + encodeURIComponent(modelUrl + .toString())}#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=${encodeURIComponent(locationUrl.toString())};end;`; + const undoHashChange = () => { + if (self.location.hash === noArViewerSigil) { + isSceneViewerBlocked = true; + // The new history will be the current URL with a new hash. + // Go back one step so that we reset to the expected URL. + // NOTE(cdata): this should not invoke any browser-level navigation + // because hash-only changes modify the URL in-place without + // navigating: + self.history.back(); + console.warn('Error while trying to present in AR with Scene Viewer'); + console.warn('Falling back to next ar-mode'); + this[$selectARMode](); + // Would be nice to activateAR() here, but webXR fails due to not + // seeing a user activation. + } + }; + self.addEventListener('hashchange', undoHashChange, { once: true }); + this[$arAnchor].setAttribute('href', intent); + console.log('Attempting to present in AR with Scene Viewer...'); + this[$arAnchor].click(); + } + /** + * Takes a URL to a USDZ file and sets the appropriate fields so that + * Safari iOS can intent to their AR Quick Look. + */ + async [$openIOSARQuickLook]() { + const generateUsdz = !this.iosSrc; + this[$arButtonContainer].classList.remove('enabled'); + const objectURL = generateUsdz ? await this.prepareUSDZ() : this.iosSrc; + const modelUrl = new URL(objectURL, self.location.toString()); + if (generateUsdz) { + const location = self.location.toString(); + const locationUrl = new URL(location); + const srcUrl = new URL(this.src, locationUrl); + if (srcUrl.hash) { + modelUrl.hash = srcUrl.hash; + } + } + if (this.arScale === 'fixed') { + if (modelUrl.hash) { + modelUrl.hash += '&'; + } + modelUrl.hash += 'allowsContentScaling=0'; + } + const anchor = this[$arAnchor]; + anchor.setAttribute('rel', 'ar'); + const img = document.createElement('img'); + anchor.appendChild(img); + anchor.setAttribute('href', modelUrl.toString()); + if (generateUsdz) { + anchor.setAttribute('download', 'model.usdz'); + } + // attach anchor to shadow DOM to ensure iOS16 ARQL banner click message + // event propagation + anchor.style.display = 'none'; + if (!anchor.isConnected) + this.shadowRoot.appendChild(anchor); + console.log('Attempting to present in AR with Quick Look...'); + anchor.click(); + anchor.removeChild(img); + if (generateUsdz) { + URL.revokeObjectURL(objectURL); + } + this[$arButtonContainer].classList.add('enabled'); + } + async prepareUSDZ() { + const updateSourceProgress = this[$progressTracker].beginActivity('usdz-conversion'); + await this[$triggerLoad](); + const { model, shadow, target } = this[$scene]; + if (model == null) { + return ''; + } + let visible = false; + // Remove shadow from export + if (shadow != null) { + visible = shadow.visible; + shadow.visible = false; + } + updateSourceProgress(0.2); + const exporter = new USDZExporter(); + target.remove(model); + model.position.copy(target.position); + model.updateWorldMatrix(false, true); + const arraybuffer = await exporter.parseAsync(model, { + maxTextureSize: isNaN(this.arUsdzMaxTextureSize) ? + Infinity : + Math.max(parseInt(this.arUsdzMaxTextureSize), 16), + }); + model.position.set(0, 0, 0); + target.add(model); + const blob = new Blob([arraybuffer], { + type: 'model/vnd.usdz+zip', + }); + const url = URL.createObjectURL(blob); + updateSourceProgress(1); + if (shadow != null) { + shadow.visible = visible; + } + return url; + } + } + __decorate$2([ + property({ type: Boolean, attribute: 'ar' }) + ], ARModelViewerElement.prototype, "ar", void 0); + __decorate$2([ + property({ type: String, attribute: 'ar-scale' }) + ], ARModelViewerElement.prototype, "arScale", void 0); + __decorate$2([ + property({ type: String, attribute: 'ar-usdz-max-texture-size' }) + ], ARModelViewerElement.prototype, "arUsdzMaxTextureSize", void 0); + __decorate$2([ + property({ type: String, attribute: 'ar-placement' }) + ], ARModelViewerElement.prototype, "arPlacement", void 0); + __decorate$2([ + property({ type: String, attribute: 'ar-modes' }) + ], ARModelViewerElement.prototype, "arModes", void 0); + __decorate$2([ + property({ type: String, attribute: 'ios-src' }) + ], ARModelViewerElement.prototype, "iosSrc", void 0); + __decorate$2([ + property({ type: Boolean, attribute: 'xr-environment' }) + ], ARModelViewerElement.prototype, "xrEnvironment", void 0); + return ARModelViewerElement; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$1 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +const PROGRESS_BAR_UPDATE_THRESHOLD = 100; +const DEFAULT_DRACO_DECODER_LOCATION = 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/'; +const DEFAULT_KTX2_TRANSCODER_LOCATION = 'https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/'; +const DEFAULT_LOTTIE_LOADER_LOCATION = 'https://cdn.jsdelivr.net/npm/three@0.149.0/examples/jsm/loaders/LottieLoader.js'; +const RevealStrategy = { + AUTO: 'auto'}; +const LoadingStrategy = { + AUTO: 'auto', + EAGER: 'eager' +}; +const $defaultProgressBarElement = Symbol('defaultProgressBarElement'); +const $posterContainerElement = Symbol('posterContainerElement'); +const $defaultPosterElement = Symbol('defaultPosterElement'); +const $shouldDismissPoster = Symbol('shouldDismissPoster'); +const $hidePoster = Symbol('hidePoster'); +const $modelIsRevealed = Symbol('modelIsRevealed'); +const $updateProgressBar = Symbol('updateProgressBar'); +const $ariaLabelCallToAction = Symbol('ariaLabelCallToAction'); +const $onProgress = Symbol('onProgress'); +/** + * LoadingMixin implements features related to lazy loading, as well as + * presentation details related to the pre-load / pre-render presentation of a + * + * + * This mixin implements support for models with DRACO-compressed meshes. + * The DRACO decoder will be loaded on-demand if a glTF that uses the DRACO mesh + * compression extension is encountered. + * + * By default, the DRACO decoder will be loaded from a Google CDN. It is + * possible to customize where the decoder is loaded from by defining a global + * configuration option for `` like so: + * + * ```html + * + * ``` + * + * Note that the above configuration strategy must be performed *before* the + * first `` element is created in the browser. The configuration + * can be done anywhere, but the easiest way to ensure it is done at the right + * time is to do it in the `` of the HTML document. This is the + * recommended way to set the location because it is most compatible with + * scenarios where the `` library is lazily loaded. + * + * If you absolutely have to set the DRACO decoder location *after* the first + * `` element is created, you can do it this way: + * + * ```html + * + * ``` + * + * Note that the above configuration approach will not work until *after* + * `` is defined in the browser. Also note that this configuration + * *must* be set *before* the first DRACO model is fully loaded. + * + * It is recommended that users who intend to take advantage of DRACO mesh + * compression consider whether or not it is acceptable for their use case to + * have code side-loaded from a Google CDN. If it is not acceptable, then the + * location must be customized before loading any DRACO models in order to cause + * the decoder to be loaded from an alternative, acceptable location. + */ +const LoadingMixin = (ModelViewerElement) => { + var _a, _b, _c, _d, _e, _f, _g, _h; + class LoadingModelViewerElement extends ModelViewerElement { + static set dracoDecoderLocation(value) { + CachingGLTFLoader.setDRACODecoderLocation(value); + } + static get dracoDecoderLocation() { + return CachingGLTFLoader.getDRACODecoderLocation(); + } + static set ktx2TranscoderLocation(value) { + CachingGLTFLoader.setKTX2TranscoderLocation(value); + } + static get ktx2TranscoderLocation() { + return CachingGLTFLoader.getKTX2TranscoderLocation(); + } + static set meshoptDecoderLocation(value) { + CachingGLTFLoader.setMeshoptDecoderLocation(value); + } + static get meshoptDecoderLocation() { + return CachingGLTFLoader.getMeshoptDecoderLocation(); + } + static set lottieLoaderLocation(value) { + Renderer.singleton.textureUtils.lottieLoaderUrl = value; + } + static get lottieLoaderLocation() { + return Renderer.singleton.textureUtils.lottieLoaderUrl; + } + /** + * If provided, the callback will be passed each resource URL before a + * request is sent. The callback may return the original URL, or a new URL + * to override loading behavior. This behavior can be used to load assets + * from .ZIP files, drag-and-drop APIs, and Data URIs. + */ + static mapURLs(callback) { + Renderer.singleton.loader[$loader].manager.setURLModifier(callback); + } + /** + * Dismisses the poster, causing the model to load and render if + * necessary. This is currently effectively the same as interacting with + * the poster via user input. + */ + dismissPoster() { + if (this.loaded) { + this[$hidePoster](); + } + else { + this[$shouldDismissPoster] = true; + this[$updateSource](); + } + } + /** + * Displays the poster, hiding the 3D model. If this is called after the 3D + * model has been revealed, then it must be dismissed by a call to + * dismissPoster(). + */ + showPoster() { + const posterContainerElement = this[$posterContainerElement]; + if (posterContainerElement.classList.contains('show')) { + return; + } + posterContainerElement.classList.add('show'); + this[$userInputElement].classList.remove('show'); + const defaultPosterElement = this[$defaultPosterElement]; + defaultPosterElement.removeAttribute('tabindex'); + defaultPosterElement.removeAttribute('aria-hidden'); + const oldVisibility = this.modelIsVisible; + this[$modelIsRevealed] = false; + this[$announceModelVisibility](oldVisibility); + } + /** + * Returns the model's bounding box dimensions in meters, independent of + * turntable rotation. + */ + getDimensions() { + return toVector3D(this[$scene].size); + } + getBoundingBoxCenter() { + return toVector3D(this[$scene].boundingBox.getCenter(new Vector3())); + } + constructor(...args) { + super(...args); + /** + * A URL pointing to the image to use as a poster in scenarios where the + * is not ready to reveal a rendered model to the viewer. + */ + this.poster = null; + /** + * An enumerable attribute describing under what conditions the + * should reveal a model to the viewer. + * + * The default value is "auto". The only supported alternative values is + * "manual". + */ + this.reveal = RevealStrategy.AUTO; + /** + * An enumerable attribute describing under what conditions the + * should preload a model. + * + * The default value is "auto". The only supported alternative values are + * "lazy" and "eager". Auto is equivalent to lazy, which loads the model + * when it is near the viewport for reveal = "auto", and when interacted + * with for reveal = "interaction". Eager loads the model immediately. + */ + this.loading = LoadingStrategy.AUTO; + this[_a] = false; + this[_b] = false; + // TODO: Add this to the shadow root as part of this mixin's + // implementation: + this[_c] = this.shadowRoot.querySelector('.slot.poster'); + this[_d] = this.shadowRoot.querySelector('#default-poster'); + this[_e] = this.shadowRoot.querySelector('#default-progress-bar > .bar'); + this[_f] = this[$defaultPosterElement].getAttribute('aria-label'); + this[_g] = throttle((progress) => { + const parentNode = this[$defaultProgressBarElement].parentNode; + requestAnimationFrame(() => { + this[$defaultProgressBarElement].style.transform = + `scaleX(${progress})`; + if (progress === 0) { + // NOTE(cdata): We remove and re-append the progress bar in this + // condition so that the progress bar does not appear to + // transition backwards from the right when we reset to 0 (or + // otherwise <1) progress after having already reached 1 progress + // previously. + parentNode.removeChild(this[$defaultProgressBarElement]); + parentNode.appendChild(this[$defaultProgressBarElement]); + } + this[$defaultProgressBarElement].classList.toggle('hide', progress === 1.0); + }); + }, PROGRESS_BAR_UPDATE_THRESHOLD); + this[_h] = (event) => { + const progress = event.detail.totalProgress; + const reason = event.detail.reason; + if (progress === 1.0) { + this[$updateProgressBar].flush(); + if (this.loaded && + (this[$shouldDismissPoster] || + this.reveal === RevealStrategy.AUTO)) { + this[$hidePoster](); + } + } + this[$updateProgressBar](progress); + this.dispatchEvent(new CustomEvent('progress', { detail: { totalProgress: progress, reason } })); + }; + const ModelViewerElement = self.ModelViewerElement || {}; + const dracoDecoderLocation = ModelViewerElement.dracoDecoderLocation || + DEFAULT_DRACO_DECODER_LOCATION; + CachingGLTFLoader.setDRACODecoderLocation(dracoDecoderLocation); + const ktx2TranscoderLocation = ModelViewerElement.ktx2TranscoderLocation || + DEFAULT_KTX2_TRANSCODER_LOCATION; + CachingGLTFLoader.setKTX2TranscoderLocation(ktx2TranscoderLocation); + if (ModelViewerElement.meshoptDecoderLocation) { + CachingGLTFLoader.setMeshoptDecoderLocation(ModelViewerElement.meshoptDecoderLocation); + } + const lottieLoaderLocation = ModelViewerElement.lottieLoaderLocation || + DEFAULT_LOTTIE_LOADER_LOCATION; + Renderer.singleton.textureUtils.lottieLoaderUrl = lottieLoaderLocation; + } + connectedCallback() { + super.connectedCallback(); + if (!this.loaded) { + this.showPoster(); + } + this[$progressTracker].addEventListener('progress', this[$onProgress]); + } + disconnectedCallback() { + super.disconnectedCallback(); + this[$progressTracker].removeEventListener('progress', this[$onProgress]); + } + async updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('poster') && this.poster != null) { + this[$defaultPosterElement].style.backgroundImage = + `url(${this.poster})`; + } + if (changedProperties.has('alt')) { + this[$defaultPosterElement].setAttribute('aria-label', this[$altDefaulted]); + } + if (changedProperties.has('reveal') || changedProperties.has('loading')) { + this[$updateSource](); + } + } + [(_a = $modelIsRevealed, _b = $shouldDismissPoster, _c = $posterContainerElement, _d = $defaultPosterElement, _e = $defaultProgressBarElement, _f = $ariaLabelCallToAction, _g = $updateProgressBar, _h = $onProgress, $shouldAttemptPreload)]() { + return !!this.src && + (this[$shouldDismissPoster] || + this.loading === LoadingStrategy.EAGER || + (this.reveal === RevealStrategy.AUTO && this[$isElementInViewport])); + } + [$hidePoster]() { + this[$shouldDismissPoster] = false; + const posterContainerElement = this[$posterContainerElement]; + if (!posterContainerElement.classList.contains('show')) { + return; + } + posterContainerElement.classList.remove('show'); + this[$userInputElement].classList.add('show'); + const oldVisibility = this.modelIsVisible; + this[$modelIsRevealed] = true; + this[$announceModelVisibility](oldVisibility); + const root = this.getRootNode(); + // If the is still focused, forward the focus to + // the canvas that has just been revealed + if (root && root.activeElement === this) { + this[$userInputElement].focus(); + } + // Ensure that the poster is no longer focusable or visible to + // screen readers + const defaultPosterElement = this[$defaultPosterElement]; + defaultPosterElement.setAttribute('aria-hidden', 'true'); + defaultPosterElement.tabIndex = -1; + this.dispatchEvent(new CustomEvent('poster-dismissed')); + } + [$getModelIsVisible]() { + return super[$getModelIsVisible]() && this[$modelIsRevealed]; + } + } + __decorate$1([ + property({ type: String }) + ], LoadingModelViewerElement.prototype, "poster", void 0); + __decorate$1([ + property({ type: String }) + ], LoadingModelViewerElement.prototype, "reveal", void 0); + __decorate$1([ + property({ type: String }) + ], LoadingModelViewerElement.prototype, "loading", void 0); + return LoadingModelViewerElement; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +// How much the model will rotate per +// second in radians: +const DEFAULT_ROTATION_SPEED = Math.PI / 32; +const AUTO_ROTATE_DELAY_DEFAULT = 3000; +const rotationRateIntrinsics = { + basis: [degreesToRadians(numberNode(DEFAULT_ROTATION_SPEED, 'rad'))], + keywords: { auto: [null] } +}; +const $autoRotateStartTime = Symbol('autoRotateStartTime'); +const $radiansPerSecond = Symbol('radiansPerSecond'); +const $syncRotationRate = Symbol('syncRotationRate'); +const $onCameraChange = Symbol('onCameraChange'); +const StagingMixin = (ModelViewerElement) => { + var _a, _b, _c; + class StagingModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this.autoRotate = false; + this.autoRotateDelay = AUTO_ROTATE_DELAY_DEFAULT; + this.rotationPerSecond = 'auto'; + this[_a] = performance.now(); + this[_b] = 0; + this[_c] = (event) => { + if (!this.autoRotate) { + return; + } + if (event.detail.source === 'user-interaction') { + this[$autoRotateStartTime] = performance.now(); + } + }; + } + connectedCallback() { + super.connectedCallback(); + this.addEventListener('camera-change', this[$onCameraChange]); + this[$autoRotateStartTime] = performance.now(); + } + disconnectedCallback() { + super.disconnectedCallback(); + this.removeEventListener('camera-change', this[$onCameraChange]); + this[$autoRotateStartTime] = performance.now(); + } + updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('autoRotate')) { + this[$autoRotateStartTime] = performance.now(); + } + } + [(_a = $autoRotateStartTime, _b = $radiansPerSecond, $syncRotationRate)](style) { + this[$radiansPerSecond] = style[0]; + } + [$tick](time, delta) { + super[$tick](time, delta); + if (!this.autoRotate || !this[$getModelIsVisible]() || + this[$renderer].isPresenting) { + return; + } + const rotationDelta = Math.min(delta, time - this[$autoRotateStartTime] - this.autoRotateDelay); + if (rotationDelta > 0) { + this[$scene].yaw = this.turntableRotation + + this[$radiansPerSecond] * rotationDelta * 0.001; + } + } + get turntableRotation() { + return this[$scene].yaw; + } + resetTurntableRotation(theta = 0) { + this[$scene].yaw = theta; + } + } + _c = $onCameraChange; + __decorate([ + property({ type: Boolean, attribute: 'auto-rotate' }) + ], StagingModelViewerElement.prototype, "autoRotate", void 0); + __decorate([ + property({ type: Number, attribute: 'auto-rotate-delay' }) + ], StagingModelViewerElement.prototype, "autoRotateDelay", void 0); + __decorate([ + style({ intrinsics: rotationRateIntrinsics, updateHandler: $syncRotationRate }), + property({ type: String, attribute: 'rotation-per-second' }) + ], StagingModelViewerElement.prototype, "rotationPerSecond", void 0); + return StagingModelViewerElement; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const ModelViewerElement = AnnotationMixin(SceneGraphMixin(StagingMixin(EnvironmentMixin(ControlsMixin(ARMixin(LoadingMixin(AnimationMixin(ModelViewerElementBase)))))))); +customElements.define('model-viewer', ModelViewerElement); + +export { ModelViewerElement }; +//# sourceMappingURL=model-viewer-module.js.map diff --git a/packages/model-viewer/dist/model-viewer-module.js.map b/packages/model-viewer/dist/model-viewer-module.js.map new file mode 100644 index 0000000..5ee126d --- /dev/null +++ b/packages/model-viewer/dist/model-viewer-module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"model-viewer-module.js","sources":["../../../node_modules/@lit/reactive-element/development/css-tag.js","../../../node_modules/@lit/reactive-element/development/reactive-element.js","../../../node_modules/@lit/reactive-element/development/decorators/property.js","../../../node_modules/@lit/reactive-element/development/decorators/query.js","../../../node_modules/lit-html/development/lit-html.js","../../../node_modules/lit-element/development/lit-element.js","../lib/constants.js","../lib/utilities.js","../lib/features/environment.js","../lib/assets/close-material-svg.js","../lib/assets/controls-svg.js","../lib/assets/view-in-ar-material-svg.js","../lib/template.js","../../../node_modules/three/examples/jsm/libs/meshopt_decoder.module.js","../../../node_modules/three/examples/jsm/loaders/DRACOLoader.js","../../../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../../../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../../../node_modules/three/examples/jsm/utils/WorkerPool.js","../../../node_modules/three/examples/jsm/libs/ktx-parse.module.js","../../../node_modules/three/examples/jsm/libs/zstddec.module.js","../../../node_modules/three/examples/jsm/math/ColorSpaces.js","../../../node_modules/three/examples/jsm/loaders/KTX2Loader.js","../lib/utilities/cache-eviction-policy.js","../lib/three-components/gltf-instance/VariantMaterialLoaderPlugin.js","../lib/three-components/CachingGLTFLoader.js","../../../node_modules/three/examples/jsm/renderers/CSS2DRenderer.js","../../../node_modules/three/examples/jsm/utils/SceneUtils.js","../../../node_modules/three/examples/jsm/exporters/GLTFExporter.js","../lib/three-components/gltf-instance/VariantMaterialExporterPlugin.js","../../../node_modules/three/examples/jsm/webxr/XREstimatedLight.js","../lib/three-components/Damper.js","../lib/three-components/PlacementBox.js","../lib/styles/parsers.js","../lib/styles/conversions.js","../lib/styles/evaluators.js","../lib/styles/style-effector.js","../lib/decorators.js","../lib/utilities/animation.js","../lib/features/controls.js","../lib/three-components/SmoothControls.js","../lib/three-components/XRMenuPanel.js","../lib/three-components/ARRenderer.js","../../../node_modules/three/examples/jsm/utils/SkeletonUtils.js","../lib/three-components/GLTFInstance.js","../lib/three-components/gltf-instance/correlated-scene-graph.js","../lib/three-components/gltf-instance/ModelViewerGLTFInstance.js","../../../node_modules/@monogrid/gainmap-js/dist/QuadRenderer-DuOPRGA4.js","../../../node_modules/@monogrid/gainmap-js/dist/decode.js","../../../node_modules/three/examples/jsm/loaders/RGBELoader.js","../lib/three-components/EnvironmentScene.js","../lib/three-components/TextureUtils.js","../lib/three-components/Renderer.js","../lib/features/scene-graph/three-dom-element.js","../lib/features/scene-graph/image.js","../lib/three-components/gltf-instance/gltf-2.0.js","../lib/features/scene-graph/sampler.js","../lib/features/scene-graph/texture.js","../lib/features/scene-graph/texture-info.js","../lib/features/scene-graph/pbr-metallic-roughness.js","../lib/features/scene-graph/material.js","../lib/features/scene-graph/nodes/primitive-node.js","../lib/features/scene-graph/model.js","../lib/features/scene-graph.js","../lib/three-components/GroundedSkybox.js","../lib/three-components/Hotspot.js","../../../node_modules/three/examples/jsm/shaders/HorizontalBlurShader.js","../../../node_modules/three/examples/jsm/shaders/VerticalBlurShader.js","../../../node_modules/three/src/math/MathUtils.js","../lib/three-components/Shadow.js","../lib/three-components/ModelScene.js","../lib/utilities/progress-tracker.js","../lib/model-viewer-base.js","../lib/features/animation.js","../lib/features/annotation.js","../../../node_modules/three/examples/jsm/libs/fflate.module.js","../../../node_modules/three/examples/jsm/exporters/USDZExporter.js","../lib/styles/deserializers.js","../lib/features/ar.js","../lib/features/loading.js","../lib/features/staging.js","../lib/model-viewer.js"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst NODE_MODE = false;\n// Allows minifiers to rename references to globalThis\nconst global = globalThis;\n/**\n * Whether the current browser supports `adoptedStyleSheets`.\n */\nexport const supportsAdoptingStyleSheets = global.ShadowRoot &&\n (global.ShadyCSS === undefined || global.ShadyCSS.nativeShadow) &&\n 'adoptedStyleSheets' in Document.prototype &&\n 'replace' in CSSStyleSheet.prototype;\nconst constructionToken = Symbol();\nconst cssTagCache = new WeakMap();\n/**\n * A container for a string of CSS text, that may be used to create a CSSStyleSheet.\n *\n * CSSResult is the return value of `css`-tagged template literals and\n * `unsafeCSS()`. In order to ensure that CSSResults are only created via the\n * `css` tag and `unsafeCSS()`, CSSResult cannot be constructed directly.\n */\nexport class CSSResult {\n constructor(cssText, strings, safeToken) {\n // This property needs to remain unminified.\n this['_$cssResult$'] = true;\n if (safeToken !== constructionToken) {\n throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');\n }\n this.cssText = cssText;\n this._strings = strings;\n }\n // This is a getter so that it's lazy. In practice, this means stylesheets\n // are not created until the first element instance is made.\n get styleSheet() {\n // If `supportsAdoptingStyleSheets` is true then we assume CSSStyleSheet is\n // constructable.\n let styleSheet = this._styleSheet;\n const strings = this._strings;\n if (supportsAdoptingStyleSheets && styleSheet === undefined) {\n const cacheable = strings !== undefined && strings.length === 1;\n if (cacheable) {\n styleSheet = cssTagCache.get(strings);\n }\n if (styleSheet === undefined) {\n (this._styleSheet = styleSheet = new CSSStyleSheet()).replaceSync(this.cssText);\n if (cacheable) {\n cssTagCache.set(strings, styleSheet);\n }\n }\n }\n return styleSheet;\n }\n toString() {\n return this.cssText;\n }\n}\nconst textFromCSSResult = (value) => {\n // This property needs to remain unminified.\n if (value['_$cssResult$'] === true) {\n return value.cssText;\n }\n else if (typeof value === 'number') {\n return value;\n }\n else {\n throw new Error(`Value passed to 'css' function must be a 'css' function result: ` +\n `${value}. Use 'unsafeCSS' to pass non-literal values, but take care ` +\n `to ensure page security.`);\n }\n};\n/**\n * Wrap a value for interpolation in a {@linkcode css} tagged template literal.\n *\n * This is unsafe because untrusted CSS text can be used to phone home\n * or exfiltrate data to an attacker controlled site. Take care to only use\n * this with trusted input.\n */\nexport const unsafeCSS = (value) => new CSSResult(typeof value === 'string' ? value : String(value), undefined, constructionToken);\n/**\n * A template literal tag which can be used with LitElement's\n * {@linkcode LitElement.styles} property to set element styles.\n *\n * For security reasons, only literal string values and number may be used in\n * embedded expressions. To incorporate non-literal values {@linkcode unsafeCSS}\n * may be used inside an expression.\n */\nexport const css = (strings, ...values) => {\n const cssText = strings.length === 1\n ? strings[0]\n : values.reduce((acc, v, idx) => acc + textFromCSSResult(v) + strings[idx + 1], strings[0]);\n return new CSSResult(cssText, strings, constructionToken);\n};\n/**\n * Applies the given styles to a `shadowRoot`. When Shadow DOM is\n * available but `adoptedStyleSheets` is not, styles are appended to the\n * `shadowRoot` to [mimic spec behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets).\n * Note, when shimming is used, any styles that are subsequently placed into\n * the shadowRoot should be placed *before* any shimmed adopted styles. This\n * will match spec behavior that gives adopted sheets precedence over styles in\n * shadowRoot.\n */\nexport const adoptStyles = (renderRoot, styles) => {\n if (supportsAdoptingStyleSheets) {\n renderRoot.adoptedStyleSheets = styles.map((s) => s instanceof CSSStyleSheet ? s : s.styleSheet);\n }\n else {\n for (const s of styles) {\n const style = document.createElement('style');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nonce = global['litNonce'];\n if (nonce !== undefined) {\n style.setAttribute('nonce', nonce);\n }\n style.textContent = s.cssText;\n renderRoot.appendChild(style);\n }\n }\n};\nconst cssResultFromStyleSheet = (sheet) => {\n let cssText = '';\n for (const rule of sheet.cssRules) {\n cssText += rule.cssText;\n }\n return unsafeCSS(cssText);\n};\nexport const getCompatibleStyle = supportsAdoptingStyleSheets ||\n (NODE_MODE && global.CSSStyleSheet === undefined)\n ? (s) => s\n : (s) => s instanceof CSSStyleSheet ? cssResultFromStyleSheet(s) : s;\n//# sourceMappingURL=css-tag.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/**\n * Use this module if you want to create your own base class extending\n * {@link ReactiveElement}.\n * @packageDocumentation\n */\nimport { getCompatibleStyle, adoptStyles, } from './css-tag.js';\n// In the Node build, this import will be injected by Rollup:\n// import {HTMLElement, customElements} from '@lit-labs/ssr-dom-shim';\nexport * from './css-tag.js';\n// TODO (justinfagnani): Add `hasOwn` here when we ship ES2022\nconst { is, defineProperty, getOwnPropertyDescriptor, getOwnPropertyNames, getOwnPropertySymbols, getPrototypeOf, } = Object;\nconst NODE_MODE = false;\n// Lets a minifier replace globalThis references with a minified name\nconst global = globalThis;\nif (NODE_MODE) {\n global.customElements ??= customElements;\n}\nconst DEV_MODE = true;\nlet issueWarning;\nconst trustedTypes = global\n .trustedTypes;\n// Temporary workaround for https://crbug.com/993268\n// Currently, any attribute starting with \"on\" is considered to be a\n// TrustedScript source. Such boolean attributes must be set to the equivalent\n// trusted emptyScript value.\nconst emptyStringForBooleanAttribute = trustedTypes\n ? trustedTypes.emptyScript\n : '';\nconst polyfillSupport = DEV_MODE\n ? global.reactiveElementPolyfillSupportDevMode\n : global.reactiveElementPolyfillSupport;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n const issuedWarnings = (global.litIssuedWarnings ??=\n new Set());\n // Issue a warning, if we haven't already.\n issueWarning = (code, warning) => {\n warning += ` See https://lit.dev/msg/${code} for more information.`;\n if (!issuedWarnings.has(warning)) {\n console.warn(warning);\n issuedWarnings.add(warning);\n }\n };\n issueWarning('dev-mode', `Lit is in dev mode. Not recommended for production!`);\n // Issue polyfill support warning.\n if (global.ShadyDOM?.inUse && polyfillSupport === undefined) {\n issueWarning('polyfill-support-missing', `Shadow DOM is being polyfilled via \\`ShadyDOM\\` but ` +\n `the \\`polyfill-support\\` module has not been loaded.`);\n }\n}\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n ? (event) => {\n const shouldEmit = global\n .emitLitDebugLogEvents;\n if (!shouldEmit) {\n return;\n }\n global.dispatchEvent(new CustomEvent('lit-debug', {\n detail: event,\n }));\n }\n : undefined;\n/*\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\n/*@__INLINE__*/\nconst JSCompiler_renameProperty = (prop, _obj) => prop;\nexport const defaultConverter = {\n toAttribute(value, type) {\n switch (type) {\n case Boolean:\n value = value ? emptyStringForBooleanAttribute : null;\n break;\n case Object:\n case Array:\n // if the value is `null` or `undefined` pass this through\n // to allow removing/no change behavior.\n value = value == null ? value : JSON.stringify(value);\n break;\n }\n return value;\n },\n fromAttribute(value, type) {\n let fromValue = value;\n switch (type) {\n case Boolean:\n fromValue = value !== null;\n break;\n case Number:\n fromValue = value === null ? null : Number(value);\n break;\n case Object:\n case Array:\n // Do *not* generate exception when invalid JSON is set as elements\n // don't normally complain on being mis-configured.\n // TODO(sorvell): Do generate exception in *dev mode*.\n try {\n // Assert to adhere to Bazel's \"must type assert JSON parse\" rule.\n fromValue = JSON.parse(value);\n }\n catch (e) {\n fromValue = null;\n }\n break;\n }\n return fromValue;\n },\n};\n/**\n * Change function that returns true if `value` is different from `oldValue`.\n * This method is used as the default for a property's `hasChanged` function.\n */\nexport const notEqual = (value, old) => !is(value, old);\nconst defaultPropertyDeclaration = {\n attribute: true,\n type: String,\n converter: defaultConverter,\n reflect: false,\n hasChanged: notEqual,\n};\n// Ensure metadata is enabled. TypeScript does not polyfill\n// Symbol.metadata, so we must ensure that it exists.\nSymbol.metadata ??= Symbol('metadata');\n// Map from a class's metadata object to property options\n// Note that we must use nullish-coalescing assignment so that we only use one\n// map even if we load multiple version of this module.\nglobal.litPropertyMetadata ??= new WeakMap();\n/**\n * Base element class which manages element properties and attributes. When\n * properties change, the `update` method is asynchronously called. This method\n * should be supplied by subclasses to render updates as desired.\n * @noInheritDoc\n */\nexport class ReactiveElement\n// In the Node build, this `extends` clause will be substituted with\n// `(globalThis.HTMLElement ?? HTMLElement)`.\n//\n// This way, we will first prefer any global `HTMLElement` polyfill that the\n// user has assigned, and then fall back to the `HTMLElement` shim which has\n// been imported (see note at the top of this file about how this import is\n// generated by Rollup). Note that the `HTMLElement` variable has been\n// shadowed by this import, so it no longer refers to the global.\n extends HTMLElement {\n /**\n * Adds an initializer function to the class that is called during instance\n * construction.\n *\n * This is useful for code that runs against a `ReactiveElement`\n * subclass, such as a decorator, that needs to do work for each\n * instance, such as setting up a `ReactiveController`.\n *\n * ```ts\n * const myDecorator = (target: typeof ReactiveElement, key: string) => {\n * target.addInitializer((instance: ReactiveElement) => {\n * // This is run during construction of the element\n * new MyController(instance);\n * });\n * }\n * ```\n *\n * Decorating a field will then cause each instance to run an initializer\n * that adds a controller:\n *\n * ```ts\n * class MyElement extends LitElement {\n * @myDecorator foo;\n * }\n * ```\n *\n * Initializers are stored per-constructor. Adding an initializer to a\n * subclass does not add it to a superclass. Since initializers are run in\n * constructors, initializers will run in order of the class hierarchy,\n * starting with superclasses and progressing to the instance's class.\n *\n * @nocollapse\n */\n static addInitializer(initializer) {\n this.__prepare();\n (this._initializers ??= []).push(initializer);\n }\n /**\n * Returns a list of attributes corresponding to the registered properties.\n * @nocollapse\n * @category attributes\n */\n static get observedAttributes() {\n // Ensure we've created all properties\n this.finalize();\n // this.__attributeToPropertyMap is only undefined after finalize() in\n // ReactiveElement itself. ReactiveElement.observedAttributes is only\n // accessed with ReactiveElement as the receiver when a subclass or mixin\n // calls super.observedAttributes\n return (this.__attributeToPropertyMap && [...this.__attributeToPropertyMap.keys()]);\n }\n /**\n * Creates a property accessor on the element prototype if one does not exist\n * and stores a {@linkcode PropertyDeclaration} for the property with the\n * given options. The property setter calls the property's `hasChanged`\n * property option or uses a strict identity check to determine whether or not\n * to request an update.\n *\n * This method may be overridden to customize properties; however,\n * when doing so, it's important to call `super.createProperty` to ensure\n * the property is setup correctly. This method calls\n * `getPropertyDescriptor` internally to get a descriptor to install.\n * To customize what properties do when they are get or set, override\n * `getPropertyDescriptor`. To customize the options for a property,\n * implement `createProperty` like this:\n *\n * ```ts\n * static createProperty(name, options) {\n * options = Object.assign(options, {myOption: true});\n * super.createProperty(name, options);\n * }\n * ```\n *\n * @nocollapse\n * @category properties\n */\n static createProperty(name, options = defaultPropertyDeclaration) {\n // If this is a state property, force the attribute to false.\n if (options.state) {\n options.attribute = false;\n }\n this.__prepare();\n this.elementProperties.set(name, options);\n if (!options.noAccessor) {\n const key = DEV_MODE\n ? // Use Symbol.for in dev mode to make it easier to maintain state\n // when doing HMR.\n Symbol.for(`${String(name)} (@property() cache)`)\n : Symbol();\n const descriptor = this.getPropertyDescriptor(name, key, options);\n if (descriptor !== undefined) {\n defineProperty(this.prototype, name, descriptor);\n }\n }\n }\n /**\n * Returns a property descriptor to be defined on the given named property.\n * If no descriptor is returned, the property will not become an accessor.\n * For example,\n *\n * ```ts\n * class MyElement extends LitElement {\n * static getPropertyDescriptor(name, key, options) {\n * const defaultDescriptor =\n * super.getPropertyDescriptor(name, key, options);\n * const setter = defaultDescriptor.set;\n * return {\n * get: defaultDescriptor.get,\n * set(value) {\n * setter.call(this, value);\n * // custom action.\n * },\n * configurable: true,\n * enumerable: true\n * }\n * }\n * }\n * ```\n *\n * @nocollapse\n * @category properties\n */\n static getPropertyDescriptor(name, key, options) {\n const { get, set } = getOwnPropertyDescriptor(this.prototype, name) ?? {\n get() {\n return this[key];\n },\n set(v) {\n this[key] = v;\n },\n };\n if (DEV_MODE && get == null) {\n if ('value' in (getOwnPropertyDescriptor(this.prototype, name) ?? {})) {\n throw new Error(`Field ${JSON.stringify(String(name))} on ` +\n `${this.name} was declared as a reactive property ` +\n `but it's actually declared as a value on the prototype. ` +\n `Usually this is due to using @property or @state on a method.`);\n }\n issueWarning('reactive-property-without-getter', `Field ${JSON.stringify(String(name))} on ` +\n `${this.name} was declared as a reactive property ` +\n `but it does not have a getter. This will be an error in a ` +\n `future version of Lit.`);\n }\n return {\n get() {\n return get?.call(this);\n },\n set(value) {\n const oldValue = get?.call(this);\n set.call(this, value);\n this.requestUpdate(name, oldValue, options);\n },\n configurable: true,\n enumerable: true,\n };\n }\n /**\n * Returns the property options associated with the given property.\n * These options are defined with a `PropertyDeclaration` via the `properties`\n * object or the `@property` decorator and are registered in\n * `createProperty(...)`.\n *\n * Note, this method should be considered \"final\" and not overridden. To\n * customize the options for a given property, override\n * {@linkcode createProperty}.\n *\n * @nocollapse\n * @final\n * @category properties\n */\n static getPropertyOptions(name) {\n return this.elementProperties.get(name) ?? defaultPropertyDeclaration;\n }\n /**\n * Initializes static own properties of the class used in bookkeeping\n * for element properties, initializers, etc.\n *\n * Can be called multiple times by code that needs to ensure these\n * properties exist before using them.\n *\n * This method ensures the superclass is finalized so that inherited\n * property metadata can be copied down.\n * @nocollapse\n */\n static __prepare() {\n if (this.hasOwnProperty(JSCompiler_renameProperty('elementProperties', this))) {\n // Already prepared\n return;\n }\n // Finalize any superclasses\n const superCtor = getPrototypeOf(this);\n superCtor.finalize();\n // Create own set of initializers for this class if any exist on the\n // superclass and copy them down. Note, for a small perf boost, avoid\n // creating initializers unless needed.\n if (superCtor._initializers !== undefined) {\n this._initializers = [...superCtor._initializers];\n }\n // Initialize elementProperties from the superclass\n this.elementProperties = new Map(superCtor.elementProperties);\n }\n /**\n * Finishes setting up the class so that it's ready to be registered\n * as a custom element and instantiated.\n *\n * This method is called by the ReactiveElement.observedAttributes getter.\n * If you override the observedAttributes getter, you must either call\n * super.observedAttributes to trigger finalization, or call finalize()\n * yourself.\n *\n * @nocollapse\n */\n static finalize() {\n if (this.hasOwnProperty(JSCompiler_renameProperty('finalized', this))) {\n return;\n }\n this.finalized = true;\n this.__prepare();\n // Create properties from the static properties block:\n if (this.hasOwnProperty(JSCompiler_renameProperty('properties', this))) {\n const props = this.properties;\n const propKeys = [\n ...getOwnPropertyNames(props),\n ...getOwnPropertySymbols(props),\n ];\n for (const p of propKeys) {\n this.createProperty(p, props[p]);\n }\n }\n // Create properties from standard decorator metadata:\n const metadata = this[Symbol.metadata];\n if (metadata !== null) {\n const properties = litPropertyMetadata.get(metadata);\n if (properties !== undefined) {\n for (const [p, options] of properties) {\n this.elementProperties.set(p, options);\n }\n }\n }\n // Create the attribute-to-property map\n this.__attributeToPropertyMap = new Map();\n for (const [p, options] of this.elementProperties) {\n const attr = this.__attributeNameForProperty(p, options);\n if (attr !== undefined) {\n this.__attributeToPropertyMap.set(attr, p);\n }\n }\n this.elementStyles = this.finalizeStyles(this.styles);\n if (DEV_MODE) {\n if (this.hasOwnProperty('createProperty')) {\n issueWarning('no-override-create-property', 'Overriding ReactiveElement.createProperty() is deprecated. ' +\n 'The override will not be called with standard decorators');\n }\n if (this.hasOwnProperty('getPropertyDescriptor')) {\n issueWarning('no-override-get-property-descriptor', 'Overriding ReactiveElement.getPropertyDescriptor() is deprecated. ' +\n 'The override will not be called with standard decorators');\n }\n }\n }\n /**\n * Takes the styles the user supplied via the `static styles` property and\n * returns the array of styles to apply to the element.\n * Override this method to integrate into a style management system.\n *\n * Styles are deduplicated preserving the _last_ instance in the list. This\n * is a performance optimization to avoid duplicated styles that can occur\n * especially when composing via subclassing. The last item is kept to try\n * to preserve the cascade order with the assumption that it's most important\n * that last added styles override previous styles.\n *\n * @nocollapse\n * @category styles\n */\n static finalizeStyles(styles) {\n const elementStyles = [];\n if (Array.isArray(styles)) {\n // Dedupe the flattened array in reverse order to preserve the last items.\n // Casting to Array works around TS error that\n // appears to come from trying to flatten a type CSSResultArray.\n const set = new Set(styles.flat(Infinity).reverse());\n // Then preserve original order by adding the set items in reverse order.\n for (const s of set) {\n elementStyles.unshift(getCompatibleStyle(s));\n }\n }\n else if (styles !== undefined) {\n elementStyles.push(getCompatibleStyle(styles));\n }\n return elementStyles;\n }\n /**\n * Returns the property name for the given attribute `name`.\n * @nocollapse\n */\n static __attributeNameForProperty(name, options) {\n const attribute = options.attribute;\n return attribute === false\n ? undefined\n : typeof attribute === 'string'\n ? attribute\n : typeof name === 'string'\n ? name.toLowerCase()\n : undefined;\n }\n constructor() {\n super();\n this.__instanceProperties = undefined;\n /**\n * True if there is a pending update as a result of calling `requestUpdate()`.\n * Should only be read.\n * @category updates\n */\n this.isUpdatePending = false;\n /**\n * Is set to `true` after the first update. The element code cannot assume\n * that `renderRoot` exists before the element `hasUpdated`.\n * @category updates\n */\n this.hasUpdated = false;\n /**\n * Name of currently reflecting property\n */\n this.__reflectingProperty = null;\n this.__initialize();\n }\n /**\n * Internal only override point for customizing work done when elements\n * are constructed.\n */\n __initialize() {\n this.__updatePromise = new Promise((res) => (this.enableUpdating = res));\n this._$changedProperties = new Map();\n // This enqueues a microtask that ust run before the first update, so it\n // must be called before requestUpdate()\n this.__saveInstanceProperties();\n // ensures first update will be caught by an early access of\n // `updateComplete`\n this.requestUpdate();\n this.constructor._initializers?.forEach((i) => i(this));\n }\n /**\n * Registers a `ReactiveController` to participate in the element's reactive\n * update cycle. The element automatically calls into any registered\n * controllers during its lifecycle callbacks.\n *\n * If the element is connected when `addController()` is called, the\n * controller's `hostConnected()` callback will be immediately called.\n * @category controllers\n */\n addController(controller) {\n (this.__controllers ??= new Set()).add(controller);\n // If a controller is added after the element has been connected,\n // call hostConnected. Note, re-using existence of `renderRoot` here\n // (which is set in connectedCallback) to avoid the need to track a\n // first connected state.\n if (this.renderRoot !== undefined && this.isConnected) {\n controller.hostConnected?.();\n }\n }\n /**\n * Removes a `ReactiveController` from the element.\n * @category controllers\n */\n removeController(controller) {\n this.__controllers?.delete(controller);\n }\n /**\n * Fixes any properties set on the instance before upgrade time.\n * Otherwise these would shadow the accessor and break these properties.\n * The properties are stored in a Map which is played back after the\n * constructor runs. Note, on very old versions of Safari (<=9) or Chrome\n * (<=41), properties created for native platform properties like (`id` or\n * `name`) may not have default values set in the element constructor. On\n * these browsers native properties appear on instances and therefore their\n * default value will overwrite any element default (e.g. if the element sets\n * this.id = 'id' in the constructor, the 'id' will become '' since this is\n * the native platform default).\n */\n __saveInstanceProperties() {\n const instanceProperties = new Map();\n const elementProperties = this.constructor\n .elementProperties;\n for (const p of elementProperties.keys()) {\n if (this.hasOwnProperty(p)) {\n instanceProperties.set(p, this[p]);\n delete this[p];\n }\n }\n if (instanceProperties.size > 0) {\n this.__instanceProperties = instanceProperties;\n }\n }\n /**\n * Returns the node into which the element should render and by default\n * creates and returns an open shadowRoot. Implement to customize where the\n * element's DOM is rendered. For example, to render into the element's\n * childNodes, return `this`.\n *\n * @return Returns a node into which to render.\n * @category rendering\n */\n createRenderRoot() {\n const renderRoot = this.shadowRoot ??\n this.attachShadow(this.constructor.shadowRootOptions);\n adoptStyles(renderRoot, this.constructor.elementStyles);\n return renderRoot;\n }\n /**\n * On first connection, creates the element's renderRoot, sets up\n * element styling, and enables updating.\n * @category lifecycle\n */\n connectedCallback() {\n // Create renderRoot before controllers `hostConnected`\n this.renderRoot ??=\n this.createRenderRoot();\n this.enableUpdating(true);\n this.__controllers?.forEach((c) => c.hostConnected?.());\n }\n /**\n * Note, this method should be considered final and not overridden. It is\n * overridden on the element instance with a function that triggers the first\n * update.\n * @category updates\n */\n enableUpdating(_requestedUpdate) { }\n /**\n * Allows for `super.disconnectedCallback()` in extensions while\n * reserving the possibility of making non-breaking feature additions\n * when disconnecting at some point in the future.\n * @category lifecycle\n */\n disconnectedCallback() {\n this.__controllers?.forEach((c) => c.hostDisconnected?.());\n }\n /**\n * Synchronizes property values when attributes change.\n *\n * Specifically, when an attribute is set, the corresponding property is set.\n * You should rarely need to implement this callback. If this method is\n * overridden, `super.attributeChangedCallback(name, _old, value)` must be\n * called.\n *\n * See [using the lifecycle callbacks](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks)\n * on MDN for more information about the `attributeChangedCallback`.\n * @category attributes\n */\n attributeChangedCallback(name, _old, value) {\n this._$attributeToProperty(name, value);\n }\n __propertyToAttribute(name, value) {\n const elemProperties = this.constructor.elementProperties;\n const options = elemProperties.get(name);\n const attr = this.constructor.__attributeNameForProperty(name, options);\n if (attr !== undefined && options.reflect === true) {\n const converter = options.converter?.toAttribute !==\n undefined\n ? options.converter\n : defaultConverter;\n const attrValue = converter.toAttribute(value, options.type);\n if (DEV_MODE &&\n this.constructor.enabledWarnings.includes('migration') &&\n attrValue === undefined) {\n issueWarning('undefined-attribute-value', `The attribute value for the ${name} property is ` +\n `undefined on element ${this.localName}. The attribute will be ` +\n `removed, but in the previous version of \\`ReactiveElement\\`, ` +\n `the attribute would not have changed.`);\n }\n // Track if the property is being reflected to avoid\n // setting the property again via `attributeChangedCallback`. Note:\n // 1. this takes advantage of the fact that the callback is synchronous.\n // 2. will behave incorrectly if multiple attributes are in the reaction\n // stack at time of calling. However, since we process attributes\n // in `update` this should not be possible (or an extreme corner case\n // that we'd like to discover).\n // mark state reflecting\n this.__reflectingProperty = name;\n if (attrValue == null) {\n this.removeAttribute(attr);\n }\n else {\n this.setAttribute(attr, attrValue);\n }\n // mark state not reflecting\n this.__reflectingProperty = null;\n }\n }\n /** @internal */\n _$attributeToProperty(name, value) {\n const ctor = this.constructor;\n // Note, hint this as an `AttributeMap` so closure clearly understands\n // the type; it has issues with tracking types through statics\n const propName = ctor.__attributeToPropertyMap.get(name);\n // Use tracking info to avoid reflecting a property value to an attribute\n // if it was just set because the attribute changed.\n if (propName !== undefined && this.__reflectingProperty !== propName) {\n const options = ctor.getPropertyOptions(propName);\n const converter = typeof options.converter === 'function'\n ? { fromAttribute: options.converter }\n : options.converter?.fromAttribute !== undefined\n ? options.converter\n : defaultConverter;\n // mark state reflecting\n this.__reflectingProperty = propName;\n this[propName] = converter.fromAttribute(value, options.type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n );\n // mark state not reflecting\n this.__reflectingProperty = null;\n }\n }\n /**\n * Requests an update which is processed asynchronously. This should be called\n * when an element should update based on some state not triggered by setting\n * a reactive property. In this case, pass no arguments. It should also be\n * called when manually implementing a property setter. In this case, pass the\n * property `name` and `oldValue` to ensure that any configured property\n * options are honored.\n *\n * @param name name of requesting property\n * @param oldValue old value of requesting property\n * @param options property options to use instead of the previously\n * configured options\n * @category updates\n */\n requestUpdate(name, oldValue, options) {\n // If we have a property key, perform property update steps.\n if (name !== undefined) {\n if (DEV_MODE && name instanceof Event) {\n issueWarning(``, `The requestUpdate() method was called with an Event as the property name. This is probably a mistake caused by binding this.requestUpdate as an event listener. Instead bind a function that will call it with no arguments: () => this.requestUpdate()`);\n }\n options ??= this.constructor.getPropertyOptions(name);\n const hasChanged = options.hasChanged ?? notEqual;\n const newValue = this[name];\n if (hasChanged(newValue, oldValue)) {\n this._$changeProperty(name, oldValue, options);\n }\n else {\n // Abort the request if the property should not be considered changed.\n return;\n }\n }\n if (this.isUpdatePending === false) {\n this.__updatePromise = this.__enqueueUpdate();\n }\n }\n /**\n * @internal\n */\n _$changeProperty(name, oldValue, options) {\n // TODO (justinfagnani): Create a benchmark of Map.has() + Map.set(\n // vs just Map.set()\n if (!this._$changedProperties.has(name)) {\n this._$changedProperties.set(name, oldValue);\n }\n // Add to reflecting properties set.\n // Note, it's important that every change has a chance to add the\n // property to `__reflectingProperties`. This ensures setting\n // attribute + property reflects correctly.\n if (options.reflect === true && this.__reflectingProperty !== name) {\n (this.__reflectingProperties ??= new Set()).add(name);\n }\n }\n /**\n * Sets up the element to asynchronously update.\n */\n async __enqueueUpdate() {\n this.isUpdatePending = true;\n try {\n // Ensure any previous update has resolved before updating.\n // This `await` also ensures that property changes are batched.\n await this.__updatePromise;\n }\n catch (e) {\n // Refire any previous errors async so they do not disrupt the update\n // cycle. Errors are refired so developers have a chance to observe\n // them, and this can be done by implementing\n // `window.onunhandledrejection`.\n Promise.reject(e);\n }\n const result = this.scheduleUpdate();\n // If `scheduleUpdate` returns a Promise, we await it. This is done to\n // enable coordinating updates with a scheduler. Note, the result is\n // checked to avoid delaying an additional microtask unless we need to.\n if (result != null) {\n await result;\n }\n return !this.isUpdatePending;\n }\n /**\n * Schedules an element update. You can override this method to change the\n * timing of updates by returning a Promise. The update will await the\n * returned Promise, and you should resolve the Promise to allow the update\n * to proceed. If this method is overridden, `super.scheduleUpdate()`\n * must be called.\n *\n * For instance, to schedule updates to occur just before the next frame:\n *\n * ```ts\n * override protected async scheduleUpdate(): Promise {\n * await new Promise((resolve) => requestAnimationFrame(() => resolve()));\n * super.scheduleUpdate();\n * }\n * ```\n * @category updates\n */\n scheduleUpdate() {\n const result = this.performUpdate();\n if (DEV_MODE &&\n this.constructor.enabledWarnings.includes('async-perform-update') &&\n typeof result?.then ===\n 'function') {\n issueWarning('async-perform-update', `Element ${this.localName} returned a Promise from performUpdate(). ` +\n `This behavior is deprecated and will be removed in a future ` +\n `version of ReactiveElement.`);\n }\n return result;\n }\n /**\n * Performs an element update. Note, if an exception is thrown during the\n * update, `firstUpdated` and `updated` will not be called.\n *\n * Call `performUpdate()` to immediately process a pending update. This should\n * generally not be needed, but it can be done in rare cases when you need to\n * update synchronously.\n *\n * @category updates\n */\n performUpdate() {\n // Abort any update if one is not pending when this is called.\n // This can happen if `performUpdate` is called early to \"flush\"\n // the update.\n if (!this.isUpdatePending) {\n return;\n }\n debugLogEvent?.({ kind: 'update' });\n if (!this.hasUpdated) {\n // Create renderRoot before first update. This occurs in `connectedCallback`\n // but is done here to support out of tree calls to `enableUpdating`/`performUpdate`.\n this.renderRoot ??=\n this.createRenderRoot();\n if (DEV_MODE) {\n // Produce warning if any reactive properties on the prototype are\n // shadowed by class fields. Instance fields set before upgrade are\n // deleted by this point, so any own property is caused by class field\n // initialization in the constructor.\n const ctor = this.constructor;\n const shadowedProperties = [...ctor.elementProperties.keys()].filter((p) => this.hasOwnProperty(p) && p in getPrototypeOf(this));\n if (shadowedProperties.length) {\n throw new Error(`The following properties on element ${this.localName} will not ` +\n `trigger updates as expected because they are set using class ` +\n `fields: ${shadowedProperties.join(', ')}. ` +\n `Native class fields and some compiled output will overwrite ` +\n `accessors used for detecting changes. See ` +\n `https://lit.dev/msg/class-field-shadowing ` +\n `for more information.`);\n }\n }\n // Mixin instance properties once, if they exist.\n if (this.__instanceProperties) {\n // TODO (justinfagnani): should we use the stored value? Could a new value\n // have been set since we stored the own property value?\n for (const [p, value] of this.__instanceProperties) {\n this[p] = value;\n }\n this.__instanceProperties = undefined;\n }\n // Trigger initial value reflection and populate the initial\n // changedProperties map, but only for the case of experimental\n // decorators on accessors, which will not have already populated the\n // changedProperties map. We can't know if these accessors had\n // initializers, so we just set them anyway - a difference from\n // experimental decorators on fields and standard decorators on\n // auto-accessors.\n // For context why experimentalDecorators with auto accessors are handled\n // specifically also see:\n // https://github.com/lit/lit/pull/4183#issuecomment-1711959635\n const elementProperties = this.constructor\n .elementProperties;\n if (elementProperties.size > 0) {\n for (const [p, options] of elementProperties) {\n if (options.wrapped === true &&\n !this._$changedProperties.has(p) &&\n this[p] !== undefined) {\n this._$changeProperty(p, this[p], options);\n }\n }\n }\n }\n let shouldUpdate = false;\n const changedProperties = this._$changedProperties;\n try {\n shouldUpdate = this.shouldUpdate(changedProperties);\n if (shouldUpdate) {\n this.willUpdate(changedProperties);\n this.__controllers?.forEach((c) => c.hostUpdate?.());\n this.update(changedProperties);\n }\n else {\n this.__markUpdated();\n }\n }\n catch (e) {\n // Prevent `firstUpdated` and `updated` from running when there's an\n // update exception.\n shouldUpdate = false;\n // Ensure element can accept additional updates after an exception.\n this.__markUpdated();\n throw e;\n }\n // The update is no longer considered pending and further updates are now allowed.\n if (shouldUpdate) {\n this._$didUpdate(changedProperties);\n }\n }\n /**\n * Invoked before `update()` to compute values needed during the update.\n *\n * Implement `willUpdate` to compute property values that depend on other\n * properties and are used in the rest of the update process.\n *\n * ```ts\n * willUpdate(changedProperties) {\n * // only need to check changed properties for an expensive computation.\n * if (changedProperties.has('firstName') || changedProperties.has('lastName')) {\n * this.sha = computeSHA(`${this.firstName} ${this.lastName}`);\n * }\n * }\n *\n * render() {\n * return html`SHA: ${this.sha}`;\n * }\n * ```\n *\n * @category updates\n */\n willUpdate(_changedProperties) { }\n // Note, this is an override point for polyfill-support.\n // @internal\n _$didUpdate(changedProperties) {\n this.__controllers?.forEach((c) => c.hostUpdated?.());\n if (!this.hasUpdated) {\n this.hasUpdated = true;\n this.firstUpdated(changedProperties);\n }\n this.updated(changedProperties);\n if (DEV_MODE &&\n this.isUpdatePending &&\n this.constructor.enabledWarnings.includes('change-in-update')) {\n issueWarning('change-in-update', `Element ${this.localName} scheduled an update ` +\n `(generally because a property was set) ` +\n `after an update completed, causing a new update to be scheduled. ` +\n `This is inefficient and should be avoided unless the next update ` +\n `can only be scheduled as a side effect of the previous update.`);\n }\n }\n __markUpdated() {\n this._$changedProperties = new Map();\n this.isUpdatePending = false;\n }\n /**\n * Returns a Promise that resolves when the element has completed updating.\n * The Promise value is a boolean that is `true` if the element completed the\n * update without triggering another update. The Promise result is `false` if\n * a property was set inside `updated()`. If the Promise is rejected, an\n * exception was thrown during the update.\n *\n * To await additional asynchronous work, override the `getUpdateComplete`\n * method. For example, it is sometimes useful to await a rendered element\n * before fulfilling this Promise. To do this, first await\n * `super.getUpdateComplete()`, then any subsequent state.\n *\n * @return A promise of a boolean that resolves to true if the update completed\n * without triggering another update.\n * @category updates\n */\n get updateComplete() {\n return this.getUpdateComplete();\n }\n /**\n * Override point for the `updateComplete` promise.\n *\n * It is not safe to override the `updateComplete` getter directly due to a\n * limitation in TypeScript which means it is not possible to call a\n * superclass getter (e.g. `super.updateComplete.then(...)`) when the target\n * language is ES5 (https://github.com/microsoft/TypeScript/issues/338).\n * This method should be overridden instead. For example:\n *\n * ```ts\n * class MyElement extends LitElement {\n * override async getUpdateComplete() {\n * const result = await super.getUpdateComplete();\n * await this._myChild.updateComplete;\n * return result;\n * }\n * }\n * ```\n *\n * @return A promise of a boolean that resolves to true if the update completed\n * without triggering another update.\n * @category updates\n */\n getUpdateComplete() {\n return this.__updatePromise;\n }\n /**\n * Controls whether or not `update()` should be called when the element requests\n * an update. By default, this method always returns `true`, but this can be\n * customized to control when to update.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n shouldUpdate(_changedProperties) {\n return true;\n }\n /**\n * Updates the element. This method reflects property values to attributes.\n * It can be overridden to render and keep updated element DOM.\n * Setting properties inside this method will *not* trigger\n * another update.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n update(_changedProperties) {\n // The forEach() expression will only run when when __reflectingProperties is\n // defined, and it returns undefined, setting __reflectingProperties to\n // undefined\n this.__reflectingProperties &&= this.__reflectingProperties.forEach((p) => this.__propertyToAttribute(p, this[p]));\n this.__markUpdated();\n }\n /**\n * Invoked whenever the element is updated. Implement to perform\n * post-updating tasks via DOM APIs, for example, focusing an element.\n *\n * Setting properties inside this method will trigger the element to update\n * again after this update cycle completes.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n updated(_changedProperties) { }\n /**\n * Invoked when the element is first updated. Implement to perform one time\n * work on the element after update.\n *\n * ```ts\n * firstUpdated() {\n * this.renderRoot.getElementById('my-text-area').focus();\n * }\n * ```\n *\n * Setting properties inside this method will trigger the element to update\n * again after this update cycle completes.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n firstUpdated(_changedProperties) { }\n}\n/**\n * Memoized list of all element styles.\n * Created lazily on user subclasses when finalizing the class.\n * @nocollapse\n * @category styles\n */\nReactiveElement.elementStyles = [];\n/**\n * Options used when calling `attachShadow`. Set this property to customize\n * the options for the shadowRoot; for example, to create a closed\n * shadowRoot: `{mode: 'closed'}`.\n *\n * Note, these options are used in `createRenderRoot`. If this method\n * is customized, options should be respected if possible.\n * @nocollapse\n * @category rendering\n */\nReactiveElement.shadowRootOptions = { mode: 'open' };\n// Assigned here to work around a jscompiler bug with static fields\n// when compiling to ES5.\n// https://github.com/google/closure-compiler/issues/3177\nReactiveElement[JSCompiler_renameProperty('elementProperties', ReactiveElement)] = new Map();\nReactiveElement[JSCompiler_renameProperty('finalized', ReactiveElement)] = new Map();\n// Apply polyfills if available\npolyfillSupport?.({ ReactiveElement });\n// Dev mode warnings...\nif (DEV_MODE) {\n // Default warning set.\n ReactiveElement.enabledWarnings = [\n 'change-in-update',\n 'async-perform-update',\n ];\n const ensureOwnWarnings = function (ctor) {\n if (!ctor.hasOwnProperty(JSCompiler_renameProperty('enabledWarnings', ctor))) {\n ctor.enabledWarnings = ctor.enabledWarnings.slice();\n }\n };\n ReactiveElement.enableWarning = function (warning) {\n ensureOwnWarnings(this);\n if (!this.enabledWarnings.includes(warning)) {\n this.enabledWarnings.push(warning);\n }\n };\n ReactiveElement.disableWarning = function (warning) {\n ensureOwnWarnings(this);\n const i = this.enabledWarnings.indexOf(warning);\n if (i >= 0) {\n this.enabledWarnings.splice(i, 1);\n }\n };\n}\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for ReactiveElement usage.\n(global.reactiveElementVersions ??= []).push('2.0.4');\nif (DEV_MODE && global.reactiveElementVersions.length > 1) {\n issueWarning('multiple-versions', `Multiple versions of Lit loaded. Loading multiple versions ` +\n `is not recommended.`);\n}\n//# sourceMappingURL=reactive-element.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\nimport { defaultConverter, notEqual, } from '../reactive-element.js';\nconst DEV_MODE = true;\nlet issueWarning;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n const issuedWarnings = (globalThis.litIssuedWarnings ??= new Set());\n // Issue a warning, if we haven't already.\n issueWarning = (code, warning) => {\n warning += ` See https://lit.dev/msg/${code} for more information.`;\n if (!issuedWarnings.has(warning)) {\n console.warn(warning);\n issuedWarnings.add(warning);\n }\n };\n}\nconst legacyProperty = (options, proto, name) => {\n const hasOwnProperty = proto.hasOwnProperty(name);\n proto.constructor.createProperty(name, hasOwnProperty ? { ...options, wrapped: true } : options);\n // For accessors (which have a descriptor on the prototype) we need to\n // return a descriptor, otherwise TypeScript overwrites the descriptor we\n // define in createProperty() with the original descriptor. We don't do this\n // for fields, which don't have a descriptor, because this could overwrite\n // descriptor defined by other decorators.\n return hasOwnProperty\n ? Object.getOwnPropertyDescriptor(proto, name)\n : undefined;\n};\n// This is duplicated from a similar variable in reactive-element.ts, but\n// actually makes sense to have this default defined with the decorator, so\n// that different decorators could have different defaults.\nconst defaultPropertyDeclaration = {\n attribute: true,\n type: String,\n converter: defaultConverter,\n reflect: false,\n hasChanged: notEqual,\n};\n/**\n * Wraps a class accessor or setter so that `requestUpdate()` is called with the\n * property name and old value when the accessor is set.\n */\nexport const standardProperty = (options = defaultPropertyDeclaration, target, context) => {\n const { kind, metadata } = context;\n if (DEV_MODE && metadata == null) {\n issueWarning('missing-class-metadata', `The class ${target} is missing decorator metadata. This ` +\n `could mean that you're using a compiler that supports decorators ` +\n `but doesn't support decorator metadata, such as TypeScript 5.1. ` +\n `Please update your compiler.`);\n }\n // Store the property options\n let properties = globalThis.litPropertyMetadata.get(metadata);\n if (properties === undefined) {\n globalThis.litPropertyMetadata.set(metadata, (properties = new Map()));\n }\n properties.set(context.name, options);\n if (kind === 'accessor') {\n // Standard decorators cannot dynamically modify the class, so we can't\n // replace a field with accessors. The user must use the new `accessor`\n // keyword instead.\n const { name } = context;\n return {\n set(v) {\n const oldValue = target.get.call(this);\n target.set.call(this, v);\n this.requestUpdate(name, oldValue, options);\n },\n init(v) {\n if (v !== undefined) {\n this._$changeProperty(name, undefined, options);\n }\n return v;\n },\n };\n }\n else if (kind === 'setter') {\n const { name } = context;\n return function (value) {\n const oldValue = this[name];\n target.call(this, value);\n this.requestUpdate(name, oldValue, options);\n };\n }\n throw new Error(`Unsupported decorator location: ${kind}`);\n};\n/**\n * A class field or accessor decorator which creates a reactive property that\n * reflects a corresponding attribute value. When a decorated property is set\n * the element will update and render. A {@linkcode PropertyDeclaration} may\n * optionally be supplied to configure property features.\n *\n * This decorator should only be used for public fields. As public fields,\n * properties should be considered as primarily settable by element users,\n * either via attribute or the property itself.\n *\n * Generally, properties that are changed by the element should be private or\n * protected fields and should use the {@linkcode state} decorator.\n *\n * However, sometimes element code does need to set a public property. This\n * should typically only be done in response to user interaction, and an event\n * should be fired informing the user; for example, a checkbox sets its\n * `checked` property when clicked and fires a `changed` event. Mutating public\n * properties should typically not be done for non-primitive (object or array)\n * properties. In other cases when an element needs to manage state, a private\n * property decorated via the {@linkcode state} decorator should be used. When\n * needed, state properties can be initialized via public properties to\n * facilitate complex interactions.\n *\n * ```ts\n * class MyElement {\n * @property({ type: Boolean })\n * clicked = false;\n * }\n * ```\n * @category Decorator\n * @ExportDecoratedItems\n */\nexport function property(options) {\n return (protoOrTarget, nameOrContext\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) => {\n return (typeof nameOrContext === 'object'\n ? standardProperty(options, protoOrTarget, nameOrContext)\n : legacyProperty(options, protoOrTarget, nameOrContext));\n };\n}\n//# sourceMappingURL=property.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { desc } from './base.js';\nconst DEV_MODE = true;\nlet issueWarning;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n const issuedWarnings = (globalThis.litIssuedWarnings ??= new Set());\n // Issue a warning, if we haven't already.\n issueWarning = (code, warning) => {\n warning += code\n ? ` See https://lit.dev/msg/${code} for more information.`\n : '';\n if (!issuedWarnings.has(warning)) {\n console.warn(warning);\n issuedWarnings.add(warning);\n }\n };\n}\n/**\n * A property decorator that converts a class property into a getter that\n * executes a querySelector on the element's renderRoot.\n *\n * @param selector A DOMString containing one or more selectors to match.\n * @param cache An optional boolean which when true performs the DOM query only\n * once and caches the result.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector\n *\n * ```ts\n * class MyElement {\n * @query('#first')\n * first: HTMLDivElement;\n *\n * render() {\n * return html`\n *
    \n *
    \n * `;\n * }\n * }\n * ```\n * @category Decorator\n */\nexport function query(selector, cache) {\n return ((protoOrTarget, nameOrContext, descriptor) => {\n const doQuery = (el) => {\n const result = (el.renderRoot?.querySelector(selector) ?? null);\n if (DEV_MODE && result === null && cache && !el.hasUpdated) {\n const name = typeof nameOrContext === 'object'\n ? nameOrContext.name\n : nameOrContext;\n issueWarning('', `@query'd field ${JSON.stringify(String(name))} with the 'cache' ` +\n `flag set for selector '${selector}' has been accessed before ` +\n `the first update and returned null. This is expected if the ` +\n `renderRoot tree has not been provided beforehand (e.g. via ` +\n `Declarative Shadow DOM). Therefore the value hasn't been cached.`);\n }\n // TODO: if we want to allow users to assert that the query will never\n // return null, we need a new option and to throw here if the result\n // is null.\n return result;\n };\n if (cache) {\n // Accessors to wrap from either:\n // 1. The decorator target, in the case of standard decorators\n // 2. The property descriptor, in the case of experimental decorators\n // on auto-accessors.\n // 3. Functions that access our own cache-key property on the instance,\n // in the case of experimental decorators on fields.\n const { get, set } = typeof nameOrContext === 'object'\n ? protoOrTarget\n : descriptor ??\n (() => {\n const key = DEV_MODE\n ? Symbol(`${String(nameOrContext)} (@query() cache)`)\n : Symbol();\n return {\n get() {\n return this[key];\n },\n set(v) {\n this[key] = v;\n },\n };\n })();\n return desc(protoOrTarget, nameOrContext, {\n get() {\n let result = get.call(this);\n if (result === undefined) {\n result = doQuery(this);\n if (result !== null || this.hasUpdated) {\n set.call(this, result);\n }\n }\n return result;\n },\n });\n }\n else {\n // This object works as the return type for both standard and\n // experimental decorators.\n return desc(protoOrTarget, nameOrContext, {\n get() {\n return doQuery(this);\n },\n });\n }\n });\n}\n//# sourceMappingURL=query.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst DEV_MODE = true;\nconst ENABLE_EXTRA_SECURITY_HOOKS = true;\nconst ENABLE_SHADYDOM_NOPATCH = true;\nconst NODE_MODE = false;\n// Allows minifiers to rename references to globalThis\nconst global = globalThis;\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n ? (event) => {\n const shouldEmit = global\n .emitLitDebugLogEvents;\n if (!shouldEmit) {\n return;\n }\n global.dispatchEvent(new CustomEvent('lit-debug', {\n detail: event,\n }));\n }\n : undefined;\n// Used for connecting beginRender and endRender events when there are nested\n// renders when errors are thrown preventing an endRender event from being\n// called.\nlet debugLogRenderId = 0;\nlet issueWarning;\nif (DEV_MODE) {\n global.litIssuedWarnings ??= new Set();\n // Issue a warning, if we haven't already.\n issueWarning = (code, warning) => {\n warning += code\n ? ` See https://lit.dev/msg/${code} for more information.`\n : '';\n if (!global.litIssuedWarnings.has(warning)) {\n console.warn(warning);\n global.litIssuedWarnings.add(warning);\n }\n };\n issueWarning('dev-mode', `Lit is in dev mode. Not recommended for production!`);\n}\nconst wrap = ENABLE_SHADYDOM_NOPATCH &&\n global.ShadyDOM?.inUse &&\n global.ShadyDOM?.noPatch === true\n ? global.ShadyDOM.wrap\n : (node) => node;\nconst trustedTypes = global.trustedTypes;\n/**\n * Our TrustedTypePolicy for HTML which is declared using the html template\n * tag function.\n *\n * That HTML is a developer-authored constant, and is parsed with innerHTML\n * before any untrusted expressions have been mixed in. Therefor it is\n * considered safe by construction.\n */\nconst policy = trustedTypes\n ? trustedTypes.createPolicy('lit-html', {\n createHTML: (s) => s,\n })\n : undefined;\nconst identityFunction = (value) => value;\nconst noopSanitizer = (_node, _name, _type) => identityFunction;\n/** Sets the global sanitizer factory. */\nconst setSanitizer = (newSanitizer) => {\n if (!ENABLE_EXTRA_SECURITY_HOOKS) {\n return;\n }\n if (sanitizerFactoryInternal !== noopSanitizer) {\n throw new Error(`Attempted to overwrite existing lit-html security policy.` +\n ` setSanitizeDOMValueFactory should be called at most once.`);\n }\n sanitizerFactoryInternal = newSanitizer;\n};\n/**\n * Only used in internal tests, not a part of the public API.\n */\nconst _testOnlyClearSanitizerFactoryDoNotCallOrElse = () => {\n sanitizerFactoryInternal = noopSanitizer;\n};\nconst createSanitizer = (node, name, type) => {\n return sanitizerFactoryInternal(node, name, type);\n};\n// Added to an attribute name to mark the attribute as bound so we can find\n// it easily.\nconst boundAttributeSuffix = '$lit$';\n// This marker is used in many syntactic positions in HTML, so it must be\n// a valid element name and attribute name. We don't support dynamic names (yet)\n// but this at least ensures that the parse tree is closer to the template\n// intention.\nconst marker = `lit$${Math.random().toFixed(9).slice(2)}$`;\n// String used to tell if a comment is a marker comment\nconst markerMatch = '?' + marker;\n// Text used to insert a comment marker node. We use processing instruction\n// syntax because it's slightly smaller, but parses as a comment node.\nconst nodeMarker = `<${markerMatch}>`;\nconst d = NODE_MODE && global.document === undefined\n ? {\n createTreeWalker() {\n return {};\n },\n }\n : document;\n// Creates a dynamic marker. We never have to search for these in the DOM.\nconst createMarker = () => d.createComment('');\nconst isPrimitive = (value) => value === null || (typeof value != 'object' && typeof value != 'function');\nconst isArray = Array.isArray;\nconst isIterable = (value) => isArray(value) ||\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof value?.[Symbol.iterator] === 'function';\nconst SPACE_CHAR = `[ \\t\\n\\f\\r]`;\nconst ATTR_VALUE_CHAR = `[^ \\t\\n\\f\\r\"'\\`<>=]`;\nconst NAME_CHAR = `[^\\\\s\"'>=/]`;\n// These regexes represent the five parsing states that we care about in the\n// Template's HTML scanner. They match the *end* of the state they're named\n// after.\n// Depending on the match, we transition to a new state. If there's no match,\n// we stay in the same state.\n// Note that the regexes are stateful. We utilize lastIndex and sync it\n// across the multiple regexes used. In addition to the five regexes below\n// we also dynamically create a regex to find the matching end tags for raw\n// text elements.\n/**\n * End of text is: `<` followed by:\n * (comment start) or (tag) or (dynamic tag binding)\n */\nconst textEndRegex = /<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g;\nconst COMMENT_START = 1;\nconst TAG_NAME = 2;\nconst DYNAMIC_TAG_NAME = 3;\nconst commentEndRegex = /-->/g;\n/**\n * Comments not started with \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n`;\n//# sourceMappingURL=close-material-svg.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { html } from 'lit';\nexport default html `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n`;\n//# sourceMappingURL=controls-svg.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { html } from 'lit';\nexport default html `\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\n`;\n//# sourceMappingURL=view-in-ar-material-svg.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { html, render } from 'lit';\nimport CloseIcon from './assets/close-material-svg.js';\nimport ControlsPrompt from './assets/controls-svg.js';\nimport ARGlyph from './assets/view-in-ar-material-svg.js';\nconst templateResult = html `\n\n
    \n
    \n
    \n \n \n \n
    \n\n
    \n\n \n
    \n \n \n \n
    \n\n
    \n \n \n ${ARGlyph}\n \n \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n ${ControlsPrompt}\n \n
    \n
    \n\n
    \n \n \n
    \n
    \n \n \n
    \n\n
    \n \n\n
    \n \n
    \n
    \n
    \n
    \n
    \n\n
    \n \n \n ${CloseIcon}\n \n \n
    \n
    \n
    \n
    \n \n
    `;\nexport const makeTemplate = (shadowRoot) => {\n render(templateResult, shadowRoot);\n};\n//# sourceMappingURL=template.js.map","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2022, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptDecoder = (function() {\n\t\"use strict\";\n\n\t// Built with clang version 14.0.4\n\t// Built from meshoptimizer 0.18\n\tvar wasm_base = \"b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq:P8Yqdbk;3sezu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfgocl4cifcd4hxdndndndnaoc9WGgmTmbcbhPcehsawcjdfhzalhHinaraH9Rax6midnaraHaxfgl9RcK6mbczhoinawcj;cbfaogifgoc9WfhOdndndndndnaHaic9WfgAco4fRbbaAci4coG4ciGPlbedibkaO9cb83ibaOcwf9cb83ibxikaOalRblalRbbgAco4gCaCciSgCE86bbaocGfalclfaCfgORbbaAcl4ciGgCaCciSgCE86bbaocVfaOaCfgORbbaAcd4ciGgCaCciSgCE86bbaoc7faOaCfgORbbaAciGgAaAciSgAE86bbaoctfaOaAfgARbbalRbegOco4gCaCciSgCE86bbaoc91faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc4faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc93faAaCfgARbbaOciGgOaOciSgOE86bbaoc94faAaOfgARbbalRbdgOco4gCaCciSgCE86bbaoc95faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc96faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc97faAaCfgARbbaOciGgOaOciSgOE86bbaoc98faAaOfgORbbalRbiglco4gAaAciSgAE86bbaoc99faOaAfgORbbalcl4ciGgAaAciSgAE86bbaoc9:faOaAfgORbbalcd4ciGgAaAciSgAE86bbaocufaOaAfgoRbbalciGglalciSglE86bbaoalfhlxdkaOalRbwalRbbgAcl4gCaCcsSgCE86bbaocGfalcwfaCfgORbbaAcsGgAaAcsSgAE86bbaocVfaOaAfgORbbalRbegAcl4gCaCcsSgCE86bbaoc7faOaCfgORbbaAcsGgAaAcsSgAE86bbaoctfaOaAfgORbbalRbdgAcl4gCaCcsSgCE86bbaoc91faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc4faOaAfgORbbalRbigAcl4gCaCcsSgCE86bbaoc93faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc94faOaAfgORbbalRblgAcl4gCaCcsSgCE86bbaoc95faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc96faOaAfgORbbalRbvgAcl4gCaCcsSgCE86bbaoc97faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc98faOaAfgORbbalRbogAcl4gCaCcsSgCE86bbaoc99faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc9:faOaAfgORbbalRbrglcl4gAaAcsSgAE86bbaocufaOaAfgoRbbalcsGglalcsSglE86bbaoalfhlxekaOal8Pbb83bbaOcwfalcwf8Pbb83bbalczfhlkdnaiam9pmbaiczfhoaral9RcL0mekkaiam6mialTmidnakTmbawaPfRbbhOcbhoazhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkkazcefhzaPcefgPad6hsalhHaPad9hmexvkkcbhlasceGmdxikalaxad2fhCdnakTmbcbhHcehsawcjdfhminaral9Rax6mialTmdalaxfhlawaHfRbbhOcbhoamhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkamcefhmaHcefgHad6hsaHad9hmbkaChlxikcbhocehsinaral9Rax6mdalTmealaxfhlaocefgoad6hsadao9hmbkaChlxdkcbhlasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqalmbkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;yzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabavcefciGaiVcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabavcdfciGaiVcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabavcufciGaiVcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabavciGaiVcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2geTmbinababydbgdcwtcw91:Yadce91cjjj;8ifcjjj98G::NUdbabclfhbaecufgembkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaiczfhiaeczfheadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb\";\n\tvar wasm_simd = \"b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;t9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;h8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincehHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAci6hHalhOaAcefgohAaoclSmdxekkcbhlaHceGmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;uzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:EPliuo97eue978Jjjjjbca9Rhidndnadcl9hmbdnaec98GglTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaiaeciGgvcdtgdVcbczad9R;8kbaiabalcdtfglad;8qbbdnavTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkalaiad;8qbbskdnaec98GgxTmbcbhvabhdinadczfglalpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgvax6mbkkaxae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabaxcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbhdabheinaeaepbbbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepkbbaeczfheadclfgdav6mbkkdnaval9pmbaialciGgdcdtgeVcbc;abae9R;8kbaiabavcdtfgvae;8qbbdnadTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepklbkavaiae;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb\";\n\n\tvar detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]);\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar wasm = WebAssembly.validate(detector) ? wasm_simd : wasm_base;\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction decode(fun, target, count, size, source, filter) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar count4 = (count + 3) & ~3;\n\t\tvar tp = sbrk(count4 * size);\n\t\tvar sp = sbrk(source.length);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(source, sp);\n\t\tvar res = fun(tp, count, size, sp, source.length);\n\t\tif (res == 0 && filter) {\n\t\t\tfilter(tp, count4, size);\n\t\t}\n\t\ttarget.set(heap.subarray(tp, tp + count * size));\n\t\tsbrk(tp - sbrk(0));\n\t\tif (res != 0) {\n\t\t\tthrow new Error(\"Malformed buffer data: \" + res);\n\t\t}\n\t}\n\n\tvar filters = {\n\t\tNONE: \"\",\n\t\tOCTAHEDRAL: \"meshopt_decodeFilterOct\",\n\t\tQUATERNION: \"meshopt_decodeFilterQuat\",\n\t\tEXPONENTIAL: \"meshopt_decodeFilterExp\",\n\t};\n\n\tvar decoders = {\n\t\tATTRIBUTES: \"meshopt_decodeVertexBuffer\",\n\t\tTRIANGLES: \"meshopt_decodeIndexBuffer\",\n\t\tINDICES: \"meshopt_decodeIndexSequence\",\n\t};\n\n\tvar workers = [];\n\tvar requestId = 0;\n\n\tfunction createWorker(url) {\n\t\tvar worker = {\n\t\t\tobject: new Worker(url),\n\t\t\tpending: 0,\n\t\t\trequests: {}\n\t\t};\n\n\t\tworker.object.onmessage = function(event) {\n\t\t\tvar data = event.data;\n\n\t\t\tworker.pending -= data.count;\n\t\t\tworker.requests[data.id][data.action](data.value);\n\n\t\t\tdelete worker.requests[data.id];\n\t\t};\n\n\t\treturn worker;\n\t}\n\n\tfunction initWorkers(count) {\n\t\tvar source =\n\t\t\t\"var instance; var ready = WebAssembly.instantiate(new Uint8Array([\" + new Uint8Array(unpack(wasm)) + \"]), {})\" +\n\t\t\t\".then(function(result) { instance = result.instance; instance.exports.__wasm_call_ctors(); });\" +\n\t\t\t\"self.onmessage = workerProcess;\" +\n\t\t\tdecode.toString() + workerProcess.toString();\n\n\t\tvar blob = new Blob([source], {type: 'text/javascript'});\n\t\tvar url = URL.createObjectURL(blob);\n\n\t\tfor (var i = 0; i < count; ++i) {\n\t\t\tworkers[i] = createWorker(url);\n\t\t}\n\n\t\tURL.revokeObjectURL(url);\n\t}\n\n\tfunction decodeWorker(count, size, source, mode, filter) {\n\t\tvar worker = workers[0];\n\n\t\tfor (var i = 1; i < workers.length; ++i) {\n\t\t\tif (workers[i].pending < worker.pending) {\n\t\t\t\tworker = workers[i];\n\t\t\t}\n\t\t}\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tvar data = new Uint8Array(source);\n\t\t\tvar id = requestId++;\n\n\t\t\tworker.pending += count;\n\t\t\tworker.requests[id] = { resolve: resolve, reject: reject };\n\t\t\tworker.object.postMessage({ id: id, count: count, size: size, source: data, mode: mode, filter: filter }, [ data.buffer ]);\n\t\t});\n\t}\n\n\tfunction workerProcess(event) {\n\t\tready.then(function() {\n\t\t\tvar data = event.data;\n\t\t\ttry {\n\t\t\t\tvar target = new Uint8Array(data.count * data.size);\n\t\t\t\tdecode(instance.exports[data.mode], target, data.count, data.size, data.source, instance.exports[data.filter]);\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"resolve\", value: target }, [ target.buffer ]);\n\t\t\t} catch (error) {\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"reject\", value: error });\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\tuseWorkers: function(count) {\n\t\t\tinitWorkers(count);\n\t\t},\n\t\tdecodeVertexBuffer: function(target, count, size, source, filter) {\n\t\t\tdecode(instance.exports.meshopt_decodeVertexBuffer, target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeIndexBuffer: function(target, count, size, source) {\n\t\t\tdecode(instance.exports.meshopt_decodeIndexBuffer, target, count, size, source);\n\t\t},\n\t\tdecodeIndexSequence: function(target, count, size, source) {\n\t\t\tdecode(instance.exports.meshopt_decodeIndexSequence, target, count, size, source);\n\t\t},\n\t\tdecodeGltfBuffer: function(target, count, size, source, mode, filter) {\n\t\t\tdecode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeGltfBufferAsync: function(count, size, source, mode, filter) {\n\t\t\tif (workers.length > 0) {\n\t\t\t\treturn decodeWorker(count, size, source, decoders[mode], filters[filter]);\n\t\t\t}\n\n\t\t\treturn ready.then(function() {\n\t\t\t\tvar target = new Uint8Array(count * size);\n\t\t\t\tdecode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t\t\treturn target;\n\t\t\t});\n\t\t}\n\t};\n})();\n\nexport { MeshoptDecoder };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tColorManagement,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\nclass DRACOLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\n\tparse( buffer, onLoad, onError = ()=>{} ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace, onError ).catch( onError );\n\n\t}\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst result = geometryData.attributes[ i ];\n\t\t\tconst name = result.name;\n\t\t\tconst array = result.array;\n\t\t\tconst itemSize = result.itemSize;\n\n\t\t\tconst attribute = new BufferAttribute( array, itemSize );\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, result.vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i );\n\t\t\tColorManagement.toWorkingColorSpace( _color, SRGBColorSpace );\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) => {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorker.toString();\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) => {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) => attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and `.drc` files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) {\n\n\t\tconst numComponents = attribute.num_components();\n\t\tconst numPoints = dracoGeometry.num_points();\n\t\tconst numValues = numPoints * numComponents;\n\t\tconst byteLength = numValues * attributeType.BYTES_PER_ELEMENT;\n\t\tconst dataType = getDracoDataType( draco, attributeType );\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr );\n\t\tconst array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tarray: array,\n\t\t\titemSize: numComponents\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, attributeType ) {\n\n\t\tswitch ( attributeType ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n\nexport { DRACOLoader };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param {Array} geometries\n * @param {boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute} attribute\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array} attributes\n * @return {Array}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n *\n * @param {Object} cache\n * @return {Material}\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array} targets\n * @param {GLTFParser} parser\n * @return {Promise}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\tif ( uri.search( /\\.ktx2($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/ktx2/ ) === 0 ) return 'image/ktx2';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet safariVersion = - 1;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tconst userAgent = navigator.userAgent;\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true;\n\t\t\tconst safariMatch = userAgent.match( /Version\\/(\\d+)/ );\n\t\t\tsafariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : - 1;\n\n\t\t\tisFirefox = userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t *\n\t * @param {Object} cache\n\t * @param {Object3D} index\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/**\n\t * Returns a reference to a shared resource, cloning it if necessary.\n\t *\n\t * @param {Object} cache\n\t * @param {number} index\n\t * @param {Object} object\n\t * @return {Object}\n\t */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\t// Ignore normalized since we copy from sparse\n\t\t\t\tbufferAttribute.normalized = false;\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute.normalized = normalized;\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\t\t\ttexture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( texture, sourceDef );\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t *\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @param {string} colorSpace\n\t * @return {Promise}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * When Object3D instances are targeted by animation, they need unique names.\n\t *\n\t * @param {string} originalName\n\t * @return {string}\n\t */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array} primitives\n\t * @return {Promise>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( animationName, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","/**\n * @author Deepkolos / https://github.com/deepkolos\n */\n\nexport class WorkerPool {\n\n\tconstructor( pool = 4 ) {\n\n\t\tthis.pool = pool;\n\t\tthis.queue = [];\n\t\tthis.workers = [];\n\t\tthis.workersResolve = [];\n\t\tthis.workerStatus = 0;\n\n\t}\n\n\t_initWorker( workerId ) {\n\n\t\tif ( ! this.workers[ workerId ] ) {\n\n\t\t\tconst worker = this.workerCreator();\n\t\t\tworker.addEventListener( 'message', this._onMessage.bind( this, workerId ) );\n\t\t\tthis.workers[ workerId ] = worker;\n\n\t\t}\n\n\t}\n\n\t_getIdleWorker() {\n\n\t\tfor ( let i = 0; i < this.pool; i ++ )\n\t\t\tif ( ! ( this.workerStatus & ( 1 << i ) ) ) return i;\n\n\t\treturn - 1;\n\n\t}\n\n\t_onMessage( workerId, msg ) {\n\n\t\tconst resolve = this.workersResolve[ workerId ];\n\t\tresolve && resolve( msg );\n\n\t\tif ( this.queue.length ) {\n\n\t\t\tconst { resolve, msg, transfer } = this.queue.shift();\n\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t} else {\n\n\t\t\tthis.workerStatus ^= 1 << workerId;\n\n\t\t}\n\n\t}\n\n\tsetWorkerCreator( workerCreator ) {\n\n\t\tthis.workerCreator = workerCreator;\n\n\t}\n\n\tsetWorkerLimit( pool ) {\n\n\t\tthis.pool = pool;\n\n\t}\n\n\tpostMessage( msg, transfer ) {\n\n\t\treturn new Promise( ( resolve ) => {\n\n\t\t\tconst workerId = this._getIdleWorker();\n\n\t\t\tif ( workerId !== - 1 ) {\n\n\t\t\t\tthis._initWorker( workerId );\n\t\t\t\tthis.workerStatus |= 1 << workerId;\n\t\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t\t} else {\n\n\t\t\t\tthis.queue.push( { resolve, msg, transfer } );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workers.forEach( ( worker ) => worker.terminate() );\n\t\tthis.workersResolve.length = 0;\n\t\tthis.workers.length = 0;\n\t\tthis.queue.length = 0;\n\t\tthis.workerStatus = 0;\n\n\t}\n\n}\n","const t=0,e=1,n=2,i=3,s=0,a=0,r=2,o=0,l=1,f=160,h=161,U=162,c=163,_=166,p=0,g=1,y=0,x=1,u=2,b=3,d=4,w=5,m=6,D=7,B=8,L=9,v=10,A=11,k=12,V=13,I=14,S=15,F=16,O=17,E=18,T=0,C=1,M=2,P=3,z=4,W=5,H=6,N=7,K=8,X=9,R=10,Y=11,j=0,q=1,G=2,J=13,Q=14,Z=15,$=128,tt=64,et=32,nt=16,it=0,st=1,at=2,rt=3,ot=4,lt=5,ft=6,ht=7,Ut=8,ct=9,_t=10,pt=13,gt=14,yt=15,xt=16,ut=17,bt=20,dt=21,wt=22,mt=23,Dt=24,Bt=27,Lt=28,vt=29,At=30,kt=31,Vt=34,It=35,St=36,Ft=37,Ot=38,Et=41,Tt=42,Ct=43,Mt=44,Pt=45,zt=48,Wt=49,Ht=50,Nt=58,Kt=59,Xt=62,Rt=63,Yt=64,jt=65,qt=68,Gt=69,Jt=70,Qt=71,Zt=74,$t=75,te=76,ee=77,ne=78,ie=81,se=82,ae=83,re=84,oe=85,le=88,fe=89,he=90,Ue=91,ce=92,_e=95,pe=96,ge=97,ye=98,xe=99,ue=100,be=101,de=102,we=103,me=104,De=105,Be=106,Le=107,ve=108,Ae=109,ke=110,Ve=111,Ie=112,Se=113,Fe=114,Oe=115,Ee=116,Te=117,Ce=118,Me=119,Pe=120,ze=121,We=122,He=123,Ne=124,Ke=125,Xe=126,Re=127,Ye=128,je=129,qe=130,Ge=131,Je=132,Qe=133,Ze=134,$e=135,tn=136,en=137,nn=138,sn=139,an=140,rn=141,on=142,ln=143,fn=144,hn=145,Un=146,cn=147,_n=148,pn=149,gn=150,yn=151,xn=152,un=153,bn=154,dn=155,wn=156,mn=157,Dn=158,Bn=159,Ln=160,vn=161,An=162,kn=163,Vn=164,In=165,Sn=166,Fn=167,On=168,En=169,Tn=170,Cn=171,Mn=172,Pn=173,zn=174,Wn=175,Hn=176,Nn=177,Kn=178,Xn=179,Rn=180,Yn=181,jn=182,qn=183,Gn=184,Jn=1000156007,Qn=1000156008,Zn=1000156009,$n=1000156010,ti=1000156011,ei=1000156017,ni=1000156018,ii=1000156019,si=1000156020,ai=1000156021,ri=1000054e3,oi=1000054001,li=1000054002,fi=1000054003,hi=1000054004,Ui=1000054005,ci=1000054006,_i=1000054007,pi=1000066e3,gi=1000066001,yi=1000066002,xi=1000066003,ui=1000066004,bi=1000066005,di=1000066006,wi=1000066007,mi=1000066008,Di=1000066009,Bi=1000066010,Li=1000066011,vi=1000066012,Ai=1000066013,ki=100034e4,Vi=1000340001;class Ii{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null}}class Si{constructor(t,e,n,i){this._dataView=void 0,this._littleEndian=void 0,this._offset=void 0,this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint8Array(t){const e=new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+this._offset,t);return this._offset+=t,e}_skip(t){return this._offset+=t,this}_scan(t,e){void 0===e&&(e=0);const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i0?U+a.byteLength:0;c%8&&(c+=8-c%8);const _=[],p=new DataView(new ArrayBuffer(3*t.levels.length*8)),g=new Uint32Array(t.levels.length);let y=0;0===t.supercompressionScheme&&(y=function(t,e){const n=Math.max(t,4),i=Math.min(t,4);let s=n;for(;s%i!=0;)s+=n;return s}(function(t){return t.levels[0].levelData.byteLength/function(t,e){let n=1;const i=[t.pixelWidth,t.pixelHeight,t.pixelDepth],s=function(t){const[e,n,i]=t.dataFormatDescriptor[0].texelBlockDimension;return[e+1,n+1,i+1]}(t);for(let t=0;t<3;t++)if(i[t]>0){const e=Math.ceil(Math.floor(i[t]*Math.pow(2,-0))/s[t]);n*=Math.max(1,e)}return t.layerCount>0&&(n*=t.layerCount),t.faceCount>0&&(n*=t.faceCount),n}(t)}(t)));let x=(c||U+a.byteLength)+n.byteLength;for(let e=t.levels.length-1;e>=0;e--){if(x%y){const t=Mi(x,y);_.push(new Uint8Array(t)),x+=t}const n=t.levels[e];_.push(n.levelData),g[e]=x,x+=n.levelData.byteLength}for(let e=0;e0?c:0),!0),b.setBigUint64(60,BigInt(n.byteLength),!0),new Uint8Array(Ci([new Uint8Array(Oi).buffer,u,p.buffer,o,a,c>0?new ArrayBuffer(c-(U+a.byteLength)):new ArrayBuffer(0),n,..._]))}export{Z as KHR_DF_CHANNEL_RGBSDA_ALPHA,G as KHR_DF_CHANNEL_RGBSDA_BLUE,Q as KHR_DF_CHANNEL_RGBSDA_DEPTH,q as KHR_DF_CHANNEL_RGBSDA_GREEN,j as KHR_DF_CHANNEL_RGBSDA_RED,J as KHR_DF_CHANNEL_RGBSDA_STENCIL,g as KHR_DF_FLAG_ALPHA_PREMULTIPLIED,p as KHR_DF_FLAG_ALPHA_STRAIGHT,s as KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,U as KHR_DF_MODEL_ASTC,f as KHR_DF_MODEL_ETC1,c as KHR_DF_MODEL_ETC1S,h as KHR_DF_MODEL_ETC2,l as KHR_DF_MODEL_RGBSDA,_ as KHR_DF_MODEL_UASTC,o as KHR_DF_MODEL_UNSPECIFIED,H as KHR_DF_PRIMARIES_ACES,N as KHR_DF_PRIMARIES_ACESCC,Y as KHR_DF_PRIMARIES_ADOBERGB,z as KHR_DF_PRIMARIES_BT2020,M as KHR_DF_PRIMARIES_BT601_EBU,P as KHR_DF_PRIMARIES_BT601_SMPTE,C as KHR_DF_PRIMARIES_BT709,W as KHR_DF_PRIMARIES_CIEXYZ,R as KHR_DF_PRIMARIES_DISPLAYP3,K as KHR_DF_PRIMARIES_NTSC1953,X as KHR_DF_PRIMARIES_PAL525,T as KHR_DF_PRIMARIES_UNSPECIFIED,et as KHR_DF_SAMPLE_DATATYPE_EXPONENT,$ as KHR_DF_SAMPLE_DATATYPE_FLOAT,nt as KHR_DF_SAMPLE_DATATYPE_LINEAR,tt as KHR_DF_SAMPLE_DATATYPE_SIGNED,F as KHR_DF_TRANSFER_ACESCC,O as KHR_DF_TRANSFER_ACESCCT,E as KHR_DF_TRANSFER_ADOBERGB,D as KHR_DF_TRANSFER_BT1886,k as KHR_DF_TRANSFER_DCIP3,L as KHR_DF_TRANSFER_HLG_EOTF,B as KHR_DF_TRANSFER_HLG_OETF,b as KHR_DF_TRANSFER_ITU,x as KHR_DF_TRANSFER_LINEAR,d as KHR_DF_TRANSFER_NTSC,I as KHR_DF_TRANSFER_PAL625_EOTF,V as KHR_DF_TRANSFER_PAL_OETF,v as KHR_DF_TRANSFER_PQ_EOTF,A as KHR_DF_TRANSFER_PQ_OETF,w as KHR_DF_TRANSFER_SLOG,m as KHR_DF_TRANSFER_SLOG2,u as KHR_DF_TRANSFER_SRGB,S as KHR_DF_TRANSFER_ST240,y as KHR_DF_TRANSFER_UNSPECIFIED,a as KHR_DF_VENDORID_KHRONOS,r as KHR_DF_VERSION,e as KHR_SUPERCOMPRESSION_BASISLZ,t as KHR_SUPERCOMPRESSION_NONE,i as KHR_SUPERCOMPRESSION_ZLIB,n as KHR_SUPERCOMPRESSION_ZSTD,Ii as KTX2Container,Ut as VK_FORMAT_A1R5G5B5_UNORM_PACK16,Gt as VK_FORMAT_A2B10G10R10_SINT_PACK32,jt as VK_FORMAT_A2B10G10R10_SNORM_PACK32,qt as VK_FORMAT_A2B10G10R10_UINT_PACK32,Yt as VK_FORMAT_A2B10G10R10_UNORM_PACK32,Rt as VK_FORMAT_A2R10G10B10_SINT_PACK32,Kt as VK_FORMAT_A2R10G10B10_SNORM_PACK32,Xt as VK_FORMAT_A2R10G10B10_UINT_PACK32,Nt as VK_FORMAT_A2R10G10B10_UNORM_PACK32,Vi as VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,ki as VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,Li as VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT,Rn as VK_FORMAT_ASTC_10x10_SRGB_BLOCK,Xn as VK_FORMAT_ASTC_10x10_UNORM_BLOCK,mi as VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT,zn as VK_FORMAT_ASTC_10x5_SRGB_BLOCK,Pn as VK_FORMAT_ASTC_10x5_UNORM_BLOCK,Di as VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT,Hn as VK_FORMAT_ASTC_10x6_SRGB_BLOCK,Wn as VK_FORMAT_ASTC_10x6_UNORM_BLOCK,Bi as VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT,Kn as VK_FORMAT_ASTC_10x8_SRGB_BLOCK,Nn as VK_FORMAT_ASTC_10x8_UNORM_BLOCK,vi as VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT,jn as VK_FORMAT_ASTC_12x10_SRGB_BLOCK,Yn as VK_FORMAT_ASTC_12x10_UNORM_BLOCK,Ai as VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT,Gn as VK_FORMAT_ASTC_12x12_SRGB_BLOCK,qn as VK_FORMAT_ASTC_12x12_UNORM_BLOCK,pi as VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,Dn as VK_FORMAT_ASTC_4x4_SRGB_BLOCK,mn as VK_FORMAT_ASTC_4x4_UNORM_BLOCK,gi as VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT,Ln as VK_FORMAT_ASTC_5x4_SRGB_BLOCK,Bn as VK_FORMAT_ASTC_5x4_UNORM_BLOCK,yi as VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT,An as VK_FORMAT_ASTC_5x5_SRGB_BLOCK,vn as VK_FORMAT_ASTC_5x5_UNORM_BLOCK,xi as VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT,Vn as VK_FORMAT_ASTC_6x5_SRGB_BLOCK,kn as VK_FORMAT_ASTC_6x5_UNORM_BLOCK,ui as VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,Sn as VK_FORMAT_ASTC_6x6_SRGB_BLOCK,In as VK_FORMAT_ASTC_6x6_UNORM_BLOCK,bi as VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT,On as VK_FORMAT_ASTC_8x5_SRGB_BLOCK,Fn as VK_FORMAT_ASTC_8x5_UNORM_BLOCK,di as VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT,Tn as VK_FORMAT_ASTC_8x6_SRGB_BLOCK,En as VK_FORMAT_ASTC_8x6_UNORM_BLOCK,wi as VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT,Mn as VK_FORMAT_ASTC_8x8_SRGB_BLOCK,Cn as VK_FORMAT_ASTC_8x8_UNORM_BLOCK,We as VK_FORMAT_B10G11R11_UFLOAT_PACK32,ti as VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,ai as VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,rt as VK_FORMAT_B4G4R4A4_UNORM_PACK16,ht as VK_FORMAT_B5G5R5A1_UNORM_PACK16,lt as VK_FORMAT_B5G6R5_UNORM_PACK16,Wt as VK_FORMAT_B8G8R8A8_SINT,Pt as VK_FORMAT_B8G8R8A8_SNORM,Ht as VK_FORMAT_B8G8R8A8_SRGB,zt as VK_FORMAT_B8G8R8A8_UINT,Mt as VK_FORMAT_B8G8R8A8_UNORM,It as VK_FORMAT_B8G8R8_SINT,kt as VK_FORMAT_B8G8R8_SNORM,St as VK_FORMAT_B8G8R8_SRGB,Vt as VK_FORMAT_B8G8R8_UINT,At as VK_FORMAT_B8G8R8_UNORM,Ze as VK_FORMAT_BC1_RGBA_SRGB_BLOCK,Qe as VK_FORMAT_BC1_RGBA_UNORM_BLOCK,Je as VK_FORMAT_BC1_RGB_SRGB_BLOCK,Ge as VK_FORMAT_BC1_RGB_UNORM_BLOCK,tn as VK_FORMAT_BC2_SRGB_BLOCK,$e as VK_FORMAT_BC2_UNORM_BLOCK,nn as VK_FORMAT_BC3_SRGB_BLOCK,en as VK_FORMAT_BC3_UNORM_BLOCK,an as VK_FORMAT_BC4_SNORM_BLOCK,sn as VK_FORMAT_BC4_UNORM_BLOCK,on as VK_FORMAT_BC5_SNORM_BLOCK,rn as VK_FORMAT_BC5_UNORM_BLOCK,fn as VK_FORMAT_BC6H_SFLOAT_BLOCK,ln as VK_FORMAT_BC6H_UFLOAT_BLOCK,Un as VK_FORMAT_BC7_SRGB_BLOCK,hn as VK_FORMAT_BC7_UNORM_BLOCK,Ne as VK_FORMAT_D16_UNORM,Ye as VK_FORMAT_D16_UNORM_S8_UINT,je as VK_FORMAT_D24_UNORM_S8_UINT,Xe as VK_FORMAT_D32_SFLOAT,qe as VK_FORMAT_D32_SFLOAT_S8_UINT,He as VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,wn as VK_FORMAT_EAC_R11G11_SNORM_BLOCK,dn as VK_FORMAT_EAC_R11G11_UNORM_BLOCK,bn as VK_FORMAT_EAC_R11_SNORM_BLOCK,un as VK_FORMAT_EAC_R11_UNORM_BLOCK,gn as VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,pn as VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,xn as VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,yn as VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,_n as VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,cn as VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,$n as VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,si as VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,hi as VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,ri as VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,Ui as VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,oi as VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,ci as VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,li as VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,_i as VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,fi as VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,Zn as VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,Qn as VK_FORMAT_R10X6G10X6_UNORM_2PACK16,Jn as VK_FORMAT_R10X6_UNORM_PACK16,ii as VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,ni as VK_FORMAT_R12X4G12X4_UNORM_2PACK16,ei as VK_FORMAT_R12X4_UNORM_PACK16,ge as VK_FORMAT_R16G16B16A16_SFLOAT,pe as VK_FORMAT_R16G16B16A16_SINT,ce as VK_FORMAT_R16G16B16A16_SNORM,_e as VK_FORMAT_R16G16B16A16_UINT,Ue as VK_FORMAT_R16G16B16A16_UNORM,he as VK_FORMAT_R16G16B16_SFLOAT,fe as VK_FORMAT_R16G16B16_SINT,oe as VK_FORMAT_R16G16B16_SNORM,le as VK_FORMAT_R16G16B16_UINT,re as VK_FORMAT_R16G16B16_UNORM,ae as VK_FORMAT_R16G16_SFLOAT,se as VK_FORMAT_R16G16_SINT,ne as VK_FORMAT_R16G16_SNORM,ie as VK_FORMAT_R16G16_UINT,ee as VK_FORMAT_R16G16_UNORM,te as VK_FORMAT_R16_SFLOAT,$t as VK_FORMAT_R16_SINT,Qt as VK_FORMAT_R16_SNORM,Zt as VK_FORMAT_R16_UINT,Jt as VK_FORMAT_R16_UNORM,Ae as VK_FORMAT_R32G32B32A32_SFLOAT,ve as VK_FORMAT_R32G32B32A32_SINT,Le as VK_FORMAT_R32G32B32A32_UINT,Be as VK_FORMAT_R32G32B32_SFLOAT,De as VK_FORMAT_R32G32B32_SINT,me as VK_FORMAT_R32G32B32_UINT,we as VK_FORMAT_R32G32_SFLOAT,de as VK_FORMAT_R32G32_SINT,be as VK_FORMAT_R32G32_UINT,ue as VK_FORMAT_R32_SFLOAT,xe as VK_FORMAT_R32_SINT,ye as VK_FORMAT_R32_UINT,at as VK_FORMAT_R4G4B4A4_UNORM_PACK16,st as VK_FORMAT_R4G4_UNORM_PACK8,ft as VK_FORMAT_R5G5B5A1_UNORM_PACK16,ot as VK_FORMAT_R5G6B5_UNORM_PACK16,ze as VK_FORMAT_R64G64B64A64_SFLOAT,Pe as VK_FORMAT_R64G64B64A64_SINT,Me as VK_FORMAT_R64G64B64A64_UINT,Ce as VK_FORMAT_R64G64B64_SFLOAT,Te as VK_FORMAT_R64G64B64_SINT,Ee as VK_FORMAT_R64G64B64_UINT,Oe as VK_FORMAT_R64G64_SFLOAT,Fe as VK_FORMAT_R64G64_SINT,Se as VK_FORMAT_R64G64_UINT,Ie as VK_FORMAT_R64_SFLOAT,Ve as VK_FORMAT_R64_SINT,ke as VK_FORMAT_R64_UINT,Tt as VK_FORMAT_R8G8B8A8_SINT,Ot as VK_FORMAT_R8G8B8A8_SNORM,Ct as VK_FORMAT_R8G8B8A8_SRGB,Et as VK_FORMAT_R8G8B8A8_UINT,Ft as VK_FORMAT_R8G8B8A8_UNORM,Lt as VK_FORMAT_R8G8B8_SINT,Dt as VK_FORMAT_R8G8B8_SNORM,vt as VK_FORMAT_R8G8B8_SRGB,Bt as VK_FORMAT_R8G8B8_UINT,mt as VK_FORMAT_R8G8B8_UNORM,dt as VK_FORMAT_R8G8_SINT,ut as VK_FORMAT_R8G8_SNORM,wt as VK_FORMAT_R8G8_SRGB,bt as VK_FORMAT_R8G8_UINT,xt as VK_FORMAT_R8G8_UNORM,gt as VK_FORMAT_R8_SINT,_t as VK_FORMAT_R8_SNORM,yt as VK_FORMAT_R8_SRGB,pt as VK_FORMAT_R8_UINT,ct as VK_FORMAT_R8_UNORM,Re as VK_FORMAT_S8_UINT,it as VK_FORMAT_UNDEFINED,Ke as VK_FORMAT_X8_D24_UNORM_PACK32,Pi as read,Wi as write};\n","let A,I,B;const g={env:{emscripten_notify_memory_growth:function(A){B=new Uint8Array(I.exports.memory.buffer)}}};class Q{init(){return A||(A=\"undefined\"!=typeof fetch?fetch(\"data:application/wasm;base64,\"+C).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,\"base64\"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0)}decode(A,g=0){if(!I)throw new Error(\"ZSTDDecoder: Await .init() before decoding.\");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C=\"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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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\";export{Q as ZSTDDecoder};\n","import { LinearTransfer, Matrix3, SRGBTransfer } from 'three';\n\n// Reference: http://www.russellcottrell.com/photo/matrixCalculator.htm\n\nconst P3_PRIMARIES = [ 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 ];\nconst P3_LUMINANCE_COEFFICIENTS = [ 0.2289, 0.6917, 0.0793 ];\nconst REC2020_PRIMARIES = [ 0.708, 0.292, 0.170, 0.797, 0.131, 0.046 ];\nconst REC2020_LUMINANCE_COEFFICIENTS = [ 0.2627, 0.6780, 0.0593 ];\nconst D65 = [ 0.3127, 0.3290 ];\n\n/******************************************************************************\n * Display P3 definitions\n */\n\nconst LINEAR_DISPLAY_P3_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4865709, 0.2656677, 0.1982173,\n\t0.2289746, 0.6917385, 0.0792869,\n\t0.0000000, 0.0451134, 1.0439444\n);\n\nconst XYZ_TO_LINEAR_DISPLAY_P3 = /*@__PURE__*/ new Matrix3().set(\n\t2.4934969, - 0.9313836, - 0.4027108,\n\t- 0.8294890, 1.7626641, 0.0236247,\n\t0.0358458, - 0.0761724, 0.9568845\n);\n\nexport const DisplayP3ColorSpace = 'display-p3';\nexport const LinearDisplayP3ColorSpace = 'display-p3-linear';\n\nexport const DisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: SRGBTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\nexport const LinearDisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\tworkingColorSpaceConfig: { unpackColorSpace: DisplayP3ColorSpace },\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\n/******************************************************************************\n * Rec. 2020 definitions\n */\n\nconst LINEAR_REC2020_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.6369580, 0.1446169, 0.1688810,\n\t0.2627002, 0.6779981, 0.0593017,\n\t0.0000000, 0.0280727, 1.0609851\n);\n\nconst XYZ_TO_LINEAR_REC2020 = /*@__PURE__*/ new Matrix3().set(\n\t1.7166512, - 0.3556708, - 0.2533663,\n\t- 0.6666844, 1.6164812, 0.0157685,\n\t0.0176399, - 0.0427706, 0.9421031\n);\n\nexport const LinearRec2020ColorSpace = 'rec2020-linear';\n\nexport const LinearRec2020ColorSpaceImpl = {\n\tprimaries: REC2020_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_REC2020_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_REC2020,\n\tluminanceCoefficients: REC2020_LUMINANCE_COEFFICIENTS,\n};\n","/**\n * Loader for KTX 2.0 GPU Texture containers.\n *\n * KTX 2.0 is a container format for various GPU texture formats. The loader\n * supports Basis Universal GPU textures, which can be quickly transcoded to\n * a wide variety of GPU texture compression formats, as well as some\n * uncompressed DataTexture and Data3DTexture formats.\n *\n * References:\n * - KTX: http://github.khronos.org/KTX-Specification/\n * - DFD: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor\n * - BasisU HDR: https://github.com/BinomialLLC/basis_universal/wiki/UASTC-HDR-Texture-Specification-v1.0\n */\n\nimport {\n\tCompressedTexture,\n\tCompressedArrayTexture,\n\tCompressedCubeTexture,\n\tData3DTexture,\n\tDataTexture,\n\tFileLoader,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tRedFormat,\n\tRGB_BPTC_UNSIGNED_Format,\n\tRGB_ETC1_Format,\n\tRGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format,\n\tRGBA_ASTC_4x4_Format,\n\tRGBA_ASTC_6x6_Format,\n\tRGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format,\n\tRGBA_S3TC_DXT1_Format,\n\tRGBAFormat,\n\tRGFormat,\n\tSRGBColorSpace,\n\tUnsignedByteType,\n} from 'three';\nimport { WorkerPool } from '../utils/WorkerPool.js';\nimport {\n\tread,\n\tKHR_DF_FLAG_ALPHA_PREMULTIPLIED,\n\tKHR_DF_TRANSFER_SRGB,\n\tKHR_SUPERCOMPRESSION_NONE,\n\tKHR_SUPERCOMPRESSION_ZSTD,\n\tVK_FORMAT_UNDEFINED,\n\tVK_FORMAT_R16_SFLOAT,\n\tVK_FORMAT_R16G16_SFLOAT,\n\tVK_FORMAT_R16G16B16A16_SFLOAT,\n\tVK_FORMAT_R32_SFLOAT,\n\tVK_FORMAT_R32G32_SFLOAT,\n\tVK_FORMAT_R32G32B32A32_SFLOAT,\n\tVK_FORMAT_R8_SRGB,\n\tVK_FORMAT_R8_UNORM,\n\tVK_FORMAT_R8G8_SRGB,\n\tVK_FORMAT_R8G8_UNORM,\n\tVK_FORMAT_R8G8B8A8_SRGB,\n\tVK_FORMAT_R8G8B8A8_UNORM,\n\tVK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,\n\tVK_FORMAT_ASTC_6x6_SRGB_BLOCK,\n\tVK_FORMAT_ASTC_6x6_UNORM_BLOCK,\n\tKHR_DF_PRIMARIES_UNSPECIFIED,\n\tKHR_DF_PRIMARIES_BT709,\n\tKHR_DF_PRIMARIES_DISPLAYP3\n} from '../libs/ktx-parse.module.js';\nimport { ZSTDDecoder } from '../libs/zstddec.module.js';\nimport { DisplayP3ColorSpace, LinearDisplayP3ColorSpace } from '../math/ColorSpaces.js';\n\nconst _taskCache = new WeakMap();\n\nlet _activeLoaders = 0;\n\nlet _zstd;\n\nclass KTX2Loader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.transcoderPath = '';\n\t\tthis.transcoderBinary = null;\n\t\tthis.transcoderPending = null;\n\n\t\tthis.workerPool = new WorkerPool();\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = null;\n\n\t\tif ( typeof MSC_TRANSCODER !== 'undefined' ) {\n\n\t\t\tconsole.warn(\n\n\t\t\t\t'THREE.KTX2Loader: Please update to latest \"basis_transcoder\".'\n\t\t\t\t+ ' \"msc_basis_transcoder\" is no longer supported in three.js r125+.'\n\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tsetTranscoderPath( path ) {\n\n\t\tthis.transcoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( num ) {\n\n\t\tthis.workerPool.setWorkerLimit( num );\n\n\t\treturn this;\n\n\t}\n\n\tasync detectSupportAsync( renderer ) {\n\n\t\tthis.workerConfig = {\n\t\t\tastcSupported: await renderer.hasFeatureAsync( 'texture-compression-astc' ),\n\t\t\tastcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856\n\t\t\tetc1Supported: await renderer.hasFeatureAsync( 'texture-compression-etc1' ),\n\t\t\tetc2Supported: await renderer.hasFeatureAsync( 'texture-compression-etc2' ),\n\t\t\tdxtSupported: await renderer.hasFeatureAsync( 'texture-compression-bc' ),\n\t\t\tbptcSupported: await renderer.hasFeatureAsync( 'texture-compression-bptc' ),\n\t\t\tpvrtcSupported: await renderer.hasFeatureAsync( 'texture-compression-pvrtc' )\n\t\t};\n\n\t\treturn this;\n\n\t}\n\n\tdetectSupport( renderer ) {\n\n\t\tif ( renderer.isWebGPURenderer === true ) {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.hasFeature( 'texture-compression-astc' ),\n\t\t\t\tastcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856\n\t\t\t\tetc1Supported: renderer.hasFeature( 'texture-compression-etc1' ),\n\t\t\t\tetc2Supported: renderer.hasFeature( 'texture-compression-etc2' ),\n\t\t\t\tdxtSupported: renderer.hasFeature( 'texture-compression-bc' ),\n\t\t\t\tbptcSupported: renderer.hasFeature( 'texture-compression-bptc' ),\n\t\t\t\tpvrtcSupported: renderer.hasFeature( 'texture-compression-pvrtc' )\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ),\n\t\t\t\tastcHDRSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' )\n\t\t\t\t\t&& renderer.extensions.get( 'WEBGL_compressed_texture_astc' ).getSupportedProfiles().includes( 'hdr' ),\n\t\t\t\tetc1Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc1' ),\n\t\t\t\tetc2Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc' ),\n\t\t\t\tdxtSupported: renderer.extensions.has( 'WEBGL_compressed_texture_s3tc' ),\n\t\t\t\tbptcSupported: renderer.extensions.has( 'EXT_texture_compression_bptc' ),\n\t\t\t\tpvrtcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_pvrtc' )\n\t\t\t\t\t|| renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' )\n\t\t\t};\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinit() {\n\n\t\tif ( ! this.transcoderPending ) {\n\n\t\t\t// Load transcoder wrapper.\n\t\t\tconst jsLoader = new FileLoader( this.manager );\n\t\t\tjsLoader.setPath( this.transcoderPath );\n\t\t\tjsLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst jsContent = jsLoader.loadAsync( 'basis_transcoder.js' );\n\n\t\t\t// Load transcoder WASM binary.\n\t\t\tconst binaryLoader = new FileLoader( this.manager );\n\t\t\tbinaryLoader.setPath( this.transcoderPath );\n\t\t\tbinaryLoader.setResponseType( 'arraybuffer' );\n\t\t\tbinaryLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst binaryContent = binaryLoader.loadAsync( 'basis_transcoder.wasm' );\n\n\t\t\tthis.transcoderPending = Promise.all( [ jsContent, binaryContent ] )\n\t\t\t\t.then( ( [ jsContent, binaryContent ] ) => {\n\n\t\t\t\t\tconst fn = KTX2Loader.BasisWorker.toString();\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* constants */',\n\t\t\t\t\t\t'let _EngineFormat = ' + JSON.stringify( KTX2Loader.EngineFormat ),\n\t\t\t\t\t\t'let _EngineType = ' + JSON.stringify( KTX2Loader.EngineType ),\n\t\t\t\t\t\t'let _TranscoderFormat = ' + JSON.stringify( KTX2Loader.TranscoderFormat ),\n\t\t\t\t\t\t'let _BasisFormat = ' + JSON.stringify( KTX2Loader.BasisFormat ),\n\t\t\t\t\t\t'/* basis_transcoder.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t\t].join( '\\n' );\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\t\t\t\t\tthis.transcoderBinary = binaryContent;\n\n\t\t\t\t\tthis.workerPool.setWorkerCreator( () => {\n\n\t\t\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\t\t\t\t\t\tconst transcoderBinary = this.transcoderBinary.slice( 0 );\n\n\t\t\t\t\t\tworker.postMessage( { type: 'init', config: this.workerConfig, transcoderBinary }, [ transcoderBinary ] );\n\n\t\t\t\t\t\treturn worker;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\tif ( _activeLoaders > 0 ) {\n\n\t\t\t\t// Each instance loads a transcoder and allocates workers, increasing network and memory cost.\n\n\t\t\t\tconsole.warn(\n\n\t\t\t\t\t'THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.'\n\t\t\t\t\t+ ' Use a single KTX2Loader instance, or call .dispose() on old instances.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t_activeLoaders ++;\n\n\t\t}\n\n\t\treturn this.transcoderPending;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( buffer, onLoad, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\treturn cachedTask.promise.then( onLoad ).catch( onError );\n\n\t\t}\n\n\t\tthis._createTexture( buffer )\n\t\t\t.then( ( texture ) => onLoad ? onLoad( texture ) : null )\n\t\t\t.catch( onError );\n\n\t}\n\n\t_createTextureFrom( transcodeResult, container ) {\n\n\t\tconst { type: messageType, error, data: { faces, width, height, format, type, dfdFlags } } = transcodeResult;\n\n\t\tif ( messageType === 'error' ) return Promise.reject( error );\n\n\t\tlet texture;\n\n\t\tif ( container.faceCount === 6 ) {\n\n\t\t\ttexture = new CompressedCubeTexture( faces, format, type );\n\n\t\t} else {\n\n\t\t\tconst mipmaps = faces[ 0 ].mipmaps;\n\n\t\t\ttexture = container.layerCount > 1\n\t\t\t\t? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, type )\n\t\t\t\t: new CompressedTexture( mipmaps, width, height, format, type );\n\n\t\t}\n\n\t\ttexture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.generateMipmaps = false;\n\n\t\ttexture.needsUpdate = true;\n\t\ttexture.colorSpace = parseColorSpace( container );\n\t\ttexture.premultiplyAlpha = !! ( dfdFlags & KHR_DF_FLAG_ALPHA_PREMULTIPLIED );\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * @param {ArrayBuffer} buffer\n\t * @param {?Object} config\n\t * @return {Promise}\n\t */\n\tasync _createTexture( buffer, config = {} ) {\n\n\t\tconst container = read( new Uint8Array( buffer ) );\n\n\t\t// Basis UASTC HDR is a subset of ASTC, which can be transcoded efficiently\n\t\t// to BC6H. To detect whether a KTX2 file uses Basis UASTC HDR, or default\n\t\t// ASTC, inspect the DFD color model.\n\t\t//\n\t\t// Source: https://github.com/BinomialLLC/basis_universal/issues/381\n\t\tconst isBasisHDR = container.vkFormat === VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT\n\t\t\t&& container.dataFormatDescriptor[ 0 ].colorModel === 0xA7;\n\n\t\t// If the device supports ASTC, Basis UASTC HDR requires no transcoder.\n\t\tconst needsTranscoder = container.vkFormat === VK_FORMAT_UNDEFINED\n\t\t\t|| isBasisHDR && ! this.workerConfig.astcHDRSupported;\n\n\t\tif ( ! needsTranscoder ) {\n\n\t\t\treturn createRawTexture( container );\n\n\t\t}\n\n\t\t//\n\t\tconst taskConfig = config;\n\t\tconst texturePending = this.init().then( () => {\n\n\t\t\treturn this.workerPool.postMessage( { type: 'transcode', buffer, taskConfig: taskConfig }, [ buffer ] );\n\n\t\t} ).then( ( e ) => this._createTextureFrom( e.data, container ) );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, { promise: texturePending } );\n\n\t\treturn texturePending;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workerPool.dispose();\n\t\tif ( this.workerSourceURL ) URL.revokeObjectURL( this.workerSourceURL );\n\n\t\t_activeLoaders --;\n\n\t\treturn this;\n\n\t}\n\n}\n\n\n/* CONSTANTS */\n\nKTX2Loader.BasisFormat = {\n\tETC1S: 0,\n\tUASTC: 1,\n\tUASTC_HDR: 2,\n};\n\n// Source: https://github.com/BinomialLLC/basis_universal/blob/master/webgl/texture_test/index.html\nKTX2Loader.TranscoderFormat = {\n\tETC1: 0,\n\tETC2: 1,\n\tBC1: 2,\n\tBC3: 3,\n\tBC4: 4,\n\tBC5: 5,\n\tBC7_M6_OPAQUE_ONLY: 6,\n\tBC7_M5: 7,\n\tPVRTC1_4_RGB: 8,\n\tPVRTC1_4_RGBA: 9,\n\tASTC_4x4: 10,\n\tATC_RGB: 11,\n\tATC_RGBA_INTERPOLATED_ALPHA: 12,\n\tRGBA32: 13,\n\tRGB565: 14,\n\tBGR565: 15,\n\tRGBA4444: 16,\n\tBC6H: 22,\n\tRGB_HALF: 24,\n\tRGBA_HALF: 25,\n};\n\nKTX2Loader.EngineFormat = {\n\tRGBAFormat: RGBAFormat,\n\tRGBA_ASTC_4x4_Format: RGBA_ASTC_4x4_Format,\n\tRGB_BPTC_UNSIGNED_Format: RGB_BPTC_UNSIGNED_Format,\n\tRGBA_BPTC_Format: RGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format: RGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format: RGBA_S3TC_DXT5_Format,\n\tRGB_ETC1_Format: RGB_ETC1_Format,\n\tRGB_ETC2_Format: RGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format: RGB_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT1_Format: RGBA_S3TC_DXT1_Format,\n};\n\nKTX2Loader.EngineType = {\n\tUnsignedByteType: UnsignedByteType,\n\tHalfFloatType: HalfFloatType,\n\tFloatType: FloatType,\n};\n\n/* WEB WORKER */\n\nKTX2Loader.BasisWorker = function () {\n\n\tlet config;\n\tlet transcoderPending;\n\tlet BasisModule;\n\n\tconst EngineFormat = _EngineFormat; // eslint-disable-line no-undef\n\tconst EngineType = _EngineType; // eslint-disable-line no-undef\n\tconst TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef\n\tconst BasisFormat = _BasisFormat; // eslint-disable-line no-undef\n\n\tself.addEventListener( 'message', function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tconfig = message.config;\n\t\t\t\tinit( message.transcoderBinary );\n\t\t\t\tbreak;\n\n\t\t\tcase 'transcode':\n\t\t\t\ttranscoderPending.then( () => {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst { faces, buffers, width, height, hasAlpha, format, type, dfdFlags } = transcode( message.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'transcode', id: message.id, data: { faces, width, height, hasAlpha, format, type, dfdFlags } }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} );\n\n\tfunction init( wasmBinary ) {\n\n\t\ttranscoderPending = new Promise( ( resolve ) => {\n\n\t\t\tBasisModule = { wasmBinary, onRuntimeInitialized: resolve };\n\t\t\tBASIS( BasisModule ); // eslint-disable-line no-undef\n\n\t\t} ).then( () => {\n\n\t\t\tBasisModule.initializeBasis();\n\n\t\t\tif ( BasisModule.KTX2File === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.KTX2Loader: Please update Basis Universal transcoder.' );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tfunction transcode( buffer ) {\n\n\t\tconst ktx2File = new BasisModule.KTX2File( new Uint8Array( buffer ) );\n\n\t\tfunction cleanup() {\n\n\t\t\tktx2File.close();\n\t\t\tktx2File.delete();\n\n\t\t}\n\n\t\tif ( ! ktx2File.isValid() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid or unsupported .ktx2 file' );\n\n\t\t}\n\n\t\tlet basisFormat;\n\n\t\tif ( ktx2File.isUASTC() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC;\n\n\t\t} else if ( ktx2File.isETC1S() ) {\n\n\t\t\tbasisFormat = BasisFormat.ETC1S;\n\n\t\t} else if ( ktx2File.isHDR() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC_HDR;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unknown Basis encoding' );\n\n\t\t}\n\n\t\tconst width = ktx2File.getWidth();\n\t\tconst height = ktx2File.getHeight();\n\t\tconst layerCount = ktx2File.getLayers() || 1;\n\t\tconst levelCount = ktx2File.getLevels();\n\t\tconst faceCount = ktx2File.getFaces();\n\t\tconst hasAlpha = ktx2File.getHasAlpha();\n\t\tconst dfdFlags = ktx2File.getDFDFlags();\n\n\t\tconst { transcoderFormat, engineFormat, engineType } = getTranscoderFormat( basisFormat, width, height, hasAlpha );\n\n\t\tif ( ! width || ! height || ! levelCount ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid texture' );\n\n\t\t}\n\n\t\tif ( ! ktx2File.startTranscoding() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader: .startTranscoding failed' );\n\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst buffers = [];\n\n\t\tfor ( let face = 0; face < faceCount; face ++ ) {\n\n\t\t\tconst mipmaps = [];\n\n\t\t\tfor ( let mip = 0; mip < levelCount; mip ++ ) {\n\n\t\t\t\tconst layerMips = [];\n\n\t\t\t\tlet mipWidth, mipHeight;\n\n\t\t\t\tfor ( let layer = 0; layer < layerCount; layer ++ ) {\n\n\t\t\t\t\tconst levelInfo = ktx2File.getImageLevelInfo( mip, layer, face );\n\n\t\t\t\t\tif ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( levelCount > 1 ) {\n\n\t\t\t\t\t\tmipWidth = levelInfo.origWidth;\n\t\t\t\t\t\tmipHeight = levelInfo.origHeight;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with\n\t\t\t\t\t\t// mipmaps must use multiple-of-four dimensions, for some texture formats and APIs.\n\t\t\t\t\t\t// See mrdoob/three.js#25908.\n\t\t\t\t\t\tmipWidth = levelInfo.width;\n\t\t\t\t\t\tmipHeight = levelInfo.height;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) );\n\t\t\t\t\tconst status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, - 1, - 1 );\n\n\t\t\t\t\tif ( engineType === EngineType.HalfFloatType ) {\n\n\t\t\t\t\t\tdst = new Uint16Array( dst.buffer, dst.byteOffset, dst.byteLength / Uint16Array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! status ) {\n\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tthrow new Error( 'THREE.KTX2Loader: .transcodeImage failed.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayerMips.push( dst );\n\n\t\t\t\t}\n\n\t\t\t\tconst mipData = concat( layerMips );\n\n\t\t\t\tmipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } );\n\t\t\t\tbuffers.push( mipData.buffer );\n\n\t\t\t}\n\n\t\t\tfaces.push( { mipmaps, width, height, format: engineFormat, type: engineType } );\n\n\t\t}\n\n\t\tcleanup();\n\n\t\treturn { faces, buffers, width, height, hasAlpha, dfdFlags, format: engineFormat, type: engineType };\n\n\t}\n\n\t//\n\n\t// Optimal choice of a transcoder target format depends on the Basis format (ETC1S, UASTC, or\n\t// UASTC HDR), device capabilities, and texture dimensions. The list below ranks the formats\n\t// separately for each format. Currently, priority is assigned based on:\n\t//\n\t// high quality > low quality > uncompressed\n\t//\n\t// Prioritization may be revisited, or exposed for configuration, in the future.\n\t//\n\t// Reference: https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXDeveloperGuide.md\n\tconst FORMAT_OPTIONS = [\n\t\t{\n\t\t\tif: 'astcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: Infinity,\n\t\t\tpriorityUASTC: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 3,\n\t\t\tpriorityUASTC: 2,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'dxtSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC1, TranscoderFormat.BC3 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 4,\n\t\t\tpriorityUASTC: 5,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc2Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1, TranscoderFormat.ETC2 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 1,\n\t\t\tpriorityUASTC: 3,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc1Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 2,\n\t\t\tpriorityUASTC: 4,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'pvrtcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA ],\n\t\t\tengineFormat: [ EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 5,\n\t\t\tpriorityUASTC: 6,\n\t\t\tneedsPowerOfTwo: true,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC6H ],\n\t\t\tengineFormat: [ EngineFormat.RGB_BPTC_UNSIGNED_Format ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\n\t\t// Uncompressed fallbacks.\n\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA32, TranscoderFormat.RGBA32 ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat, EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.UnsignedByteType, EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 100,\n\t\t\tpriorityUASTC: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA_HALF ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t}\n\t];\n\n\tconst OPTIONS = {\n\t\t// TODO: For ETC1S we intentionally sort by _UASTC_ priority, preserving\n\t\t// a historical accident shown to avoid performance pitfalls for Linux with\n\t\t// Firefox & AMD GPU (RadeonSI). Further work needed.\n\t\t// See https://github.com/mrdoob/three.js/pull/29730.\n\t\t[ BasisFormat.ETC1S ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.ETC1S ) )\n\t\t\t.sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ),\n\n\t\t[ BasisFormat.UASTC ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC ) )\n\t\t\t.sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ),\n\n\t\t[ BasisFormat.UASTC_HDR ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC_HDR ) )\n\t\t\t.sort( ( a, b ) => a.priorityHDR - b.priorityHDR ),\n\t};\n\n\tfunction getTranscoderFormat( basisFormat, width, height, hasAlpha ) {\n\n\t\tconst options = OPTIONS[ basisFormat ];\n\n\t\tfor ( let i = 0; i < options.length; i ++ ) {\n\n\t\t\tconst opt = options[ i ];\n\n\t\t\tif ( opt.if && ! config[ opt.if ] ) continue;\n\t\t\tif ( ! opt.basisFormat.includes( basisFormat ) ) continue;\n\t\t\tif ( hasAlpha && opt.transcoderFormat.length < 2 ) continue;\n\t\t\tif ( opt.needsPowerOfTwo && ! ( isPowerOfTwo( width ) && isPowerOfTwo( height ) ) ) continue;\n\n\t\t\tconst transcoderFormat = opt.transcoderFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineFormat = opt.engineFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineType = opt.engineType[ 0 ];\n\n\t\t\treturn { transcoderFormat, engineFormat, engineType };\n\n\t\t}\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Failed to identify transcoding target.' );\n\n\t}\n\n\tfunction isPowerOfTwo( value ) {\n\n\t\tif ( value <= 2 ) return true;\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t}\n\n\t/**\n\t * Concatenates N byte arrays.\n\t *\n\t * @param {Uint8Array[]} arrays\n\t * @return {Uint8Array}\n\t */\n\tfunction concat( arrays ) {\n\n\t\tif ( arrays.length === 1 ) return arrays[ 0 ];\n\n\t\tlet totalByteLength = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\ttotalByteLength += array.byteLength;\n\n\t\t}\n\n\t\tconst result = new Uint8Array( totalByteLength );\n\n\t\tlet byteOffset = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\tresult.set( array, byteOffset );\n\n\t\t\tbyteOffset += array.byteLength;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n};\n\n// Parsing for non-Basis textures. These textures may have supercompression\n// like Zstd, but they do not require transcoding.\n\nconst UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGFormat, RedFormat ] );\n\nconst FORMAT_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R8G8_UNORM ]: RGFormat,\n\t[ VK_FORMAT_R8G8_SRGB ]: RGFormat,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R16_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R8_SRGB ]: RedFormat,\n\t[ VK_FORMAT_R8_UNORM ]: RedFormat,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: RGBA_ASTC_4x4_Format,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: RGBA_ASTC_6x6_Format,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: RGBA_ASTC_6x6_Format,\n\n};\n\nconst TYPE_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8_SRGB ]: UnsignedByteType,\n\t[ VK_FORMAT_R8_UNORM ]: UnsignedByteType,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: HalfFloatType,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: UnsignedByteType,\n\n};\n\nasync function createRawTexture( container ) {\n\n\tconst { vkFormat } = container;\n\n\tif ( FORMAT_MAP[ vkFormat ] === undefined ) {\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported vkFormat.' );\n\n\t}\n\n\t//\n\n\tlet zstd;\n\n\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\tif ( ! _zstd ) {\n\n\t\t\t_zstd = new Promise( async ( resolve ) => {\n\n\t\t\t\tconst zstd = new ZSTDDecoder();\n\t\t\t\tawait zstd.init();\n\t\t\t\tresolve( zstd );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tzstd = await _zstd;\n\n\t}\n\n\t//\n\n\tconst mipmaps = [];\n\n\n\tfor ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) {\n\n\t\tconst levelWidth = Math.max( 1, container.pixelWidth >> levelIndex );\n\t\tconst levelHeight = Math.max( 1, container.pixelHeight >> levelIndex );\n\t\tconst levelDepth = container.pixelDepth ? Math.max( 1, container.pixelDepth >> levelIndex ) : 0;\n\n\t\tconst level = container.levels[ levelIndex ];\n\n\t\tlet levelData;\n\n\t\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_NONE ) {\n\n\t\t\tlevelData = level.levelData;\n\n\t\t} else if ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\t\tlevelData = zstd.decode( level.levelData, level.uncompressedByteLength );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported supercompressionScheme.' );\n\n\t\t}\n\n\t\tlet data;\n\n\t\tif ( TYPE_MAP[ vkFormat ] === FloatType ) {\n\n\t\t\tdata = new Float32Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Float32Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else if ( TYPE_MAP[ vkFormat ] === HalfFloatType ) {\n\n\t\t\tdata = new Uint16Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Uint16Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tdata = levelData;\n\n\t\t}\n\n\t\tmipmaps.push( {\n\n\t\t\tdata: data,\n\t\t\twidth: levelWidth,\n\t\t\theight: levelHeight,\n\t\t\tdepth: levelDepth,\n\n\t\t} );\n\n\t}\n\n\tlet texture;\n\n\tif ( UNCOMPRESSED_FORMATS.has( FORMAT_MAP[ vkFormat ] ) ) {\n\n\t\ttexture = container.pixelDepth === 0\n\t\t\t? new DataTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight )\n\t\t\t: new Data3DTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight, container.pixelDepth );\n\n\t} else {\n\n\t\tif ( container.pixelDepth > 0 ) throw new Error( 'THREE.KTX2Loader: Unsupported pixelDepth.' );\n\n\t\ttexture = new CompressedTexture( mipmaps, container.pixelWidth, container.pixelHeight );\n\n\t\ttexture.minFilter = mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\n\t}\n\n\ttexture.mipmaps = mipmaps;\n\n\ttexture.type = TYPE_MAP[ vkFormat ];\n\ttexture.format = FORMAT_MAP[ vkFormat ];\n\ttexture.colorSpace = parseColorSpace( container );\n\ttexture.needsUpdate = true;\n\n\t//\n\n\treturn Promise.resolve( texture );\n\n}\n\nfunction parseColorSpace( container ) {\n\n\tconst dfd = container.dataFormatDescriptor[ 0 ];\n\n\tif ( dfd.colorPrimaries === KHR_DF_PRIMARIES_BT709 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? SRGBColorSpace : LinearSRGBColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_DISPLAYP3 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? DisplayP3ColorSpace : LinearDisplayP3ColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_UNSPECIFIED ) {\n\n\t\treturn NoColorSpace;\n\n\t} else {\n\n\t\tconsole.warn( `THREE.KTX2Loader: Unsupported color primaries, \"${ dfd.colorPrimaries }\"` );\n\t\treturn NoColorSpace;\n\n\t}\n\n}\n\nexport { KTX2Loader };\n","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b;\nconst $retainerCount = Symbol('retainerCount');\nconst $recentlyUsed = Symbol('recentlyUsed');\nconst $evict = Symbol('evict');\nconst $evictionThreshold = Symbol('evictionThreshold');\nconst $cache = Symbol('cache');\n/**\n * The CacheEvictionPolicy manages the lifecycle for items in a cache,\n * evicting any items outside some threshold bounds in \"recently used\" order,\n * if they are evictable.\n *\n * Items are considered cached as they are retained. When all retainers\n * of an item release it, that item is considered evictable.\n */\nexport class CacheEvictionPolicy {\n constructor(cache, evictionThreshold = 5) {\n this[_a] = new Map();\n this[_b] = [];\n this[$cache] = cache;\n this[$evictionThreshold] = evictionThreshold;\n }\n /**\n * The eviction threshold is the maximum number of items to hold\n * in cache indefinitely. Items within the threshold (in recently\n * used order) will continue to be cached even if they have zero\n * retainers.\n */\n set evictionThreshold(value) {\n this[$evictionThreshold] = value;\n this[$evict]();\n }\n get evictionThreshold() {\n return this[$evictionThreshold];\n }\n /**\n * A reference to the cache that operates under this policy\n */\n get cache() {\n return this[$cache];\n }\n /**\n * Given an item key, returns the number of retainers of that item\n */\n retainerCount(key) {\n return this[$retainerCount].get(key) || 0;\n }\n /**\n * Resets the internal tracking of cache item retainers. Use only in cases\n * where it is certain that all retained cache items have been accounted for!\n */\n reset() {\n this[$retainerCount].clear();\n this[$recentlyUsed] = [];\n }\n /**\n * Mark a given cache item as retained, where the item is represented\n * by its key. An item can have any number of retainers.\n */\n retain(key) {\n if (!this[$retainerCount].has(key)) {\n this[$retainerCount].set(key, 0);\n }\n this[$retainerCount].set(key, this[$retainerCount].get(key) + 1);\n const recentlyUsedIndex = this[$recentlyUsed].indexOf(key);\n if (recentlyUsedIndex !== -1) {\n this[$recentlyUsed].splice(recentlyUsedIndex, 1);\n }\n this[$recentlyUsed].unshift(key);\n // Evict, in case retaining a new item pushed an evictable item beyond the\n // eviction threshold\n this[$evict]();\n }\n /**\n * Mark a given cache item as released by one of its retainers, where the item\n * is represented by its key. When all retainers of an item have released it,\n * the item is considered evictable.\n */\n release(key) {\n if (this[$retainerCount].has(key)) {\n this[$retainerCount].set(key, Math.max(this[$retainerCount].get(key) - 1, 0));\n }\n this[$evict]();\n }\n [(_a = $retainerCount, _b = $recentlyUsed, $evict)]() {\n if (this[$recentlyUsed].length < this[$evictionThreshold]) {\n return;\n }\n for (let i = this[$recentlyUsed].length - 1; i >= this[$evictionThreshold]; --i) {\n const key = this[$recentlyUsed][i];\n const retainerCount = this[$retainerCount].get(key);\n if (retainerCount === 0) {\n this[$cache].delete(key);\n this[$recentlyUsed].splice(i, 1);\n }\n }\n }\n}\n//# sourceMappingURL=cache-eviction-policy.js.map","/* @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * KHR_materials_variants specification allows duplicated variant names\n * but it makes handling the extension complex.\n * We ensure tha names and make it easier.\n * If you want to export the extension with the original names\n * you are recommended to write GLTFExporter plugin to restore the names.\n *\n * @param variantNames {Array}\n * @return {Array}\n */\nconst ensureUniqueNames = (variantNames) => {\n const uniqueNames = [];\n const knownNames = new Set();\n for (const name of variantNames) {\n let uniqueName = name;\n let suffix = 0;\n // @TODO: An easy solution.\n // O(N^2) in the worst scenario where N is variantNames.length.\n // Fix me if needed.\n while (knownNames.has(uniqueName)) {\n uniqueName = name + '.' + (++suffix);\n }\n knownNames.add(uniqueName);\n uniqueNames.push(uniqueName);\n }\n return uniqueNames;\n};\n/**\n * Convert mappings array to table object to make handling the extension easier.\n *\n * @param\n * extensionDef {glTF.meshes[n].primitive.extensions.KHR_materials_variants}\n * @param variantNames {Array} Required to be unique names\n * @return {Map}\n */\nconst mappingsArrayToTable = (extensionDef) => {\n const table = new Map();\n for (const mapping of extensionDef.mappings) {\n for (const variant of mapping.variants) {\n table.set(variant, { material: null, gltfMaterialIndex: mapping.material });\n }\n }\n return table;\n};\nexport default class GLTFMaterialsVariantsExtension {\n constructor(parser) {\n this.parser = parser;\n this.name = 'KHR_materials_variants';\n }\n // Note that the following properties will be overridden even if they are\n // pre-defined\n // - gltf.userData.variants\n // - mesh.userData.variantMaterials\n afterRoot(gltf) {\n const parser = this.parser;\n const json = parser.json;\n if (json.extensions === undefined ||\n json.extensions[this.name] === undefined) {\n return null;\n }\n const extensionDef = json.extensions[this.name];\n const variantsDef = extensionDef.variants || [];\n const variants = ensureUniqueNames(variantsDef.map((v) => v.name));\n for (const scene of gltf.scenes) {\n // Save the variants data under associated mesh.userData\n scene.traverse(object => {\n const mesh = object;\n if (!mesh.material) {\n return;\n }\n const association = parser.associations.get(mesh);\n if (association == null || association.meshes == null ||\n association.primitives == null) {\n return;\n }\n const meshDef = json.meshes[association.meshes];\n const primitivesDef = meshDef.primitives;\n const primitiveDef = primitivesDef[association.primitives];\n const extensionsDef = primitiveDef.extensions;\n if (!extensionsDef || !extensionsDef[this.name]) {\n return;\n }\n mesh.userData.variantMaterials =\n mappingsArrayToTable(extensionsDef[this.name]);\n });\n }\n gltf.userData.variants = variants;\n return Promise.resolve();\n }\n}\n//# sourceMappingURL=VariantMaterialLoaderPlugin.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b;\nimport { EventDispatcher, Texture } from 'three';\nimport { MeshoptDecoder } from 'three/examples/jsm/libs/meshopt_decoder.module.js';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\nimport { CacheEvictionPolicy } from '../utilities/cache-eviction-policy.js';\nimport GLTFMaterialsVariantsExtension from './gltf-instance/VariantMaterialLoaderPlugin.js';\nTexture.DEFAULT_ANISOTROPY = 4;\n/**\n * A helper to Promise-ify a Three.js GLTFLoader\n */\nexport const loadWithLoader = (url, loader, progressCallback = () => { }) => {\n const onProgress = (event) => {\n const fraction = event.loaded / event.total;\n progressCallback(Math.max(0, Math.min(1, isFinite(fraction) ? fraction : 1)));\n };\n return new Promise((resolve, reject) => {\n loader.load(url, resolve, onProgress, reject);\n });\n};\n/** Helper to load a script tag. */\nconst fetchScript = (src) => {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n document.body.appendChild(script);\n script.onload = resolve;\n script.onerror = reject;\n script.async = true;\n script.src = src;\n });\n};\nconst cache = new Map();\nconst preloaded = new Map();\nlet dracoDecoderLocation;\nconst dracoLoader = new DRACOLoader();\nlet ktx2TranscoderLocation;\nconst ktx2Loader = new KTX2Loader();\nlet meshoptDecoderLocation;\nlet meshoptDecoder;\nexport const $loader = Symbol('loader');\nexport const $evictionPolicy = Symbol('evictionPolicy');\nconst $GLTFInstance = Symbol('GLTFInstance');\nexport class CachingGLTFLoader extends EventDispatcher {\n static setDRACODecoderLocation(url) {\n dracoDecoderLocation = url;\n dracoLoader.setDecoderPath(url);\n }\n static getDRACODecoderLocation() {\n return dracoDecoderLocation;\n }\n static setKTX2TranscoderLocation(url) {\n ktx2TranscoderLocation = url;\n ktx2Loader.setTranscoderPath(url);\n }\n static getKTX2TranscoderLocation() {\n return ktx2TranscoderLocation;\n }\n static setMeshoptDecoderLocation(url) {\n if (meshoptDecoderLocation !== url) {\n meshoptDecoderLocation = url;\n meshoptDecoder = fetchScript(url)\n .then(() => MeshoptDecoder.ready)\n .then(() => MeshoptDecoder);\n }\n }\n static getMeshoptDecoderLocation() {\n return meshoptDecoderLocation;\n }\n static initializeKTX2Loader(renderer) {\n ktx2Loader.detectSupport(renderer);\n }\n static get cache() {\n return cache;\n }\n /** @nocollapse */\n static clearCache() {\n cache.forEach((_value, url) => {\n this.delete(url);\n });\n this[$evictionPolicy].reset();\n }\n static has(url) {\n return cache.has(url);\n }\n /** @nocollapse */\n static async delete(url) {\n if (!this.has(url)) {\n return;\n }\n const gltfLoads = cache.get(url);\n preloaded.delete(url);\n cache.delete(url);\n const gltf = await gltfLoads;\n // Dispose of the cached glTF's materials and geometries:\n gltf.dispose();\n }\n /**\n * Returns true if the model that corresponds to the specified url is\n * available in our local cache.\n */\n static hasFinishedLoading(url) {\n return !!preloaded.get(url);\n }\n constructor(GLTFInstance) {\n super();\n this[_b] = new GLTFLoader().register(parser => new GLTFMaterialsVariantsExtension(parser));\n this[$GLTFInstance] = GLTFInstance;\n this[$loader].setDRACOLoader(dracoLoader);\n this[$loader].setKTX2Loader(ktx2Loader);\n }\n get [(_a = $evictionPolicy, _b = $loader, $evictionPolicy)]() {\n return this.constructor[$evictionPolicy];\n }\n /**\n * Preloads a glTF, populating the cache. Returns a promise that resolves\n * when the cache is populated.\n */\n async preload(url, element, progressCallback = () => { }) {\n this[$loader].setWithCredentials(element.withCredentials);\n this.dispatchEvent({ type: 'preload', element: element, src: url });\n if (!cache.has(url)) {\n if (meshoptDecoder != null) {\n this[$loader].setMeshoptDecoder(await meshoptDecoder);\n }\n const rawGLTFLoads = loadWithLoader(url, this[$loader], (progress) => {\n progressCallback(progress * 0.8);\n });\n const GLTFInstance = this[$GLTFInstance];\n const gltfInstanceLoads = rawGLTFLoads\n .then((rawGLTF) => {\n return GLTFInstance.prepare(rawGLTF);\n })\n .then((preparedGLTF) => {\n progressCallback(0.9);\n return new GLTFInstance(preparedGLTF);\n })\n .catch((reason => {\n console.error(reason);\n return new GLTFInstance();\n }));\n cache.set(url, gltfInstanceLoads);\n }\n await cache.get(url);\n preloaded.set(url, true);\n if (progressCallback) {\n progressCallback(1.0);\n }\n }\n /**\n * Loads a glTF from the specified url and resolves a unique clone of the\n * glTF. If the glTF has already been loaded, makes a clone of the cached\n * copy.\n */\n async load(url, element, progressCallback = () => { }) {\n await this.preload(url, element, progressCallback);\n const gltf = await cache.get(url);\n const clone = await gltf.clone();\n this[$evictionPolicy].retain(url);\n // Patch dispose so that we can properly account for instance use\n // in the caching layer:\n clone.dispose = () => {\n this[$evictionPolicy].release(url);\n };\n return clone;\n }\n}\nCachingGLTFLoader[_a] = new CacheEvictionPolicy(CachingGLTFLoader);\n//# sourceMappingURL=CachingGLTFLoader.js.map","import {\n\tMatrix4,\n\tObject3D,\n\tVector2,\n\tVector3\n} from 'three';\n\nclass CSS2DObject extends Object3D {\n\n\tconstructor( element = document.createElement( 'div' ) ) {\n\n\t\tsuper();\n\n\t\tthis.isCSS2DObject = true;\n\n\t\tthis.element = element;\n\n\t\tthis.element.style.position = 'absolute';\n\t\tthis.element.style.userSelect = 'none';\n\n\t\tthis.element.setAttribute( 'draggable', false );\n\n\t\tthis.center = new Vector2( 0.5, 0.5 ); // ( 0, 0 ) is the lower left; ( 1, 1 ) is the top right\n\n\t\tthis.addEventListener( 'removed', function () {\n\n\t\t\tthis.traverse( function ( object ) {\n\n\t\t\t\tif (\n\t\t\t\t\tobject.element instanceof object.element.ownerDocument.defaultView.Element &&\n\t\t\t\t\tobject.element.parentNode !== null\n\t\t\t\t) {\n\n\t\t\t\t\tobject.element.remove();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.element = source.element.cloneNode( true );\n\n\t\tthis.center = source.center;\n\n\t\treturn this;\n\n\t}\n\n}\n\n//\n\nconst _vector = new Vector3();\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _a = new Vector3();\nconst _b = new Vector3();\n\nclass CSS2DRenderer {\n\n\tconstructor( parameters = {} ) {\n\n\t\tconst _this = this;\n\n\t\tlet _width, _height;\n\t\tlet _widthHalf, _heightHalf;\n\n\t\tconst cache = {\n\t\t\tobjects: new WeakMap()\n\t\t};\n\n\t\tconst domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' );\n\n\t\tdomElement.style.overflow = 'hidden';\n\n\t\tthis.domElement = domElement;\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_viewMatrix.copy( camera.matrixWorldInverse );\n\t\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix );\n\n\t\t\trenderObject( scene, scene, camera );\n\t\t\tzOrder( scene );\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\n\t\t};\n\n\t\tfunction hideObject( object ) {\n\n\t\t\tif ( object.isCSS2DObject ) object.element.style.display = 'none';\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\thideObject( object.children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera ) {\n\n\t\t\tif ( object.visible === false ) {\n\n\t\t\t\thideObject( object );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( object.isCSS2DObject ) {\n\n\t\t\t\t_vector.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t_vector.applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\tconst visible = ( _vector.z >= - 1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true );\n\n\t\t\t\tconst element = object.element;\n\t\t\t\telement.style.display = visible === true ? '' : 'none';\n\n\t\t\t\tif ( visible === true ) {\n\n\t\t\t\t\tobject.onBeforeRender( _this, scene, camera );\n\n\t\t\t\t\telement.style.transform = 'translate(' + ( - 100 * object.center.x ) + '%,' + ( - 100 * object.center.y ) + '%)' + 'translate(' + ( _vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - _vector.y * _heightHalf + _heightHalf ) + 'px)';\n\n\t\t\t\t\tif ( element.parentNode !== domElement ) {\n\n\t\t\t\t\t\tdomElement.appendChild( element );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.onAfterRender( _this, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t\tconst objectData = {\n\t\t\t\t\tdistanceToCameraSquared: getDistanceToSquared( camera, object )\n\t\t\t\t};\n\n\t\t\t\tcache.objects.set( object, objectData );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( object.children[ i ], scene, camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getDistanceToSquared( object1, object2 ) {\n\n\t\t\t_a.setFromMatrixPosition( object1.matrixWorld );\n\t\t\t_b.setFromMatrixPosition( object2.matrixWorld );\n\n\t\t\treturn _a.distanceToSquared( _b );\n\n\t\t}\n\n\t\tfunction filterAndFlatten( scene ) {\n\n\t\t\tconst result = [];\n\n\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isCSS2DObject ) result.push( object );\n\n\t\t\t} );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction zOrder( scene ) {\n\n\t\t\tconst sorted = filterAndFlatten( scene ).sort( function ( a, b ) {\n\n\t\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\t\treturn b.renderOrder - a.renderOrder;\n\n\t\t\t\t}\n\n\t\t\t\tconst distanceA = cache.objects.get( a ).distanceToCameraSquared;\n\t\t\t\tconst distanceB = cache.objects.get( b ).distanceToCameraSquared;\n\n\t\t\t\treturn distanceA - distanceB;\n\n\t\t\t} );\n\n\t\t\tconst zMax = sorted.length;\n\n\t\t\tfor ( let i = 0, l = sorted.length; i < l; i ++ ) {\n\n\t\t\t\tsorted[ i ].element.style.zIndex = zMax - i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { CSS2DObject, CSS2DRenderer };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tGroup,\n\tMatrix4,\n\tMesh,\n\tVector3\n} from 'three';\n\nimport { mergeGroups, deepCloneAttribute } from './BufferGeometryUtils.js';\n\nconst _color = /*@__PURE__*/new Color();\nconst _matrix = /*@__PURE__*/new Matrix4();\n\nfunction createMeshesFromInstancedMesh( instancedMesh ) {\n\n\tconst group = new Group();\n\n\tconst count = instancedMesh.count;\n\tconst geometry = instancedMesh.geometry;\n\tconst material = instancedMesh.material;\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tinstancedMesh.getMatrixAt( i, mesh.matrix );\n\t\tmesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );\n\n\t\tgroup.add( mesh );\n\n\t}\n\n\tgroup.copy( instancedMesh );\n\tgroup.updateMatrixWorld(); // ensure correct world matrices of meshes\n\n\treturn group;\n\n}\n\nfunction createMeshesFromMultiMaterialMesh( mesh ) {\n\n\tif ( Array.isArray( mesh.material ) === false ) {\n\n\t\tconsole.warn( 'THREE.SceneUtils.createMeshesFromMultiMaterialMesh(): The given mesh has no multiple materials.' );\n\t\treturn mesh;\n\n\t}\n\n\tconst object = new Group();\n\tobject.copy( mesh );\n\n\t// merge groups (which automatically sorts them)\n\n\tconst geometry = mergeGroups( mesh.geometry );\n\n\tconst index = geometry.index;\n\tconst groups = geometry.groups;\n\tconst attributeNames = Object.keys( geometry.attributes );\n\n\t// create a mesh for each group by extracting the buffer data into a new geometry\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst start = group.start;\n\t\tconst end = start + group.count;\n\n\t\tconst newGeometry = new BufferGeometry();\n\t\tconst newMaterial = mesh.material[ group.materialIndex ];\n\n\t\t// process all buffer attributes\n\n\t\tfor ( let j = 0; j < attributeNames.length; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.attributes[ name ];\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tconst newLength = group.count * itemSize;\n\t\t\tconst type = attribute.array.constructor;\n\n\t\t\tconst newArray = new type( newLength );\n\t\t\tconst newAttribute = new BufferAttribute( newArray, itemSize );\n\n\t\t\tfor ( let k = start, n = 0; k < end; k ++, n ++ ) {\n\n\t\t\t\tconst ind = index.getX( k );\n\n\t\t\t\tif ( itemSize >= 1 ) newAttribute.setX( n, attribute.getX( ind ) );\n\t\t\t\tif ( itemSize >= 2 ) newAttribute.setY( n, attribute.getY( ind ) );\n\t\t\t\tif ( itemSize >= 3 ) newAttribute.setZ( n, attribute.getZ( ind ) );\n\t\t\t\tif ( itemSize >= 4 ) newAttribute.setW( n, attribute.getW( ind ) );\n\n\t\t\t}\n\n\n\t\t\tnewGeometry.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\tconst newMesh = new Mesh( newGeometry, newMaterial );\n\t\tobject.add( newMesh );\n\n\t}\n\n\treturn object;\n\n}\n\nfunction createMultiMaterialObject( geometry, materials ) {\n\n\tconst group = new Group();\n\n\tfor ( let i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t}\n\n\treturn group;\n\n}\n\nfunction reduceVertices( object, func, initialValue ) {\n\n\tlet value = initialValue;\n\tconst vertex = new Vector3();\n\n\tobject.updateWorldMatrix( true, true );\n\n\tobject.traverseVisible( ( child ) => {\n\n\t\tconst { geometry } = child;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst { position } = geometry.attributes;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( child.isMesh ) {\n\n\t\t\t\t\t\tchild.getVertexPosition( i, vertex );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! child.isSkinnedMesh ) {\n\n\t\t\t\t\t\tvertex.applyMatrix4( child.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = func( value, vertex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn value;\n\n}\n\n/**\n * @param {InstancedMesh} mesh\n * @param {function(int, int):int} compareFn\n */\nfunction sortInstancedMesh( mesh, compareFn ) {\n\n\t// store copy of instanced attributes for lookups\n\n\tconst instanceMatrixRef = deepCloneAttribute( mesh.instanceMatrix );\n\tconst instanceColorRef = mesh.instanceColor ? deepCloneAttribute( mesh.instanceColor ) : null;\n\n\tconst attributeRefs = new Map();\n\n\tfor ( const name in mesh.geometry.attributes ) {\n\n\t\tconst attribute = mesh.geometry.attributes[ name ];\n\n\t\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\t\tattributeRefs.set( attribute, deepCloneAttribute( attribute ) );\n\n\t\t}\n\n\t}\n\n\n\t// compute sort order\n\n\tconst tokens = [];\n\n\tfor ( let i = 0; i < mesh.count; i ++ ) tokens.push( i );\n\n\ttokens.sort( compareFn );\n\n\n\t// apply sort order\n\n\tfor ( let i = 0; i < tokens.length; i ++ ) {\n\n\t\tconst refIndex = tokens[ i ];\n\n\t\t_matrix.fromArray( instanceMatrixRef.array, refIndex * mesh.instanceMatrix.itemSize );\n\t\t_matrix.toArray( mesh.instanceMatrix.array, i * mesh.instanceMatrix.itemSize );\n\n\t\tif ( mesh.instanceColor ) {\n\n\t\t\t_color.fromArray( instanceColorRef.array, refIndex * mesh.instanceColor.itemSize );\n\t\t\t_color.toArray( mesh.instanceColor.array, i * mesh.instanceColor.itemSize );\n\n\t\t}\n\n\t\tfor ( const name in mesh.geometry.attributes ) {\n\n\t\t\tconst attribute = mesh.geometry.attributes[ name ];\n\n\t\t\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\t\t\tconst attributeRef = attributeRefs.get( attribute );\n\n\t\t\t\tattribute.setX( i, attributeRef.getX( refIndex ) );\n\t\t\t\tif ( attribute.itemSize > 1 ) attribute.setY( i, attributeRef.getY( refIndex ) );\n\t\t\t\tif ( attribute.itemSize > 2 ) attribute.setZ( i, attributeRef.getZ( refIndex ) );\n\t\t\t\tif ( attribute.itemSize > 3 ) attribute.setW( i, attributeRef.getW( refIndex ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D} object Object to traverse.\n * @yields {Object3D} Objects that passed the filter condition.\n */\nfunction* traverseGenerator( object ) {\n\n\tyield object;\n\n\tconst children = object.children;\n\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\tyield* traverseGenerator( children[ i ] );\n\n\t}\n\n}\n\n/**\n * @param {Object3D} object Object to traverse.\n * @yields {Object3D} Objects that passed the filter condition.\n */\nfunction* traverseVisibleGenerator( object ) {\n\n\tif ( object.visible === false ) return;\n\n\tyield object;\n\n\tconst children = object.children;\n\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\tyield* traverseVisibleGenerator( children[ i ] );\n\n\t}\n\n}\n\n/**\n * @param {Object3D} object Object to traverse.\n * @yields {Object3D} Objects that passed the filter condition.\n */\nfunction* traverseAncestorsGenerator( object ) {\n\n\tconst parent = object.parent;\n\n\tif ( parent !== null ) {\n\n\t\tyield parent;\n\n\t\tyield* traverseAncestorsGenerator( parent );\n\n\t}\n\n}\n\nexport {\n\tcreateMeshesFromInstancedMesh,\n\tcreateMeshesFromMultiMaterialMesh,\n\tcreateMultiMaterialObject,\n\treduceVertices,\n\tsortInstancedMesh,\n\ttraverseGenerator,\n\ttraverseVisibleGenerator,\n\ttraverseAncestorsGenerator\n};\n","import {\n\tBufferAttribute,\n\tClampToEdgeWrapping,\n\tColor,\n\tDoubleSide,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tMathUtils,\n\tMatrix4,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tPropertyBinding,\n\tRGBAFormat,\n\tRepeatWrapping,\n\tScene,\n\tSource,\n\tSRGBColorSpace,\n\tCompressedTexture,\n\tVector3,\n\tQuaternion,\n\tREVISION\n} from 'three';\n\n/**\n * The KHR_mesh_quantization extension allows these extra attribute component types\n *\n * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md#extending-mesh-attributes\n */\nconst KHR_mesh_quantization_ExtraAttrTypes = {\n\tPOSITION: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'unsigned byte normalized',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t\t'unsigned short normalized',\n\t],\n\tNORMAL: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTANGENT: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTEXCOORD: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t],\n};\n\n\nclass GLTFExporter {\n\n\tconstructor() {\n\n\t\tthis.textureUtils = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFLightExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsUnlitExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( writer );\n\n\t\t} );\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t *\n\t * @param {Scene|Array} input Scene or Array of THREE.Scenes\n\t * @param {Function} onDone Callback on completed\n\t * @param {Function} onError Callback on errors\n\t * @param {Object} options options\n\t */\n\tparse( input, onDone, onError, options ) {\n\n\t\tconst writer = new GLTFWriter();\n\t\tconst plugins = [];\n\n\t\tfor ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) {\n\n\t\t\tplugins.push( this.pluginCallbacks[ i ]( writer ) );\n\n\t\t}\n\n\t\twriter.setPlugins( plugins );\n\t\twriter.setTextureUtils( this.textureUtils );\n\t\twriter.writeAsync( input, onDone, options ).catch( onError );\n\n\t}\n\n\tparseAsync( input, options ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( input, resolve, reject, options );\n\n\t\t} );\n\n\t}\n\n}\n\n//------------------------------------------------------------------------------\n// Constants\n//------------------------------------------------------------------------------\n\nconst WEBGL_CONSTANTS = {\n\tPOINTS: 0x0000,\n\tLINES: 0x0001,\n\tLINE_LOOP: 0x0002,\n\tLINE_STRIP: 0x0003,\n\tTRIANGLES: 0x0004,\n\tTRIANGLE_STRIP: 0x0005,\n\tTRIANGLE_FAN: 0x0006,\n\n\tBYTE: 0x1400,\n\tUNSIGNED_BYTE: 0x1401,\n\tSHORT: 0x1402,\n\tUNSIGNED_SHORT: 0x1403,\n\tINT: 0x1404,\n\tUNSIGNED_INT: 0x1405,\n\tFLOAT: 0x1406,\n\n\tARRAY_BUFFER: 0x8892,\n\tELEMENT_ARRAY_BUFFER: 0x8893,\n\n\tNEAREST: 0x2600,\n\tLINEAR: 0x2601,\n\tNEAREST_MIPMAP_NEAREST: 0x2700,\n\tLINEAR_MIPMAP_NEAREST: 0x2701,\n\tNEAREST_MIPMAP_LINEAR: 0x2702,\n\tLINEAR_MIPMAP_LINEAR: 0x2703,\n\n\tCLAMP_TO_EDGE: 33071,\n\tMIRRORED_REPEAT: 33648,\n\tREPEAT: 10497\n};\n\nconst KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization';\n\nconst THREE_TO_WEBGL = {};\n\nTHREE_TO_WEBGL[ NearestFilter ] = WEBGL_CONSTANTS.NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR;\nTHREE_TO_WEBGL[ LinearFilter ] = WEBGL_CONSTANTS.LINEAR;\nTHREE_TO_WEBGL[ LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR;\n\nTHREE_TO_WEBGL[ ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE;\nTHREE_TO_WEBGL[ RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT;\nTHREE_TO_WEBGL[ MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT;\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\tposition: 'translation',\n\tquaternion: 'rotation',\n\tmorphTargetInfluences: 'weights'\n};\n\nconst DEFAULT_SPECULAR_COLOR = new Color();\n\n// GLB constants\n// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\nconst GLB_HEADER_BYTES = 12;\nconst GLB_HEADER_MAGIC = 0x46546C67;\nconst GLB_VERSION = 2;\n\nconst GLB_CHUNK_PREFIX_BYTES = 8;\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A;\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942;\n\n//------------------------------------------------------------------------------\n// Utility functions\n//------------------------------------------------------------------------------\n\n/**\n * Compare two arrays\n * @param {Array} array1 Array 1 to compare\n * @param {Array} array2 Array 2 to compare\n * @return {boolean} Returns true if both arrays are equal\n */\nfunction equalArray( array1, array2 ) {\n\n\treturn ( array1.length === array2.length ) && array1.every( function ( element, index ) {\n\n\t\treturn element === array2[ index ];\n\n\t} );\n\n}\n\n/**\n * Converts a string to an ArrayBuffer.\n * @param {string} text\n * @return {ArrayBuffer}\n */\nfunction stringToArrayBuffer( text ) {\n\n\treturn new TextEncoder().encode( text ).buffer;\n\n}\n\n/**\n * Is identity matrix\n *\n * @param {Matrix4} matrix\n * @returns {boolean} Returns true, if parameter is identity matrix\n */\nfunction isIdentityMatrix( matrix ) {\n\n\treturn equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] );\n\n}\n\n/**\n * Get the min and max vectors from the given attribute\n *\n * @param {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count\n * @param {number} start Start index\n * @param {number} count Range to cover\n * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components)\n */\nfunction getMinMax( attribute, start, count ) {\n\n\tconst output = {\n\n\t\tmin: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ),\n\t\tmax: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY )\n\n\t};\n\n\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\tlet value;\n\n\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t} else {\n\n\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toutput.min[ a ] = Math.min( output.min[ a ], value );\n\t\t\toutput.max[ a ] = Math.max( output.max[ a ], value );\n\n\t\t}\n\n\t}\n\n\treturn output;\n\n}\n\n/**\n * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment\n *\n * @param {number} bufferSize The size the original buffer. Should be an integer.\n * @returns {number} new buffer size with required padding as an integer.\n *\n */\nfunction getPaddedBufferSize( bufferSize ) {\n\n\treturn Math.ceil( bufferSize / 4 ) * 4;\n\n}\n\n/**\n * Returns a buffer aligned to 4-byte boundary.\n *\n * @param {ArrayBuffer} arrayBuffer Buffer to pad\n * @param {number} [paddingByte=0] Should be an integer\n * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer\n */\nfunction getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) {\n\n\tconst paddedLength = getPaddedBufferSize( arrayBuffer.byteLength );\n\n\tif ( paddedLength !== arrayBuffer.byteLength ) {\n\n\t\tconst array = new Uint8Array( paddedLength );\n\t\tarray.set( new Uint8Array( arrayBuffer ) );\n\n\t\tif ( paddingByte !== 0 ) {\n\n\t\t\tfor ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) {\n\n\t\t\t\tarray[ i ] = paddingByte;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn array.buffer;\n\n\t}\n\n\treturn arrayBuffer;\n\n}\n\nfunction getCanvas() {\n\n\tif ( typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined' ) {\n\n\t\treturn new OffscreenCanvas( 1, 1 );\n\n\t}\n\n\treturn document.createElement( 'canvas' );\n\n}\n\nfunction getToBlobPromise( canvas, mimeType ) {\n\n\tif ( canvas.toBlob !== undefined ) {\n\n\t\treturn new Promise( ( resolve ) => canvas.toBlob( resolve, mimeType ) );\n\n\t}\n\n\tlet quality;\n\n\t// Blink's implementation of convertToBlob seems to default to a quality level of 100%\n\t// Use the Blink default quality levels of toBlob instead so that file sizes are comparable.\n\tif ( mimeType === 'image/jpeg' ) {\n\n\t\tquality = 0.92;\n\n\t} else if ( mimeType === 'image/webp' ) {\n\n\t\tquality = 0.8;\n\n\t}\n\n\treturn canvas.convertToBlob( {\n\n\t\ttype: mimeType,\n\t\tquality: quality\n\n\t} );\n\n}\n\n/**\n * Writer\n */\nclass GLTFWriter {\n\n\tconstructor() {\n\n\t\tthis.plugins = [];\n\n\t\tthis.options = {};\n\t\tthis.pending = [];\n\t\tthis.buffers = [];\n\n\t\tthis.byteOffset = 0;\n\t\tthis.buffers = [];\n\t\tthis.nodeMap = new Map();\n\t\tthis.skins = [];\n\n\t\tthis.extensionsUsed = {};\n\t\tthis.extensionsRequired = {};\n\n\t\tthis.uids = new Map();\n\t\tthis.uid = 0;\n\n\t\tthis.json = {\n\t\t\tasset: {\n\t\t\t\tversion: '2.0',\n\t\t\t\tgenerator: 'THREE.GLTFExporter r' + REVISION\n\t\t\t}\n\t\t};\n\n\t\tthis.cache = {\n\t\t\tmeshes: new Map(),\n\t\t\tattributes: new Map(),\n\t\t\tattributesNormalized: new Map(),\n\t\t\tmaterials: new Map(),\n\t\t\ttextures: new Map(),\n\t\t\timages: new Map()\n\t\t};\n\n\t\tthis.textureUtils = null;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t *\n\t * @param {Scene|Array} input Scene or Array of THREE.Scenes\n\t * @param {Function} onDone Callback on completed\n\t * @param {Object} options options\n\t */\n\tasync writeAsync( input, onDone, options = {} ) {\n\n\t\tthis.options = Object.assign( {\n\t\t\t// default options\n\t\t\tbinary: false,\n\t\t\ttrs: false,\n\t\t\tonlyVisible: true,\n\t\t\tmaxTextureSize: Infinity,\n\t\t\tanimations: [],\n\t\t\tincludeCustomExtensions: false\n\t\t}, options );\n\n\t\tif ( this.options.animations.length > 0 ) {\n\n\t\t\t// Only TRS properties, and not matrices, may be targeted by animation.\n\t\t\tthis.options.trs = true;\n\n\t\t}\n\n\t\tawait this.processInputAsync( input );\n\n\t\tawait Promise.all( this.pending );\n\n\t\tconst writer = this;\n\t\tconst buffers = writer.buffers;\n\t\tconst json = writer.json;\n\t\toptions = writer.options;\n\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\t\tconst extensionsRequired = writer.extensionsRequired;\n\n\t\t// Merge buffers.\n\t\tconst blob = new Blob( buffers, { type: 'application/octet-stream' } );\n\n\t\t// Declare extensions.\n\t\tconst extensionsUsedList = Object.keys( extensionsUsed );\n\t\tconst extensionsRequiredList = Object.keys( extensionsRequired );\n\n\t\tif ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList;\n\t\tif ( extensionsRequiredList.length > 0 ) json.extensionsRequired = extensionsRequiredList;\n\n\t\t// Update bytelength of the single buffer.\n\t\tif ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;\n\n\t\tif ( options.binary === true ) {\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\t// Binary chunk.\n\t\t\t\tconst binaryChunk = getPaddedArrayBuffer( reader.result );\n\t\t\t\tconst binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tbinaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );\n\t\t\t\tbinaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true );\n\n\t\t\t\t// JSON chunk.\n\t\t\t\tconst jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );\n\t\t\t\tconst jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tjsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );\n\t\t\t\tjsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true );\n\n\t\t\t\t// GLB header.\n\t\t\t\tconst header = new ArrayBuffer( GLB_HEADER_BYTES );\n\t\t\t\tconst headerView = new DataView( header );\n\t\t\t\theaderView.setUint32( 0, GLB_HEADER_MAGIC, true );\n\t\t\t\theaderView.setUint32( 4, GLB_VERSION, true );\n\t\t\t\tconst totalByteLength = GLB_HEADER_BYTES\n\t\t\t\t\t+ jsonChunkPrefix.byteLength + jsonChunk.byteLength\n\t\t\t\t\t+ binaryChunkPrefix.byteLength + binaryChunk.byteLength;\n\t\t\t\theaderView.setUint32( 8, totalByteLength, true );\n\n\t\t\t\tconst glbBlob = new Blob( [\n\t\t\t\t\theader,\n\t\t\t\t\tjsonChunkPrefix,\n\t\t\t\t\tjsonChunk,\n\t\t\t\t\tbinaryChunkPrefix,\n\t\t\t\t\tbinaryChunk\n\t\t\t\t], { type: 'application/octet-stream' } );\n\n\t\t\t\tconst glbReader = new FileReader();\n\t\t\t\tglbReader.readAsArrayBuffer( glbBlob );\n\t\t\t\tglbReader.onloadend = function () {\n\n\t\t\t\t\tonDone( glbReader.result );\n\n\t\t\t\t};\n\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tif ( json.buffers && json.buffers.length > 0 ) {\n\n\t\t\t\tconst reader = new FileReader();\n\t\t\t\treader.readAsDataURL( blob );\n\t\t\t\treader.onloadend = function () {\n\n\t\t\t\t\tconst base64data = reader.result;\n\t\t\t\t\tjson.buffers[ 0 ].uri = base64data;\n\t\t\t\t\tonDone( json );\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tonDone( json );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\t/**\n\t * Serializes a userData.\n\t *\n\t * @param {THREE.Object3D|THREE.Material} object\n\t * @param {Object} objectDef\n\t */\n\tserializeUserData( object, objectDef ) {\n\n\t\tif ( Object.keys( object.userData ).length === 0 ) return;\n\n\t\tconst options = this.options;\n\t\tconst extensionsUsed = this.extensionsUsed;\n\n\t\ttry {\n\n\t\t\tconst json = JSON.parse( JSON.stringify( object.userData ) );\n\n\t\t\tif ( options.includeCustomExtensions && json.gltfExtensions ) {\n\n\t\t\t\tif ( objectDef.extensions === undefined ) objectDef.extensions = {};\n\n\t\t\t\tfor ( const extensionName in json.gltfExtensions ) {\n\n\t\t\t\t\tobjectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ];\n\t\t\t\t\textensionsUsed[ extensionName ] = true;\n\n\t\t\t\t}\n\n\t\t\t\tdelete json.gltfExtensions;\n\n\t\t\t}\n\n\t\t\tif ( Object.keys( json ).length > 0 ) objectDef.extras = json;\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: userData of \\'' + object.name + '\\' ' +\n\t\t\t\t'won\\'t be serialized because of JSON.stringify error - ' + error.message );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns ids for buffer attributes.\n\t *\n\t * @param {Object} attribute\n\t * @param {boolean} [isRelativeCopy=false]\n\t * @return {number} An integer\n\t */\n\tgetUID( attribute, isRelativeCopy = false ) {\n\n\t\tif ( this.uids.has( attribute ) === false ) {\n\n\t\t\tconst uids = new Map();\n\n\t\t\tuids.set( true, this.uid ++ );\n\t\t\tuids.set( false, this.uid ++ );\n\n\t\t\tthis.uids.set( attribute, uids );\n\n\t\t}\n\n\t\tconst uids = this.uids.get( attribute );\n\n\t\treturn uids.get( isRelativeCopy );\n\n\t}\n\n\t/**\n\t * Checks if normal attribute values are normalized.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {boolean}\n\t */\n\tisNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) ) return false;\n\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = normal.count; i < il; i ++ ) {\n\n\t\t\t// 0.0005 is from glTF-validator\n\t\t\tif ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Creates normalized normal buffer attribute.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {BufferAttribute}\n\t *\n\t */\n\tcreateNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) )\treturn cache.attributesNormalized.get( normal );\n\n\t\tconst attribute = normal.clone();\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tv.fromBufferAttribute( attribute, i );\n\n\t\t\tif ( v.x === 0 && v.y === 0 && v.z === 0 ) {\n\n\t\t\t\t// if values can't be normalized set (1, 0, 0)\n\t\t\t\tv.setX( 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tv.normalize();\n\n\t\t\t}\n\n\t\t\tattribute.setXYZ( i, v.x, v.y, v.z );\n\n\t\t}\n\n\t\tcache.attributesNormalized.set( normal, attribute );\n\n\t\treturn attribute;\n\n\t}\n\n\t/**\n\t * Applies a texture transform, if present, to the map definition. Requires\n\t * the KHR_texture_transform extension.\n\t *\n\t * @param {Object} mapDef\n\t * @param {THREE.Texture} texture\n\t */\n\tapplyTextureTransform( mapDef, texture ) {\n\n\t\tlet didTransform = false;\n\t\tconst transformDef = {};\n\n\t\tif ( texture.offset.x !== 0 || texture.offset.y !== 0 ) {\n\n\t\t\ttransformDef.offset = texture.offset.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.rotation !== 0 ) {\n\n\t\t\ttransformDef.rotation = texture.rotation;\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) {\n\n\t\t\ttransformDef.scale = texture.repeat.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( didTransform ) {\n\n\t\t\tmapDef.extensions = mapDef.extensions || {};\n\t\t\tmapDef.extensions[ 'KHR_texture_transform' ] = transformDef;\n\t\t\tthis.extensionsUsed[ 'KHR_texture_transform' ] = true;\n\n\t\t}\n\n\t}\n\n\tasync buildMetalRoughTextureAsync( metalnessMap, roughnessMap ) {\n\n\t\tif ( metalnessMap === roughnessMap ) return metalnessMap;\n\n\t\tfunction getEncodingConversion( map ) {\n\n\t\t\tif ( map.colorSpace === SRGBColorSpace ) {\n\n\t\t\t\treturn function SRGBToLinear( c ) {\n\n\t\t\t\t\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn function LinearToLinear( c ) {\n\n\t\t\t\treturn c;\n\n\t\t\t};\n\n\t\t}\n\n\t\tif ( metalnessMap instanceof CompressedTexture ) {\n\n\t\t\tmetalnessMap = await this.decompressTextureAsync( metalnessMap );\n\n\t\t}\n\n\t\tif ( roughnessMap instanceof CompressedTexture ) {\n\n\t\t\troughnessMap = await this.decompressTextureAsync( roughnessMap );\n\n\t\t}\n\n\t\tconst metalness = metalnessMap ? metalnessMap.image : null;\n\t\tconst roughness = roughnessMap ? roughnessMap.image : null;\n\n\t\tconst width = Math.max( metalness ? metalness.width : 0, roughness ? roughness.width : 0 );\n\t\tconst height = Math.max( metalness ? metalness.height : 0, roughness ? roughness.height : 0 );\n\n\t\tconst canvas = getCanvas();\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tconst context = canvas.getContext( '2d', {\n\t\t\twillReadFrequently: true,\n\t\t} );\n\t\tcontext.fillStyle = '#00ffff';\n\t\tcontext.fillRect( 0, 0, width, height );\n\n\t\tconst composite = context.getImageData( 0, 0, width, height );\n\n\t\tif ( metalness ) {\n\n\t\t\tcontext.drawImage( metalness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( metalnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 2; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( roughness ) {\n\n\t\t\tcontext.drawImage( roughness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( roughnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 1; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcontext.putImageData( composite, 0, 0 );\n\n\t\t//\n\n\t\tconst reference = metalnessMap || roughnessMap;\n\n\t\tconst texture = reference.clone();\n\n\t\ttexture.source = new Source( canvas );\n\t\ttexture.colorSpace = NoColorSpace;\n\t\ttexture.channel = ( metalnessMap || roughnessMap ).channel;\n\n\t\tif ( metalnessMap && roughnessMap && metalnessMap.channel !== roughnessMap.channel ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match.' );\n\n\t\t}\n\n\t\tconsole.warn( 'THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.' );\n\n\t\treturn texture;\n\n\t}\n\n\n\tasync decompressTextureAsync( texture, maxTextureSize = Infinity ) {\n\n\t\tif ( this.textureUtils === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: setTextureUtils() must be called to process compressed textures.' );\n\n\t\t}\n\n\t\treturn await this.textureUtils.decompress( texture, maxTextureSize );\n\n\t}\n\n\t/**\n\t * Process a buffer to append to the default one.\n\t * @param {ArrayBuffer} buffer\n\t * @return {0}\n\t */\n\tprocessBuffer( buffer ) {\n\n\t\tconst json = this.json;\n\t\tconst buffers = this.buffers;\n\n\t\tif ( ! json.buffers ) json.buffers = [ { byteLength: 0 } ];\n\n\t\t// All buffers are merged before export.\n\t\tbuffers.push( buffer );\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView\n\t * @param {BufferAttribute} attribute\n\t * @param {number} componentType\n\t * @param {number} start\n\t * @param {number} count\n\t * @param {?number} target Target usage of the BufferView\n\t * @return {Object}\n\t */\n\tprocessBufferView( attribute, componentType, start, count, target ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\t// Create a new dataview and dump the attribute's array into it\n\n\t\tlet componentSize;\n\n\t\tswitch ( componentType ) {\n\n\t\t\tcase WEBGL_CONSTANTS.BYTE:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_BYTE:\n\n\t\t\t\tcomponentSize = 1;\n\n\t\t\t\tbreak;\n\n\t\t\tcase WEBGL_CONSTANTS.SHORT:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_SHORT:\n\n\t\t\t\tcomponentSize = 2;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tcomponentSize = 4;\n\n\t\t}\n\n\t\tlet byteStride = attribute.itemSize * componentSize;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Each element of a vertex attribute MUST be aligned to 4-byte boundaries\n\t\t\t// inside a bufferView\n\t\t\tbyteStride = Math.ceil( byteStride / 4 ) * 4;\n\n\t\t}\n\n\t\tconst byteLength = getPaddedBufferSize( count * byteStride );\n\t\tconst dataView = new DataView( new ArrayBuffer( byteLength ) );\n\t\tlet offset = 0;\n\n\t\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\tlet value;\n\n\t\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( componentType === WEBGL_CONSTANTS.FLOAT ) {\n\n\t\t\t\t\tdataView.setFloat32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.INT ) {\n\n\t\t\t\t\tdataView.setInt32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) {\n\n\t\t\t\t\tdataView.setUint32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.SHORT ) {\n\n\t\t\t\t\tdataView.setInt16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {\n\n\t\t\t\t\tdataView.setUint16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.BYTE ) {\n\n\t\t\t\t\tdataView.setInt8( offset, value );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {\n\n\t\t\t\t\tdataView.setUint8( offset, value );\n\n\t\t\t\t}\n\n\t\t\t\toffset += componentSize;\n\n\t\t\t}\n\n\t\t\tif ( ( offset % byteStride ) !== 0 ) {\n\n\t\t\t\toffset += byteStride - ( offset % byteStride );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bufferViewDef = {\n\n\t\t\tbuffer: this.processBuffer( dataView.buffer ),\n\t\t\tbyteOffset: this.byteOffset,\n\t\t\tbyteLength: byteLength\n\n\t\t};\n\n\t\tif ( target !== undefined ) bufferViewDef.target = target;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Only define byteStride for vertex attributes.\n\t\t\tbufferViewDef.byteStride = byteStride;\n\n\t\t}\n\n\t\tthis.byteOffset += byteLength;\n\n\t\tjson.bufferViews.push( bufferViewDef );\n\n\t\t// @TODO Merge bufferViews where possible.\n\t\tconst output = {\n\n\t\t\tid: json.bufferViews.length - 1,\n\t\t\tbyteLength: 0\n\n\t\t};\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView from an image Blob.\n\t * @param {Blob} blob\n\t * @return {Promise} An integer\n\t */\n\tprocessBufferViewImage( blob ) {\n\n\t\tconst writer = this;\n\t\tconst json = writer.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\treturn new Promise( function ( resolve ) {\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\tconst buffer = getPaddedArrayBuffer( reader.result );\n\n\t\t\t\tconst bufferViewDef = {\n\t\t\t\t\tbuffer: writer.processBuffer( buffer ),\n\t\t\t\t\tbyteOffset: writer.byteOffset,\n\t\t\t\t\tbyteLength: buffer.byteLength\n\t\t\t\t};\n\n\t\t\t\twriter.byteOffset += buffer.byteLength;\n\t\t\t\tresolve( json.bufferViews.push( bufferViewDef ) - 1 );\n\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Process attribute to generate an accessor\n\t * @param {BufferAttribute} attribute Attribute to process\n\t * @param {?BufferGeometry} geometry Geometry used for truncated draw range\n\t * @param {number} [start=0]\n\t * @param {number} [count=Infinity]\n\t * @return {?number} Index of the processed accessor on the \"accessors\" array\n\t */\n\tprocessAccessor( attribute, geometry, start, count ) {\n\n\t\tconst json = this.json;\n\n\t\tconst types = {\n\n\t\t\t1: 'SCALAR',\n\t\t\t2: 'VEC2',\n\t\t\t3: 'VEC3',\n\t\t\t4: 'VEC4',\n\t\t\t9: 'MAT3',\n\t\t\t16: 'MAT4'\n\n\t\t};\n\n\t\tlet componentType;\n\n\t\t// Detect the component type of the attribute array\n\t\tif ( attribute.array.constructor === Float32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.FLOAT;\n\n\t\t} else if ( attribute.array.constructor === Int32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.INT;\n\n\t\t} else if ( attribute.array.constructor === Uint32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_INT;\n\n\t\t} else if ( attribute.array.constructor === Int16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.SHORT;\n\n\t\t} else if ( attribute.array.constructor === Uint16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_SHORT;\n\n\t\t} else if ( attribute.array.constructor === Int8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.BYTE;\n\n\t\t} else if ( attribute.array.constructor === Uint8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type: ' + attribute.array.constructor.name );\n\n\t\t}\n\n\t\tif ( start === undefined ) start = 0;\n\t\tif ( count === undefined || count === Infinity ) count = attribute.count;\n\n\t\t// Skip creating an accessor if the attribute doesn't have data to export\n\t\tif ( count === 0 ) return null;\n\n\t\tconst minMax = getMinMax( attribute, start, count );\n\t\tlet bufferViewTarget;\n\n\t\t// If geometry isn't provided, don't infer the target usage of the bufferView. For\n\t\t// animation samplers, target must not be set.\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tbufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;\n\n\t\t}\n\n\t\tconst bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget );\n\n\t\tconst accessorDef = {\n\n\t\t\tbufferView: bufferView.id,\n\t\t\tbyteOffset: bufferView.byteOffset,\n\t\t\tcomponentType: componentType,\n\t\t\tcount: count,\n\t\t\tmax: minMax.max,\n\t\t\tmin: minMax.min,\n\t\t\ttype: types[ attribute.itemSize ]\n\n\t\t};\n\n\t\tif ( attribute.normalized === true ) accessorDef.normalized = true;\n\t\tif ( ! json.accessors ) json.accessors = [];\n\n\t\treturn json.accessors.push( accessorDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process image\n\t * @param {Image} image to process\n\t * @param {number} format Identifier of the format (RGBAFormat)\n\t * @param {boolean} flipY before writing out the image\n\t * @param {string} mimeType export format\n\t * @return {number} Index of the processed texture in the \"images\" array\n\t */\n\tprocessImage( image, format, flipY, mimeType = 'image/png' ) {\n\n\t\tif ( image !== null ) {\n\n\t\t\tconst writer = this;\n\t\t\tconst cache = writer.cache;\n\t\t\tconst json = writer.json;\n\t\t\tconst options = writer.options;\n\t\t\tconst pending = writer.pending;\n\n\t\t\tif ( ! cache.images.has( image ) ) cache.images.set( image, {} );\n\n\t\t\tconst cachedImages = cache.images.get( image );\n\n\t\t\tconst key = mimeType + ':flipY/' + flipY.toString();\n\n\t\t\tif ( cachedImages[ key ] !== undefined ) return cachedImages[ key ];\n\n\t\t\tif ( ! json.images ) json.images = [];\n\n\t\t\tconst imageDef = { mimeType: mimeType };\n\n\t\t\tconst canvas = getCanvas();\n\n\t\t\tcanvas.width = Math.min( image.width, options.maxTextureSize );\n\t\t\tcanvas.height = Math.min( image.height, options.maxTextureSize );\n\n\t\t\tconst ctx = canvas.getContext( '2d', {\n\t\t\t\twillReadFrequently: true,\n\t\t\t} );\n\n\t\t\tif ( flipY === true ) {\n\n\t\t\t\tctx.translate( 0, canvas.height );\n\t\t\t\tctx.scale( 1, - 1 );\n\n\t\t\t}\n\n\t\t\tif ( image.data !== undefined ) { // THREE.DataTexture\n\n\t\t\t\tif ( format !== RGBAFormat ) {\n\n\t\t\t\t\tconsole.error( 'GLTFExporter: Only RGBAFormat is supported.', format );\n\n\t\t\t\t}\n\n\t\t\t\tif ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) {\n\n\t\t\t\t\tconsole.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image );\n\n\t\t\t\t}\n\n\t\t\t\tconst data = new Uint8ClampedArray( image.height * image.width * 4 );\n\n\t\t\t\tfor ( let i = 0; i < data.length; i += 4 ) {\n\n\t\t\t\t\tdata[ i + 0 ] = image.data[ i + 0 ];\n\t\t\t\t\tdata[ i + 1 ] = image.data[ i + 1 ];\n\t\t\t\t\tdata[ i + 2 ] = image.data[ i + 2 ];\n\t\t\t\t\tdata[ i + 3 ] = image.data[ i + 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t\t( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ) {\n\n\t\t\t\t\tctx.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( options.binary === true ) {\n\n\t\t\t\tpending.push(\n\n\t\t\t\t\tgetToBlobPromise( canvas, mimeType )\n\t\t\t\t\t\t.then( blob => writer.processBufferViewImage( blob ) )\n\t\t\t\t\t\t.then( bufferViewIndex => {\n\n\t\t\t\t\t\t\timageDef.bufferView = bufferViewIndex;\n\n\t\t\t\t\t\t} )\n\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tif ( canvas.toDataURL !== undefined ) {\n\n\t\t\t\t\timageDef.uri = canvas.toDataURL( mimeType );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpending.push(\n\n\t\t\t\t\t\tgetToBlobPromise( canvas, mimeType )\n\t\t\t\t\t\t\t.then( blob => new FileReader().readAsDataURL( blob ) )\n\t\t\t\t\t\t\t.then( dataURL => {\n\n\t\t\t\t\t\t\t\timageDef.uri = dataURL;\n\n\t\t\t\t\t\t\t} )\n\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst index = json.images.push( imageDef ) - 1;\n\t\t\tcachedImages[ key ] = index;\n\t\t\treturn index;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: No valid image data found. Unable to process texture.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process sampler\n\t * @param {Texture} map Texture to process\n\t * @return {number} Index of the processed texture in the \"samplers\" array\n\t */\n\tprocessSampler( map ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.samplers ) json.samplers = [];\n\n\t\tconst samplerDef = {\n\t\t\tmagFilter: THREE_TO_WEBGL[ map.magFilter ],\n\t\t\tminFilter: THREE_TO_WEBGL[ map.minFilter ],\n\t\t\twrapS: THREE_TO_WEBGL[ map.wrapS ],\n\t\t\twrapT: THREE_TO_WEBGL[ map.wrapT ]\n\t\t};\n\n\t\treturn json.samplers.push( samplerDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process texture\n\t * @param {Texture} map Map to process\n\t * @return {Promise} Index of the processed texture in the \"textures\" array\n\t */\n\tasync processTextureAsync( map ) {\n\n\t\tconst writer = this;\n\t\tconst options = writer.options;\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.textures.has( map ) ) return cache.textures.get( map );\n\n\t\tif ( ! json.textures ) json.textures = [];\n\n\t\t// make non-readable textures (e.g. CompressedTexture) readable by blitting them into a new texture\n\t\tif ( map instanceof CompressedTexture ) {\n\n\t\t\tmap = await this.decompressTextureAsync( map, options.maxTextureSize );\n\n\t\t}\n\n\t\tlet mimeType = map.userData.mimeType;\n\n\t\tif ( mimeType === 'image/webp' ) mimeType = 'image/png';\n\n\t\tconst textureDef = {\n\t\t\tsampler: this.processSampler( map ),\n\t\t\tsource: this.processImage( map.image, map.format, map.flipY, mimeType )\n\t\t};\n\n\t\tif ( map.name ) textureDef.name = map.name;\n\n\t\tawait this._invokeAllAsync( async function ( ext ) {\n\n\t\t\text.writeTexture && await ext.writeTexture( map, textureDef );\n\n\t\t} );\n\n\t\tconst index = json.textures.push( textureDef ) - 1;\n\t\tcache.textures.set( map, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process material\n\t * @param {THREE.Material} material Material to process\n\t * @return {Promise} Index of the processed material in the \"materials\" array\n\t */\n\tasync processMaterialAsync( material ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.materials.has( material ) ) return cache.materials.get( material );\n\n\t\tif ( material.isShaderMaterial ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( ! json.materials ) json.materials = [];\n\n\t\t// @QUESTION Should we avoid including any attribute that has the default value?\n\t\tconst materialDef = {\tpbrMetallicRoughness: {} };\n\n\t\tif ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorFactor\n\t\tconst color = material.color.toArray().concat( [ material.opacity ] );\n\n\t\tif ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorFactor = color;\n\n\t\t}\n\n\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = material.metalness;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;\n\n\t\t} else {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 1;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.metallicRoughnessTexture\n\t\tif ( material.metalnessMap || material.roughnessMap ) {\n\n\t\t\tconst metalRoughTexture = await this.buildMetalRoughTextureAsync( material.metalnessMap, material.roughnessMap );\n\n\t\t\tconst metalRoughMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( metalRoughTexture ),\n\t\t\t\ttexCoord: metalRoughTexture.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( metalRoughMapDef, metalRoughTexture );\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorTexture\n\t\tif ( material.map ) {\n\n\t\t\tconst baseColorMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( material.map ),\n\t\t\t\ttexCoord: material.map.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( baseColorMapDef, material.map );\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tconst emissive = material.emissive;\n\t\t\tconst maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );\n\n\t\t\tif ( maxEmissiveComponent > 0 ) {\n\n\t\t\t\tmaterialDef.emissiveFactor = material.emissive.toArray();\n\n\t\t\t}\n\n\t\t\t// emissiveTexture\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tconst emissiveMapDef = {\n\t\t\t\t\tindex: await this.processTextureAsync( material.emissiveMap ),\n\t\t\t\t\ttexCoord: material.emissiveMap.channel\n\t\t\t\t};\n\t\t\t\tthis.applyTextureTransform( emissiveMapDef, material.emissiveMap );\n\t\t\t\tmaterialDef.emissiveTexture = emissiveMapDef;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalTexture\n\t\tif ( material.normalMap ) {\n\n\t\t\tconst normalMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( material.normalMap ),\n\t\t\t\ttexCoord: material.normalMap.channel\n\t\t\t};\n\n\t\t\tif ( material.normalScale && material.normalScale.x !== 1 ) {\n\n\t\t\t\t// glTF normal scale is univariate. Ignore `y`, which may be flipped.\n\t\t\t\t// Context: https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\tnormalMapDef.scale = material.normalScale.x;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( normalMapDef, material.normalMap );\n\t\t\tmaterialDef.normalTexture = normalMapDef;\n\n\t\t}\n\n\t\t// occlusionTexture\n\t\tif ( material.aoMap ) {\n\n\t\t\tconst occlusionMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( material.aoMap ),\n\t\t\t\ttexCoord: material.aoMap.channel\n\t\t\t};\n\n\t\t\tif ( material.aoMapIntensity !== 1.0 ) {\n\n\t\t\t\tocclusionMapDef.strength = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( occlusionMapDef, material.aoMap );\n\t\t\tmaterialDef.occlusionTexture = occlusionMapDef;\n\n\t\t}\n\n\t\t// alphaMode\n\t\tif ( material.transparent ) {\n\n\t\t\tmaterialDef.alphaMode = 'BLEND';\n\n\t\t} else {\n\n\t\t\tif ( material.alphaTest > 0.0 ) {\n\n\t\t\t\tmaterialDef.alphaMode = 'MASK';\n\t\t\t\tmaterialDef.alphaCutoff = material.alphaTest;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// doubleSided\n\t\tif ( material.side === DoubleSide ) materialDef.doubleSided = true;\n\t\tif ( material.name !== '' ) materialDef.name = material.name;\n\n\t\tthis.serializeUserData( material, materialDef );\n\n\t\tawait this._invokeAllAsync( async function ( ext ) {\n\n\t\t\text.writeMaterialAsync && await ext.writeMaterialAsync( material, materialDef );\n\n\t\t} );\n\n\t\tconst index = json.materials.push( materialDef ) - 1;\n\t\tcache.materials.set( material, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process mesh\n\t * @param {THREE.Mesh} mesh Mesh to process\n\t * @return {Promise} Index of the processed mesh in the \"meshes\" array\n\t */\n\tasync processMeshAsync( mesh ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tconst meshCacheKeyParts = [ mesh.geometry.uuid ];\n\n\t\tif ( Array.isArray( mesh.material ) ) {\n\n\t\t\tfor ( let i = 0, l = mesh.material.length; i < l; i ++ ) {\n\n\t\t\t\tmeshCacheKeyParts.push( mesh.material[ i ].uuid\t);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmeshCacheKeyParts.push( mesh.material.uuid );\n\n\t\t}\n\n\t\tconst meshCacheKey = meshCacheKeyParts.join( ':' );\n\n\t\tif ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey );\n\n\t\tconst geometry = mesh.geometry;\n\n\t\tlet mode;\n\n\t\t// Use the correct mode\n\t\tif ( mesh.isLineSegments ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINES;\n\n\t\t} else if ( mesh.isLineLoop ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_LOOP;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_STRIP;\n\n\t\t} else if ( mesh.isPoints ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.POINTS;\n\n\t\t} else {\n\n\t\t\tmode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;\n\n\t\t}\n\n\t\tconst meshDef = {};\n\t\tconst attributes = {};\n\t\tconst primitives = [];\n\t\tconst targets = [];\n\n\t\t// Conversion between attributes names in threejs and gltf spec\n\t\tconst nameConversion = {\n\t\t\tuv: 'TEXCOORD_0',\n\t\t\tuv1: 'TEXCOORD_1',\n\t\t\tuv2: 'TEXCOORD_2',\n\t\t\tuv3: 'TEXCOORD_3',\n\t\t\tcolor: 'COLOR_0',\n\t\t\tskinWeight: 'WEIGHTS_0',\n\t\t\tskinIndex: 'JOINTS_0'\n\t\t};\n\n\t\tconst originalNormal = geometry.getAttribute( 'normal' );\n\n\t\tif ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' );\n\n\t\t\tgeometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) );\n\n\t\t}\n\n\t\t// @QUESTION Detect if .vertexColors = true?\n\t\t// For every attribute create an accessor\n\t\tlet modifiedAttribute = null;\n\n\t\tfor ( let attributeName in geometry.attributes ) {\n\n\t\t\t// Ignore morph target attributes, which are exported later.\n\t\t\tif ( attributeName.slice( 0, 5 ) === 'morph' ) continue;\n\n\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\tattributeName = nameConversion[ attributeName ] || attributeName.toUpperCase();\n\n\t\t\t// Prefix all geometry attributes except the ones specifically\n\t\t\t// listed in the spec; non-spec attributes are considered custom.\n\t\t\tconst validVertexAttributes =\n\t\t\t\t\t/^(POSITION|NORMAL|TANGENT|TEXCOORD_\\d+|COLOR_\\d+|JOINTS_\\d+|WEIGHTS_\\d+)$/;\n\n\t\t\tif ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;\n\n\t\t\tif ( cache.attributes.has( this.getUID( attribute ) ) ) {\n\n\t\t\t\tattributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Enforce glTF vertex attribute requirements:\n\t\t\t// - JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT\n\t\t\t// - Only custom attributes may be INT or UNSIGNED_INT\n\t\t\tmodifiedAttribute = null;\n\t\t\tconst array = attribute.array;\n\n\t\t\tif ( attributeName === 'JOINTS_0' &&\n\t\t\t\t! ( array instanceof Uint16Array ) &&\n\t\t\t\t! ( array instanceof Uint8Array ) ) {\n\n\t\t\t\tconsole.warn( 'GLTFExporter: Attribute \"skinIndex\" converted to type UNSIGNED_SHORT.' );\n\t\t\t\tmodifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );\n\n\t\t\t} else if ( ( array instanceof Uint32Array || array instanceof Int32Array ) && ! attributeName.startsWith( '_' ) ) {\n\n\t\t\t\tconsole.warn( `GLTFExporter: Attribute \"${ attributeName }\" converted to type FLOAT.` );\n\t\t\t\tmodifiedAttribute = GLTFExporter.Utils.toFloat32BufferAttribute( attribute );\n\n\t\t\t}\n\n\t\t\tconst accessor = this.processAccessor( modifiedAttribute || attribute, geometry );\n\n\t\t\tif ( accessor !== null ) {\n\n\t\t\t\tif ( ! attributeName.startsWith( '_' ) ) {\n\n\t\t\t\t\tthis.detectMeshQuantization( attributeName, attribute );\n\n\t\t\t\t}\n\n\t\t\t\tattributes[ attributeName ] = accessor;\n\t\t\t\tcache.attributes.set( this.getUID( attribute ), accessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal );\n\n\t\t// Skip if no exportable attributes found\n\t\tif ( Object.keys( attributes ).length === 0 ) return null;\n\n\t\t// Morph targets\n\t\tif ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) {\n\n\t\t\tconst weights = [];\n\t\t\tconst targetNames = [];\n\t\t\tconst reverseDictionary = {};\n\n\t\t\tif ( mesh.morphTargetDictionary !== undefined ) {\n\n\t\t\t\tfor ( const key in mesh.morphTargetDictionary ) {\n\n\t\t\t\t\treverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) {\n\n\t\t\t\tconst target = {};\n\t\t\t\tlet warned = false;\n\n\t\t\t\tfor ( const attributeName in geometry.morphAttributes ) {\n\n\t\t\t\t\t// glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.\n\t\t\t\t\t// Three.js doesn't support TANGENT yet.\n\n\t\t\t\t\tif ( attributeName !== 'position' && attributeName !== 'normal' ) {\n\n\t\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' );\n\t\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst attribute = geometry.morphAttributes[ attributeName ][ i ];\n\t\t\t\t\tconst gltfAttributeName = attributeName.toUpperCase();\n\n\t\t\t\t\t// Three.js morph attribute has absolute values while the one of glTF has relative values.\n\t\t\t\t\t//\n\t\t\t\t\t// glTF 2.0 Specification:\n\t\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets\n\n\t\t\t\t\tconst baseAttribute = geometry.attributes[ attributeName ];\n\n\t\t\t\t\tif ( cache.attributes.has( this.getUID( attribute, true ) ) ) {\n\n\t\t\t\t\t\ttarget[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute, true ) );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clones attribute not to override\n\t\t\t\t\tconst relativeAttribute = attribute.clone();\n\n\t\t\t\t\tif ( ! geometry.morphTargetsRelative ) {\n\n\t\t\t\t\t\tfor ( let j = 0, jl = attribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\t\t\t\t\tif ( a === 0 ) relativeAttribute.setX( j, attribute.getX( j ) - baseAttribute.getX( j ) );\n\t\t\t\t\t\t\t\tif ( a === 1 ) relativeAttribute.setY( j, attribute.getY( j ) - baseAttribute.getY( j ) );\n\t\t\t\t\t\t\t\tif ( a === 2 ) relativeAttribute.setZ( j, attribute.getZ( j ) - baseAttribute.getZ( j ) );\n\t\t\t\t\t\t\t\tif ( a === 3 ) relativeAttribute.setW( j, attribute.getW( j ) - baseAttribute.getW( j ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry );\n\t\t\t\t\tcache.attributes.set( this.getUID( baseAttribute, true ), target[ gltfAttributeName ] );\n\n\t\t\t\t}\n\n\t\t\t\ttargets.push( target );\n\n\t\t\t\tweights.push( mesh.morphTargetInfluences[ i ] );\n\n\t\t\t\tif ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] );\n\n\t\t\t}\n\n\t\t\tmeshDef.weights = weights;\n\n\t\t\tif ( targetNames.length > 0 ) {\n\n\t\t\t\tmeshDef.extras = {};\n\t\t\t\tmeshDef.extras.targetNames = targetNames;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst isMultiMaterial = Array.isArray( mesh.material );\n\n\t\tif ( isMultiMaterial && geometry.groups.length === 0 ) return null;\n\n\t\tlet didForceIndices = false;\n\n\t\tif ( isMultiMaterial && geometry.index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tfor ( let i = 0, il = geometry.attributes.position.count; i < il; i ++ ) {\n\n\t\t\t\tindices[ i ] = i;\n\n\t\t\t}\n\n\t\t\tgeometry.setIndex( indices );\n\n\t\t\tdidForceIndices = true;\n\n\t\t}\n\n\t\tconst materials = isMultiMaterial ? mesh.material : [ mesh.material ];\n\t\tconst groups = isMultiMaterial ? geometry.groups : [ { materialIndex: 0, start: undefined, count: undefined } ];\n\n\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = {\n\t\t\t\tmode: mode,\n\t\t\t\tattributes: attributes,\n\t\t\t};\n\n\t\t\tthis.serializeUserData( geometry, primitive );\n\n\t\t\tif ( targets.length > 0 ) primitive.targets = targets;\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tlet cacheKey = this.getUID( geometry.index );\n\n\t\t\t\tif ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) {\n\n\t\t\t\t\tcacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cache.attributes.has( cacheKey ) ) {\n\n\t\t\t\t\tprimitive.indices = cache.attributes.get( cacheKey );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tprimitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count );\n\t\t\t\t\tcache.attributes.set( cacheKey, primitive.indices );\n\n\t\t\t\t}\n\n\t\t\t\tif ( primitive.indices === null ) delete primitive.indices;\n\n\t\t\t}\n\n\t\t\tconst material = await this.processMaterialAsync( materials[ groups[ i ].materialIndex ] );\n\n\t\t\tif ( material !== null ) primitive.material = material;\n\n\t\t\tprimitives.push( primitive );\n\n\t\t}\n\n\t\tif ( didForceIndices === true ) {\n\n\t\t\tgeometry.setIndex( null );\n\n\t\t}\n\n\t\tmeshDef.primitives = primitives;\n\n\t\tif ( ! json.meshes ) json.meshes = [];\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.writeMesh && ext.writeMesh( mesh, meshDef );\n\n\t\t} );\n\n\t\tconst index = json.meshes.push( meshDef ) - 1;\n\t\tcache.meshes.set( meshCacheKey, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * If a vertex attribute with a\n\t * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview)\n\t * is used, it is checked whether it is a valid data type according to the\n\t * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md)\n\t * extension.\n\t * In this case the extension is automatically added to the list of used extensions.\n\t *\n\t * @param {string} attributeName\n\t * @param {THREE.BufferAttribute} attribute\n\t */\n\tdetectMeshQuantization( attributeName, attribute ) {\n\n\t\tif ( this.extensionsUsed[ KHR_MESH_QUANTIZATION ] ) return;\n\n\t\tlet attrType = undefined;\n\n\t\tswitch ( attribute.array.constructor ) {\n\n\t\t\tcase Int8Array:\n\n\t\t\t\tattrType = 'byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint8Array:\n\n\t\t\t\tattrType = 'unsigned byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Int16Array:\n\n\t\t\t\tattrType = 'short';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint16Array:\n\n\t\t\t\tattrType = 'unsigned short';\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.normalized ) attrType += ' normalized';\n\n\t\tconst attrNamePrefix = attributeName.split( '_', 1 )[ 0 ];\n\n\t\tif ( KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ] && KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ].includes( attrType ) ) {\n\n\t\t\tthis.extensionsUsed[ KHR_MESH_QUANTIZATION ] = true;\n\t\t\tthis.extensionsRequired[ KHR_MESH_QUANTIZATION ] = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process camera\n\t * @param {THREE.Camera} camera Camera to process\n\t * @return {number} Index of the processed mesh in the \"camera\" array\n\t */\n\tprocessCamera( camera ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.cameras ) json.cameras = [];\n\n\t\tconst isOrtho = camera.isOrthographicCamera;\n\n\t\tconst cameraDef = {\n\t\t\ttype: isOrtho ? 'orthographic' : 'perspective'\n\t\t};\n\n\t\tif ( isOrtho ) {\n\n\t\t\tcameraDef.orthographic = {\n\t\t\t\txmag: camera.right * 2,\n\t\t\t\tymag: camera.top * 2,\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tcameraDef.perspective = {\n\t\t\t\taspectRatio: camera.aspect,\n\t\t\t\tyfov: MathUtils.degToRad( camera.fov ),\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t}\n\n\t\t// Question: Is saving \"type\" as name intentional?\n\t\tif ( camera.name !== '' ) cameraDef.name = camera.type;\n\n\t\treturn json.cameras.push( cameraDef ) - 1;\n\n\t}\n\n\t/**\n\t * Creates glTF animation entry from AnimationClip object.\n\t *\n\t * Status:\n\t * - Only properties listed in PATH_PROPERTIES may be animated.\n\t *\n\t * @param {THREE.AnimationClip} clip\n\t * @param {THREE.Object3D} root\n\t * @return {number|null}\n\t */\n\tprocessAnimation( clip, root ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.animations ) json.animations = [];\n\n\t\tclip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root );\n\n\t\tconst tracks = clip.tracks;\n\t\tconst channels = [];\n\t\tconst samplers = [];\n\n\t\tfor ( let i = 0; i < tracks.length; ++ i ) {\n\n\t\t\tconst track = tracks[ i ];\n\t\t\tconst trackBinding = PropertyBinding.parseTrackName( track.name );\n\t\t\tlet trackNode = PropertyBinding.findNode( root, trackBinding.nodeName );\n\t\t\tconst trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ];\n\n\t\t\tif ( trackBinding.objectName === 'bones' ) {\n\n\t\t\t\tif ( trackNode.isSkinnedMesh === true ) {\n\n\t\t\t\t\ttrackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttrackNode = undefined;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! trackNode || ! trackProperty ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Could not export animation track \"%s\".', track.name );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst inputItemSize = 1;\n\t\t\tlet outputItemSize = track.values.length / track.times.length;\n\n\t\t\tif ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) {\n\n\t\t\t\toutputItemSize /= trackNode.morphTargetInfluences.length;\n\n\t\t\t}\n\n\t\t\tlet interpolation;\n\n\t\t\t// @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE\n\n\t\t\t// Detecting glTF cubic spline interpolant by checking factory method's special property\n\t\t\t// GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return\n\t\t\t// valid value from .getInterpolation().\n\t\t\tif ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) {\n\n\t\t\t\tinterpolation = 'CUBICSPLINE';\n\n\t\t\t\t// itemSize of CUBICSPLINE keyframe is 9\n\t\t\t\t// (VEC3 * 3: inTangent, splineVertex, and outTangent)\n\t\t\t\t// but needs to be stored as VEC3 so dividing by 3 here.\n\t\t\t\toutputItemSize /= 3;\n\n\t\t\t} else if ( track.getInterpolation() === InterpolateDiscrete ) {\n\n\t\t\t\tinterpolation = 'STEP';\n\n\t\t\t} else {\n\n\t\t\t\tinterpolation = 'LINEAR';\n\n\t\t\t}\n\n\t\t\tsamplers.push( {\n\t\t\t\tinput: this.processAccessor( new BufferAttribute( track.times, inputItemSize ) ),\n\t\t\t\toutput: this.processAccessor( new BufferAttribute( track.values, outputItemSize ) ),\n\t\t\t\tinterpolation: interpolation\n\t\t\t} );\n\n\t\t\tchannels.push( {\n\t\t\t\tsampler: samplers.length - 1,\n\t\t\t\ttarget: {\n\t\t\t\t\tnode: nodeMap.get( trackNode ),\n\t\t\t\t\tpath: trackProperty\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\tjson.animations.push( {\n\t\t\tname: clip.name || 'clip_' + json.animations.length,\n\t\t\tsamplers: samplers,\n\t\t\tchannels: channels\n\t\t} );\n\n\t\treturn json.animations.length - 1;\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D} object\n\t * @return {number|null}\n\t */\n\t processSkin( object ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tconst node = json.nodes[ nodeMap.get( object ) ];\n\n\t\tconst skeleton = object.skeleton;\n\n\t\tif ( skeleton === undefined ) return null;\n\n\t\tconst rootJoint = object.skeleton.bones[ 0 ];\n\n\t\tif ( rootJoint === undefined ) return null;\n\n\t\tconst joints = [];\n\t\tconst inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 );\n\t\tconst temporaryBoneInverse = new Matrix4();\n\n\t\tfor ( let i = 0; i < skeleton.bones.length; ++ i ) {\n\n\t\t\tjoints.push( nodeMap.get( skeleton.bones[ i ] ) );\n\t\t\ttemporaryBoneInverse.copy( skeleton.boneInverses[ i ] );\n\t\t\ttemporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( json.skins === undefined ) json.skins = [];\n\n\t\tjson.skins.push( {\n\t\t\tinverseBindMatrices: this.processAccessor( new BufferAttribute( inverseBindMatrices, 16 ) ),\n\t\t\tjoints: joints,\n\t\t\tskeleton: nodeMap.get( rootJoint )\n\t\t} );\n\n\t\tconst skinIndex = node.skin = json.skins.length - 1;\n\n\t\treturn skinIndex;\n\n\t}\n\n\t/**\n\t * Process Object3D node\n\t * @param {THREE.Object3D} object Object3D to processNodeAsync\n\t * @return {Promise} Index of the node in the nodes list\n\t */\n\tasync processNodeAsync( object ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.nodes ) json.nodes = [];\n\n\t\tconst nodeDef = {};\n\n\t\tif ( options.trs ) {\n\n\t\t\tconst rotation = object.quaternion.toArray();\n\t\t\tconst position = object.position.toArray();\n\t\t\tconst scale = object.scale.toArray();\n\n\t\t\tif ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {\n\n\t\t\t\tnodeDef.rotation = rotation;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( position, [ 0, 0, 0 ] ) ) {\n\n\t\t\t\tnodeDef.translation = position;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {\n\n\t\t\t\tnodeDef.scale = scale;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( object.matrixAutoUpdate ) {\n\n\t\t\t\tobject.updateMatrix();\n\n\t\t\t}\n\n\t\t\tif ( isIdentityMatrix( object.matrix ) === false ) {\n\n\t\t\t\tnodeDef.matrix = object.matrix.elements;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// We don't export empty strings name because it represents no-name in Three.js.\n\t\tif ( object.name !== '' ) nodeDef.name = String( object.name );\n\n\t\tthis.serializeUserData( object, nodeDef );\n\n\t\tif ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\tconst meshIndex = await this.processMeshAsync( object );\n\n\t\t\tif ( meshIndex !== null ) nodeDef.mesh = meshIndex;\n\n\t\t} else if ( object.isCamera ) {\n\n\t\t\tnodeDef.camera = this.processCamera( object );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) this.skins.push( object );\n\n\t\tif ( object.children.length > 0 ) {\n\n\t\t\tconst children = [];\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = object.children[ i ];\n\n\t\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\t\tconst nodeIndex = await this.processNodeAsync( child );\n\n\t\t\t\t\tif ( nodeIndex !== null ) children.push( nodeIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( children.length > 0 ) nodeDef.children = children;\n\n\t\t}\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.writeNode && ext.writeNode( object, nodeDef );\n\n\t\t} );\n\n\t\tconst nodeIndex = json.nodes.push( nodeDef ) - 1;\n\t\tnodeMap.set( object, nodeIndex );\n\t\treturn nodeIndex;\n\n\t}\n\n\t/**\n\t * Process Scene\n\t * @param {Scene} scene Scene to process\n\t */\n\tasync processSceneAsync( scene ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( ! json.scenes ) {\n\n\t\t\tjson.scenes = [];\n\t\t\tjson.scene = 0;\n\n\t\t}\n\n\t\tconst sceneDef = {};\n\n\t\tif ( scene.name !== '' ) sceneDef.name = scene.name;\n\n\t\tjson.scenes.push( sceneDef );\n\n\t\tconst nodes = [];\n\n\t\tfor ( let i = 0, l = scene.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = scene.children[ i ];\n\n\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\tconst nodeIndex = await this.processNodeAsync( child );\n\n\t\t\t\tif ( nodeIndex !== null ) nodes.push( nodeIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( nodes.length > 0 ) sceneDef.nodes = nodes;\n\n\t\tthis.serializeUserData( scene, sceneDef );\n\n\t}\n\n\t/**\n\t * Creates a Scene to hold a list of objects and parse it\n\t * @param {Array} objects List of objects to process\n\t */\n\tasync processObjectsAsync( objects ) {\n\n\t\tconst scene = new Scene();\n\t\tscene.name = 'AuxScene';\n\n\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\t// We push directly to children instead of calling `add` to prevent\n\t\t\t// modify the .parent and break its original scene and hierarchy\n\t\t\tscene.children.push( objects[ i ] );\n\n\t\t}\n\n\t\tawait this.processSceneAsync( scene );\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D|Array} input\n\t */\n\tasync processInputAsync( input ) {\n\n\t\tconst options = this.options;\n\n\t\tinput = input instanceof Array ? input : [ input ];\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.beforeParse && ext.beforeParse( input );\n\n\t\t} );\n\n\t\tconst objectsWithoutScene = [];\n\n\t\tfor ( let i = 0; i < input.length; i ++ ) {\n\n\t\t\tif ( input[ i ] instanceof Scene ) {\n\n\t\t\t\tawait this.processSceneAsync( input[ i ] );\n\n\t\t\t} else {\n\n\t\t\t\tobjectsWithoutScene.push( input[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( objectsWithoutScene.length > 0 ) {\n\n\t\t\tawait this.processObjectsAsync( objectsWithoutScene );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.skins.length; ++ i ) {\n\n\t\t\tthis.processSkin( this.skins[ i ] );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < options.animations.length; ++ i ) {\n\n\t\t\tthis.processAnimation( options.animations[ i ], input[ 0 ] );\n\n\t\t}\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.afterParse && ext.afterParse( input );\n\n\t\t} );\n\n\t}\n\n\tasync _invokeAllAsync( func ) {\n\n\t\tfor ( let i = 0, il = this.plugins.length; i < il; i ++ ) {\n\n\t\t\tawait func( this.plugins[ i ] );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_lights_punctual';\n\n\t}\n\n\twriteNode( light, nodeDef ) {\n\n\t\tif ( ! light.isLight ) return;\n\n\t\tif ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst writer = this.writer;\n\t\tconst json = writer.json;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst lightDef = {};\n\n\t\tif ( light.name ) lightDef.name = light.name;\n\n\t\tlightDef.color = light.color.toArray();\n\n\t\tlightDef.intensity = light.intensity;\n\n\t\tif ( light.isDirectionalLight ) {\n\n\t\t\tlightDef.type = 'directional';\n\n\t\t} else if ( light.isPointLight ) {\n\n\t\t\tlightDef.type = 'point';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t} else if ( light.isSpotLight ) {\n\n\t\t\tlightDef.type = 'spot';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t\tlightDef.spot = {};\n\t\t\tlightDef.spot.innerConeAngle = ( 1.0 - light.penumbra ) * light.angle;\n\t\t\tlightDef.spot.outerConeAngle = light.angle;\n\n\t\t}\n\n\t\tif ( light.decay !== undefined && light.decay !== 2 ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, '\n\t\t\t\t+ 'and expects light.decay=2.' );\n\n\t\t}\n\n\t\tif ( light.target\n\t\t\t\t&& ( light.target.parent !== light\n\t\t\t\t|| light.target.position.x !== 0\n\t\t\t\t|| light.target.position.y !== 0\n\t\t\t\t|| light.target.position.z !== - 1 ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, '\n\t\t\t\t+ 'make light.target a child of the light with position 0,0,-1.' );\n\n\t\t}\n\n\t\tif ( ! extensionsUsed[ this.name ] ) {\n\n\t\t\tjson.extensions = json.extensions || {};\n\t\t\tjson.extensions[ this.name ] = { lights: [] };\n\t\t\textensionsUsed[ this.name ] = true;\n\n\t\t}\n\n\t\tconst lights = json.extensions[ this.name ].lights;\n\t\tlights.push( lightDef );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { light: lights.length - 1 };\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_unlit';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshBasicMaterial ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = {};\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.0;\n\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.9;\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_clearcoat';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.clearcoat === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.clearcoatFactor = material.clearcoat;\n\n\t\tif ( material.clearcoatMap ) {\n\n\t\t\tconst clearcoatMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.clearcoatMap ),\n\t\t\t\ttexCoord: material.clearcoatMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatMapDef, material.clearcoatMap );\n\t\t\textensionDef.clearcoatTexture = clearcoatMapDef;\n\n\t\t}\n\n\t\textensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness;\n\n\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\tconst clearcoatRoughnessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.clearcoatRoughnessMap ),\n\t\t\t\ttexCoord: material.clearcoatRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatRoughnessMapDef, material.clearcoatRoughnessMap );\n\t\t\textensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\tconst clearcoatNormalMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.clearcoatNormalMap ),\n\t\t\t\ttexCoord: material.clearcoatNormalMap.channel\n\t\t\t};\n\n\t\t\tif ( material.clearcoatNormalScale.x !== 1 ) clearcoatNormalMapDef.scale = material.clearcoatNormalScale.x;\n\n\t\t\twriter.applyTextureTransform( clearcoatNormalMapDef, material.clearcoatNormalMap );\n\t\t\textensionDef.clearcoatNormalTexture = clearcoatNormalMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_dispersion';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.dispersion === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.dispersion = material.dispersion;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_iridescence';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.iridescence === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.iridescenceFactor = material.iridescence;\n\n\t\tif ( material.iridescenceMap ) {\n\n\t\t\tconst iridescenceMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.iridescenceMap ),\n\t\t\t\ttexCoord: material.iridescenceMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceMapDef, material.iridescenceMap );\n\t\t\textensionDef.iridescenceTexture = iridescenceMapDef;\n\n\t\t}\n\n\t\textensionDef.iridescenceIor = material.iridescenceIOR;\n\t\textensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[ 0 ];\n\t\textensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[ 1 ];\n\n\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\tconst iridescenceThicknessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.iridescenceThicknessMap ),\n\t\t\t\ttexCoord: material.iridescenceThicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceThicknessMapDef, material.iridescenceThicknessMap );\n\t\t\textensionDef.iridescenceThicknessTexture = iridescenceThicknessMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_transmission';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.transmissionFactor = material.transmission;\n\n\t\tif ( material.transmissionMap ) {\n\n\t\t\tconst transmissionMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.transmissionMap ),\n\t\t\t\ttexCoord: material.transmissionMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( transmissionMapDef, material.transmissionMap );\n\t\t\textensionDef.transmissionTexture = transmissionMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_volume';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.thicknessFactor = material.thickness;\n\n\t\tif ( material.thicknessMap ) {\n\n\t\t\tconst thicknessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.thicknessMap ),\n\t\t\t\ttexCoord: material.thicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( thicknessMapDef, material.thicknessMap );\n\t\t\textensionDef.thicknessTexture = thicknessMapDef;\n\n\t\t}\n\n\t\tif ( material.attenuationDistance !== Infinity ) {\n\n\t\t\textensionDef.attenuationDistance = material.attenuationDistance;\n\n\t\t}\n\n\t\textensionDef.attenuationColor = material.attenuationColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_ior';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.ior === 1.5 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.ior = material.ior;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_specular';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || ( material.specularIntensity === 1.0 &&\n\t\t material.specularColor.equals( DEFAULT_SPECULAR_COLOR ) &&\n\t\t ! material.specularIntensityMap && ! material.specularColorMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tconst specularIntensityMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.specularIntensityMap ),\n\t\t\t\ttexCoord: material.specularIntensityMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularIntensityMapDef, material.specularIntensityMap );\n\t\t\textensionDef.specularTexture = specularIntensityMapDef;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tconst specularColorMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.specularColorMap ),\n\t\t\t\ttexCoord: material.specularColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularColorMapDef, material.specularColorMap );\n\t\t\textensionDef.specularColorTexture = specularColorMapDef;\n\n\t\t}\n\n\t\textensionDef.specularFactor = material.specularIntensity;\n\t\textensionDef.specularColorFactor = material.specularColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_sheen';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.sheen == 0.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\tconst sheenRoughnessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.sheenRoughnessMap ),\n\t\t\t\ttexCoord: material.sheenRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenRoughnessMapDef, material.sheenRoughnessMap );\n\t\t\textensionDef.sheenRoughnessTexture = sheenRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( material.sheenColorMap ) {\n\n\t\t\tconst sheenColorMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.sheenColorMap ),\n\t\t\t\ttexCoord: material.sheenColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenColorMapDef, material.sheenColorMap );\n\t\t\textensionDef.sheenColorTexture = sheenColorMapDef;\n\n\t\t}\n\n\t\textensionDef.sheenRoughnessFactor = material.sheenRoughness;\n\t\textensionDef.sheenColorFactor = material.sheenColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Anisotropy Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_anisotropy';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.anisotropy == 0.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.anisotropyMap ) {\n\n\t\t\tconst anisotropyMapDef = { index: await writer.processTextureAsync( material.anisotropyMap ) };\n\t\t\twriter.applyTextureTransform( anisotropyMapDef, material.anisotropyMap );\n\t\t\textensionDef.anisotropyTexture = anisotropyMapDef;\n\n\t\t}\n\n\t\textensionDef.anisotropyStrength = material.anisotropy;\n\t\textensionDef.anisotropyRotation = material.anisotropyRotation;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_emissive_strength';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || material.emissiveIntensity === 1.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.emissiveStrength = material.emissiveIntensity;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_materials_bump';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || (\n\t\t material.bumpScale === 1 &&\n\t\t ! material.bumpMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tconst bumpMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.bumpMap ),\n\t\t\t\ttexCoord: material.bumpMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( bumpMapDef, material.bumpMap );\n\t\t\textensionDef.bumpTexture = bumpMapDef;\n\n\t\t}\n\n\t\textensionDef.bumpFactor = material.bumpScale;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_mesh_gpu_instancing';\n\n\t}\n\n\twriteNode( object, nodeDef ) {\n\n\t\tif ( ! object.isInstancedMesh ) return;\n\n\t\tconst writer = this.writer;\n\n\t\tconst mesh = object;\n\n\t\tconst translationAttr = new Float32Array( mesh.count * 3 );\n\t\tconst rotationAttr = new Float32Array( mesh.count * 4 );\n\t\tconst scaleAttr = new Float32Array( mesh.count * 3 );\n\n\t\tconst matrix = new Matrix4();\n\t\tconst position = new Vector3();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3();\n\n\t\tfor ( let i = 0; i < mesh.count; i ++ ) {\n\n\t\t\tmesh.getMatrixAt( i, matrix );\n\t\t\tmatrix.decompose( position, quaternion, scale );\n\n\t\t\tposition.toArray( translationAttr, i * 3 );\n\t\t\tquaternion.toArray( rotationAttr, i * 4 );\n\t\t\tscale.toArray( scaleAttr, i * 3 );\n\n\t\t}\n\n\t\tconst attributes = {\n\t\t\tTRANSLATION: writer.processAccessor( new BufferAttribute( translationAttr, 3 ) ),\n\t\t\tROTATION: writer.processAccessor( new BufferAttribute( rotationAttr, 4 ) ),\n\t\t\tSCALE: writer.processAccessor( new BufferAttribute( scaleAttr, 3 ) ),\n\t\t};\n\n\t\tif ( mesh.instanceColor )\n\t\t\tattributes._COLOR_0 = writer.processAccessor( mesh.instanceColor );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { attributes };\n\n\t\twriter.extensionsUsed[ this.name ] = true;\n\t\twriter.extensionsRequired[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Static utility functions\n */\nGLTFExporter.Utils = {\n\n\tinsertKeyframe: function ( track, time ) {\n\n\t\tconst tolerance = 0.001; // 1ms\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = new track.TimeBufferType( track.times.length + 1 );\n\t\tconst values = new track.ValueBufferType( track.values.length + valueSize );\n\t\tconst interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) );\n\n\t\tlet index;\n\n\t\tif ( track.times.length === 0 ) {\n\n\t\t\ttimes[ 0 ] = time;\n\n\t\t\tfor ( let i = 0; i < valueSize; i ++ ) {\n\n\t\t\t\tvalues[ i ] = 0;\n\n\t\t\t}\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time < track.times[ 0 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0;\n\n\t\t\ttimes[ 0 ] = time;\n\t\t\ttimes.set( track.times, 1 );\n\n\t\t\tvalues.set( interpolant.evaluate( time ), 0 );\n\t\t\tvalues.set( track.values, valueSize );\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time > track.times[ track.times.length - 1 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) {\n\n\t\t\t\treturn track.times.length - 1;\n\n\t\t\t}\n\n\t\t\ttimes[ times.length - 1 ] = time;\n\t\t\ttimes.set( track.times, 0 );\n\n\t\t\tvalues.set( track.values, 0 );\n\t\t\tvalues.set( interpolant.evaluate( time ), track.values.length );\n\n\t\t\tindex = times.length - 1;\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < track.times.length; i ++ ) {\n\n\t\t\t\tif ( Math.abs( track.times[ i ] - time ) < tolerance ) return i;\n\n\t\t\t\tif ( track.times[ i ] < time && track.times[ i + 1 ] > time ) {\n\n\t\t\t\t\ttimes.set( track.times.slice( 0, i + 1 ), 0 );\n\t\t\t\t\ttimes[ i + 1 ] = time;\n\t\t\t\t\ttimes.set( track.times.slice( i + 1 ), i + 2 );\n\n\t\t\t\t\tvalues.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 );\n\t\t\t\t\tvalues.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize );\n\t\t\t\t\tvalues.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize );\n\n\t\t\t\t\tindex = i + 1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttrack.times = times;\n\t\ttrack.values = values;\n\n\t\treturn index;\n\n\t},\n\n\tmergeMorphTargetTracks: function ( clip, root ) {\n\n\t\tconst tracks = [];\n\t\tconst mergedTracks = {};\n\t\tconst sourceTracks = clip.tracks;\n\n\t\tfor ( let i = 0; i < sourceTracks.length; ++ i ) {\n\n\t\t\tlet sourceTrack = sourceTracks[ i ];\n\t\t\tconst sourceTrackBinding = PropertyBinding.parseTrackName( sourceTrack.name );\n\t\t\tconst sourceTrackNode = PropertyBinding.findNode( root, sourceTrackBinding.nodeName );\n\n\t\t\tif ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) {\n\n\t\t\t\t// Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is.\n\t\t\t\ttracks.push( sourceTrack );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete\n\t\t\t\t&& sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) {\n\n\t\t\t\tif ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\t\t// This should never happen, because glTF morph target animations\n\t\t\t\t\t// affect all targets already.\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' );\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' );\n\n\t\t\t\tsourceTrack = sourceTrack.clone();\n\t\t\t\tsourceTrack.setInterpolation( InterpolateLinear );\n\n\t\t\t}\n\n\t\t\tconst targetCount = sourceTrackNode.morphTargetInfluences.length;\n\t\t\tconst targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ];\n\n\t\t\tif ( targetIndex === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex );\n\n\t\t\t}\n\n\t\t\tlet mergedTrack;\n\n\t\t\t// If this is the first time we've seen this object, create a new\n\t\t\t// track to store merged keyframe data for each morph target.\n\t\t\tif ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) {\n\n\t\t\t\tmergedTrack = sourceTrack.clone();\n\n\t\t\t\tconst values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length );\n\n\t\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\t\tvalues[ j * targetCount + targetIndex ] = mergedTrack.values[ j ];\n\n\t\t\t\t}\n\n\t\t\t\t// We need to take into consideration the intended target node\n\t\t\t\t// of our original un-merged morphTarget animation.\n\t\t\t\tmergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences';\n\t\t\t\tmergedTrack.values = values;\n\n\t\t\t\tmergedTracks[ sourceTrackNode.uuid ] = mergedTrack;\n\t\t\t\ttracks.push( mergedTrack );\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) );\n\n\t\t\tmergedTrack = mergedTracks[ sourceTrackNode.uuid ];\n\n\t\t\t// For every existing keyframe of the merged track, write a (possibly\n\t\t\t// interpolated) value from the source track.\n\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\tmergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] );\n\n\t\t\t}\n\n\t\t\t// For every existing keyframe of the source track, write a (possibly\n\t\t\t// new) keyframe to the merged track. Values from the previous loop may\n\t\t\t// be written again, but keyframes are de-duplicated.\n\t\t\tfor ( let j = 0; j < sourceTrack.times.length; j ++ ) {\n\n\t\t\t\tconst keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] );\n\t\t\t\tmergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\treturn clip;\n\n\t},\n\n\ttoFloat32BufferAttribute: function ( srcAttribute ) {\n\n\t\tconst dstAttribute = new BufferAttribute( new Float32Array( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );\n\n\t\tif ( ! srcAttribute.normalized && ! srcAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\tdstAttribute.array.set( srcAttribute.array );\n\n\t\t\treturn dstAttribute;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = srcAttribute.count; i < il; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < srcAttribute.itemSize; j ++ ) {\n\n\t\t\t\tdstAttribute.setComponent( i, j, srcAttribute.getComponent( i, j ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn dstAttribute;\n\n\t}\n\n};\n\nexport { GLTFExporter };\n","/* @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @param object {THREE.Object3D}\n * @return {boolean}\n */\nconst compatibleObject = (object) => {\n // @TODO: Need properer variantMaterials format validation?\n return object.material !==\n undefined && // easier than (!object.isMesh && !object.isLine &&\n // !object.isPoints)\n object.userData && // just in case\n object.userData.variantMaterials &&\n // Is this line costly?\n !!Array\n .from(object.userData.variantMaterials\n .values())\n .filter(m => compatibleMaterial(m.material));\n};\n/**\n * @param material {THREE.Material}\n * @return {boolean}\n */\nconst compatibleMaterial = (material) => {\n // @TODO: support multi materials?\n return material && material.isMaterial && !Array.isArray(material);\n};\nexport default class GLTFExporterMaterialsVariantsExtension {\n constructor(writer) {\n this.writer = writer;\n this.name = 'KHR_materials_variants';\n this.variantNames = [];\n }\n beforeParse(objects) {\n // Find all variant names and store them to the table\n const variantNameSet = new Set();\n const addVariantNames = (o) => {\n if (!compatibleObject(o)) {\n return;\n }\n const variantMaterials = o.userData.variantMaterials;\n const variantDataMap = o.userData.variantData;\n for (const [variantName, variantData] of variantDataMap) {\n const variantMaterial = variantMaterials.get(variantData.index);\n // Ignore unloaded variant materials\n if (variantMaterial && compatibleMaterial(variantMaterial.material)) {\n variantNameSet.add(variantName);\n }\n }\n };\n if (Array.isArray(objects)) {\n for (const object of objects) {\n object.traverse(addVariantNames);\n }\n }\n else {\n objects.traverse(addVariantNames);\n }\n // We may want to sort?\n variantNameSet.forEach(name => this.variantNames.push(name));\n }\n async writeMesh(mesh, meshDef) {\n if (!compatibleObject(mesh)) {\n return;\n }\n const userData = mesh.userData;\n const variantMaterials = userData.variantMaterials;\n const variantDataMap = userData.variantData;\n const mappingTable = new Map();\n // Removes gaps in the variant indices list (caused by deleting variants).\n const reIndexedVariants = new Map();\n const variants = Array.from(variantDataMap.values()).sort((a, b) => {\n return a.index - b.index;\n });\n for (const [i, variantData] of variants.entries()) {\n reIndexedVariants.set(variantData.index, i);\n }\n for (const variantData of variantDataMap.values()) {\n const variantInstance = variantMaterials.get(variantData.index);\n if (!variantInstance || !compatibleMaterial(variantInstance.material)) {\n continue;\n }\n const materialIndex = await this.writer.processMaterialAsync(variantInstance.material);\n if (!mappingTable.has(materialIndex)) {\n mappingTable.set(materialIndex, { material: materialIndex, variants: [] });\n }\n mappingTable.get(materialIndex).variants.push(reIndexedVariants.get(variantData.index));\n }\n const mappingsDef = Array.from(mappingTable.values())\n .map((m => { return m.variants.sort((a, b) => a - b) && m; }))\n .sort((a, b) => a.material - b.material);\n if (mappingsDef.length === 0) {\n return;\n }\n const originalMaterialIndex = compatibleMaterial(userData.originalMaterial) ?\n await this.writer.processMaterialAsync(userData.originalMaterial) :\n -1;\n for (const primitiveDef of meshDef.primitives) {\n // Override primitiveDef.material with original material.\n if (originalMaterialIndex >= 0) {\n primitiveDef.material = originalMaterialIndex;\n }\n primitiveDef.extensions = primitiveDef.extensions || {};\n primitiveDef.extensions[this.name] = { mappings: mappingsDef };\n }\n }\n afterParse() {\n if (this.variantNames.length === 0) {\n return;\n }\n const root = this.writer.json;\n root.extensions = root.extensions || {};\n const variantsDef = this.variantNames.map(n => {\n return { name: n };\n });\n root.extensions[this.name] = { variants: variantsDef };\n this.writer.extensionsUsed[this.name] = true;\n }\n}\n//# sourceMappingURL=VariantMaterialExporterPlugin.js.map","import {\n\tDirectionalLight,\n\tGroup,\n\tLightProbe,\n\tWebGLCubeRenderTarget\n} from 'three';\n\nclass SessionLightProbe {\n\n\tconstructor( xrLight, renderer, lightProbe, environmentEstimation, estimationStartCallback ) {\n\n\t\tthis.xrLight = xrLight;\n\t\tthis.renderer = renderer;\n\t\tthis.lightProbe = lightProbe;\n\t\tthis.xrWebGLBinding = null;\n\t\tthis.estimationStartCallback = estimationStartCallback;\n\t\tthis.frameCallback = this.onXRFrame.bind( this );\n\n\t\tconst session = renderer.xr.getSession();\n\n\t\t// If the XRWebGLBinding class is available then we can also query an\n\t\t// estimated reflection cube map.\n\t\tif ( environmentEstimation && 'XRWebGLBinding' in window ) {\n\n\t\t\t// This is the simplest way I know of to initialize a WebGL cubemap in Three.\n\t\t\tconst cubeRenderTarget = new WebGLCubeRenderTarget( 16 );\n\t\t\txrLight.environment = cubeRenderTarget.texture;\n\n\t\t\tconst gl = renderer.getContext();\n\n\t\t\t// Ensure that we have any extensions needed to use the preferred cube map format.\n\t\t\tswitch ( session.preferredReflectionFormat ) {\n\n\t\t\t\tcase 'srgba8':\n\t\t\t\t\tgl.getExtension( 'EXT_sRGB' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rgba16f':\n\t\t\t\t\tgl.getExtension( 'OES_texture_half_float' );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.xrWebGLBinding = new XRWebGLBinding( session, gl );\n\n\t\t\tthis.lightProbe.addEventListener( 'reflectionchange', () => {\n\n\t\t\t\tthis.updateReflection();\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// Start monitoring the XR animation frame loop to look for lighting\n\t\t// estimation changes.\n\t\tsession.requestAnimationFrame( this.frameCallback );\n\n\t}\n\n\tupdateReflection() {\n\n\t\tconst textureProperties = this.renderer.properties.get( this.xrLight.environment );\n\n\t\tif ( textureProperties ) {\n\n\t\t\tconst cubeMap = this.xrWebGLBinding.getReflectionCubeMap( this.lightProbe );\n\n\t\t\tif ( cubeMap ) {\n\n\t\t\t\ttextureProperties.__webglTexture = cubeMap;\n\n\t\t\t\tthis.xrLight.environment.needsPMREMUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tonXRFrame( time, xrFrame ) {\n\n\t\t// If either this object or the XREstimatedLight has been destroyed, stop\n\t\t// running the frame loop.\n\t\tif ( ! this.xrLight ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst session = xrFrame.session;\n\t\tsession.requestAnimationFrame( this.frameCallback );\n\n\t\tconst lightEstimate = xrFrame.getLightEstimate( this.lightProbe );\n\t\tif ( lightEstimate ) {\n\n\t\t\t// We can copy the estimate's spherical harmonics array directly into the light probe.\n\t\t\tthis.xrLight.lightProbe.sh.fromArray( lightEstimate.sphericalHarmonicsCoefficients );\n\t\t\tthis.xrLight.lightProbe.intensity = 1.0;\n\n\t\t\t// For the directional light we have to normalize the color and set the scalar as the\n\t\t\t// intensity, since WebXR can return color values that exceed 1.0.\n\t\t\tconst intensityScalar = Math.max( 1.0,\n\t\t\t\tMath.max( lightEstimate.primaryLightIntensity.x,\n\t\t\t\t\tMath.max( lightEstimate.primaryLightIntensity.y,\n\t\t\t\t\t\tlightEstimate.primaryLightIntensity.z ) ) );\n\n\t\t\tthis.xrLight.directionalLight.color.setRGB(\n\t\t\t\tlightEstimate.primaryLightIntensity.x / intensityScalar,\n\t\t\t\tlightEstimate.primaryLightIntensity.y / intensityScalar,\n\t\t\t\tlightEstimate.primaryLightIntensity.z / intensityScalar );\n\t\t\tthis.xrLight.directionalLight.intensity = intensityScalar;\n\t\t\tthis.xrLight.directionalLight.position.copy( lightEstimate.primaryLightDirection );\n\n\t\t\tif ( this.estimationStartCallback ) {\n\n\t\t\t\tthis.estimationStartCallback();\n\t\t\t\tthis.estimationStartCallback = null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.xrLight = null;\n\t\tthis.renderer = null;\n\t\tthis.lightProbe = null;\n\t\tthis.xrWebGLBinding = null;\n\n\t}\n\n}\n\nexport class XREstimatedLight extends Group {\n\n\tconstructor( renderer, environmentEstimation = true ) {\n\n\t\tsuper();\n\n\t\tthis.lightProbe = new LightProbe();\n\t\tthis.lightProbe.intensity = 0;\n\t\tthis.add( this.lightProbe );\n\n\t\tthis.directionalLight = new DirectionalLight();\n\t\tthis.directionalLight.intensity = 0;\n\t\tthis.add( this.directionalLight );\n\n\t\t// Will be set to a cube map in the SessionLightProbe if environment estimation is\n\t\t// available and requested.\n\t\tthis.environment = null;\n\n\t\tlet sessionLightProbe = null;\n\t\tlet estimationStarted = false;\n\t\trenderer.xr.addEventListener( 'sessionstart', () => {\n\n\t\t\tconst session = renderer.xr.getSession();\n\n\t\t\tif ( 'requestLightProbe' in session ) {\n\n\t\t\t\tsession.requestLightProbe( {\n\n\t\t\t\t\treflectionFormat: session.preferredReflectionFormat\n\n\t\t\t\t} ).then( ( probe ) => {\n\n\t\t\t\t\tsessionLightProbe = new SessionLightProbe( this, renderer, probe, environmentEstimation, () => {\n\n\t\t\t\t\t\testimationStarted = true;\n\n\t\t\t\t\t\t// Fired to indicate that the estimated lighting values are now being updated.\n\t\t\t\t\t\tthis.dispatchEvent( { type: 'estimationstart' } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderer.xr.addEventListener( 'sessionend', () => {\n\n\t\t\tif ( sessionLightProbe ) {\n\n\t\t\t\tsessionLightProbe.dispose();\n\t\t\t\tsessionLightProbe = null;\n\n\t\t\t}\n\n\t\t\tif ( estimationStarted ) {\n\n\t\t\t\t// Fired to indicate that the estimated lighting values are no longer being updated.\n\t\t\t\tthis.dispatchEvent( { type: 'estimationend' } );\n\n\t\t\t}\n\n\t\t} );\n\n\t\t// Done inline to provide access to sessionLightProbe.\n\t\tthis.dispose = () => {\n\n\t\t\tif ( sessionLightProbe ) {\n\n\t\t\t\tsessionLightProbe.dispose();\n\t\t\t\tsessionLightProbe = null;\n\n\t\t\t}\n\n\t\t\tthis.remove( this.lightProbe );\n\t\t\tthis.lightProbe = null;\n\n\t\t\tthis.remove( this.directionalLight );\n\t\t\tthis.directionalLight = null;\n\n\t\t\tthis.environment = null;\n\n\t\t};\n\n\t}\n\n}\n","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const SETTLING_TIME = 10000; // plenty long enough\nconst MIN_DECAY_MILLISECONDS = 0.001;\nexport const DECAY_MILLISECONDS = 50;\n/**\n * The Damper class is a generic second-order critically damped system that does\n * one linear step of the desired length of time. The only parameter is\n * DECAY_MILLISECONDS. This common parameter makes all states converge at the\n * same rate regardless of scale. xNormalization is a number to provide the\n * rough scale of x, such that NIL_SPEED clamping also happens at roughly the\n * same convergence for all states.\n */\nexport class Damper {\n constructor(decayMilliseconds = DECAY_MILLISECONDS) {\n this.velocity = 0;\n this.naturalFrequency = 0;\n this.setDecayTime(decayMilliseconds);\n }\n setDecayTime(decayMilliseconds) {\n this.naturalFrequency =\n 1 / Math.max(MIN_DECAY_MILLISECONDS, decayMilliseconds);\n }\n update(x, xGoal, timeStepMilliseconds, xNormalization) {\n const nilSpeed = 0.0002 * this.naturalFrequency;\n if (x == null || xNormalization === 0) {\n return xGoal;\n }\n if (x === xGoal && this.velocity === 0) {\n return xGoal;\n }\n if (timeStepMilliseconds < 0) {\n return x;\n }\n // Exact solution to a critically damped second-order system, where:\n // acceleration = this.naturalFrequency * this.naturalFrequency * (xGoal\n // - x) - 2 * this.naturalFrequency * this.velocity;\n const deltaX = (x - xGoal);\n const intermediateVelocity = this.velocity + this.naturalFrequency * deltaX;\n const intermediateX = deltaX + timeStepMilliseconds * intermediateVelocity;\n const decay = Math.exp(-this.naturalFrequency * timeStepMilliseconds);\n const newVelocity = (intermediateVelocity - this.naturalFrequency * intermediateX) * decay;\n const acceleration = -this.naturalFrequency * (newVelocity + intermediateVelocity * decay);\n if (Math.abs(newVelocity) < nilSpeed * Math.abs(xNormalization) &&\n acceleration * deltaX >= 0) {\n // This ensures the controls settle and stop calling this function instead\n // of asymptotically approaching their goal.\n this.velocity = 0;\n return xGoal;\n }\n else {\n this.velocity = newVelocity;\n return xGoal + intermediateX * decay;\n }\n }\n}\n//# sourceMappingURL=Damper.js.map","/* @license\n* Copyright 2020 Google LLC. All Rights Reserved.\n* Licensed under the Apache License, Version 2.0 (the 'License');\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an 'AS IS' BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\nimport { BoxGeometry, BufferGeometry, DoubleSide, Float32BufferAttribute, Mesh, MeshBasicMaterial, PlaneGeometry, Vector2, Vector3, Color, AdditiveBlending, NormalBlending } from 'three';\nimport { Damper } from './Damper.js';\n// Enhanced configuration for dynamic sizing and visual design\nconst CONFIG = {\n // Dynamic sizing - slightly bigger\n MIN_TOUCH_AREA: 0.05, // minimum touch area\n BASE_RADIUS: 0.15, // base radius\n LINE_WIDTH: 0.02, // line width\n SEGMENTS: 16, // segments for smoother curves\n DELTA_PHI: Math.PI / (2 * 16),\n // Enhanced visual design with more vibrant colors\n COLORS: {\n EDGE_FALLOFF: new Color(0.98, 0.98, 0.98), // Brighter light gray\n EDGE_CUTOFF: new Color(0.8, 0.8, 0.8), // Brighter medium gray\n FILL_FALLOFF: new Color(0.4, 0.4, 0.4), // Brighter dark gray\n FILL_CUTOFF: new Color(0.4, 0.4, 0.4), // Brighter dark gray\n ACTIVE_EDGE: new Color(1.0, 1.0, 1.0), // Pure white when active\n ACTIVE_FILL: new Color(0.6, 0.6, 0.6), // Brighter fill when active\n },\n // Opacity settings - now configurable\n MAX_OPACITY: 0.75,\n ACTIVE_OPACITY: 0.9,\n FILL_OPACITY_MULTIPLIER: 0.5, // Fill opacity relative to edge opacity\n INTERACTIVE_OPACITY_MULTIPLIER: 1.2, // Edge opacity multiplier when interactive\n // Distance-based scaling (similar to Footprint)\n MIN_DISTANCE: 0.5,\n MAX_DISTANCE: 10.0,\n BASE_SCALE: 1.0,\n DISTANCE_SCALE_FACTOR: 0.3,\n // Animation timing - optimized for performance\n FADE_IN_DURATION: 0.12,\n FADE_OUT_DURATION: 0.12,\n SIZE_UPDATE_DURATION: 0.05,\n COLOR_LERP_FACTOR: 0.15, // Color transition speed\n // Screen space scaling - now configurable\n SCREEN_SPACE_SCALE: 1.2, // Scale factor for screen space mode\n // Performance optimization thresholds\n SIZE_UPDATE_THRESHOLD: 0.001, // Minimum size change to trigger geometry update\n GEOMETRY_UPDATE_DEBOUNCE: 100, // ms to debounce geometry updates\n};\nconst vector2 = new Vector2();\n/**\n* Adds a quarter-annulus of vertices to the array, centered on cornerX,\n* cornerY.\n*/\nconst addCorner = (vertices, cornerX, cornerY, radius, lineWidth) => {\n let phi = cornerX > 0 ? (cornerY > 0 ? 0 : -Math.PI / 2) :\n (cornerY > 0 ? Math.PI / 2 : Math.PI);\n for (let i = 0; i <= CONFIG.SEGMENTS; ++i) {\n vertices.push(cornerX + (radius - lineWidth) * Math.cos(phi), cornerY + (radius - lineWidth) * Math.sin(phi), 0, cornerX + radius * Math.cos(phi), cornerY + radius * Math.sin(phi), 0);\n phi += CONFIG.DELTA_PHI;\n }\n};\n/**\n* Enhanced PlacementBox that dynamically updates based on model size changes\n* and features improved visual design inspired by Footprint.\n*/\nexport class PlacementBox extends Mesh {\n constructor(scene, side) {\n const geometry = new BufferGeometry();\n super(geometry);\n this.shadowHeight = 0;\n // Visual state\n this.isActive = false;\n this.isHovered = false;\n // Performance optimization\n this.lastGeometryUpdateTime = 0;\n this.needsGeometryUpdate = false;\n this.scene = scene;\n this.side = side;\n this.currentSize = new Vector3();\n this.goalSize = new Vector3();\n this.sizeDamper = new Damper();\n // Initialize with current scene size\n this.updateSizeFromScene();\n // Create enhanced materials with better visual properties\n this.edgeMaterial = new MeshBasicMaterial({\n color: CONFIG.COLORS.EDGE_FALLOFF,\n transparent: true,\n opacity: 0,\n side: DoubleSide,\n depthWrite: false, // Better transparency handling\n blending: AdditiveBlending // Subtle glow effect\n });\n this.fillMaterial = new MeshBasicMaterial({\n color: CONFIG.COLORS.FILL_FALLOFF,\n transparent: true,\n opacity: 0,\n side: DoubleSide,\n depthWrite: false, // Better transparency handling\n blending: NormalBlending\n });\n this.material = this.edgeMaterial;\n this.goalOpacity = 0;\n this.opacityDamper = new Damper();\n // Create hit testing meshes\n this.createHitMeshes();\n // Position based on scene\n this.updatePositionFromScene();\n // Add to scene\n scene.target.add(this);\n scene.target.add(this.hitBox);\n this.offsetHeight = 0;\n }\n updateSizeFromScene() {\n const { size } = this.scene;\n this.goalSize.copy(size);\n // Apply proportional minimum size constraints\n // For small models, use a smaller minimum size\n const modelDiagonal = Math.sqrt(size.x * size.x + size.z * size.z);\n const proportionalMinSize = Math.max(CONFIG.MIN_TOUCH_AREA, modelDiagonal * 0.4); // Increased from 0.3 to 0.4\n // Only apply minimum size if the model is very small\n if (this.goalSize.x < proportionalMinSize) {\n this.goalSize.x = proportionalMinSize;\n }\n if (this.goalSize.z < proportionalMinSize) {\n this.goalSize.z = proportionalMinSize;\n }\n // Update geometry with new size\n this.updateGeometry();\n }\n updateGeometry() {\n const geometry = this.geometry;\n const triangles = [];\n const vertices = [];\n const x = this.goalSize.x / 2;\n const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2;\n // Use dynamic radius based on size - slightly bigger for better visibility\n const modelSize = Math.min(x, y);\n const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2); // Increased multipliers\n const lineWidth = Math.max(CONFIG.LINE_WIDTH * 0.7, modelSize * 0.025); // Increased line width\n addCorner(vertices, x, y, radius, lineWidth);\n addCorner(vertices, -x, y, radius, lineWidth);\n addCorner(vertices, -x, -y, radius, lineWidth);\n addCorner(vertices, x, -y, radius, lineWidth);\n const numVertices = vertices.length / 3;\n for (let i = 0; i < numVertices - 2; i += 2) {\n triangles.push(i, i + 1, i + 3, i, i + 3, i + 2);\n }\n const i = numVertices - 2;\n triangles.push(i, i + 1, 1, i, 1, 0);\n geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n geometry.setIndex(triangles);\n geometry.computeBoundingSphere();\n }\n createHitMeshes() {\n const x = this.goalSize.x / 2;\n const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2;\n const modelSize = Math.min(x, y);\n const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2);\n this.hitPlane = new Mesh(new PlaneGeometry(2 * (x + radius), 2 * (y + radius)));\n this.hitPlane.visible = false;\n this.hitPlane.material.side = DoubleSide;\n this.add(this.hitPlane);\n this.hitBox = new Mesh(new BoxGeometry(this.goalSize.x + 2 * radius, this.goalSize.y + radius, this.goalSize.z + 2 * radius));\n this.hitBox.visible = false;\n this.hitBox.material.side = DoubleSide;\n this.add(this.hitBox);\n }\n updatePositionFromScene() {\n const { boundingBox } = this.scene;\n boundingBox.getCenter(this.position);\n // Reset rotation to ensure proper orientation\n this.rotation.set(0, 0, 0);\n switch (this.side) {\n case 'bottom':\n // Ensure the placement box is horizontal for floor placement\n this.rotateX(-Math.PI / 2);\n this.shadowHeight = boundingBox.min.y;\n this.position.y = this.shadowHeight;\n break;\n case 'back':\n // For wall placement, keep it vertical but ensure proper orientation\n this.shadowHeight = boundingBox.min.z;\n this.position.z = this.shadowHeight;\n break;\n case 'top':\n // move placement box to the top of the model\n this.rotateX(-Math.PI / 2);\n this.shadowHeight = boundingBox.max.y;\n this.position.y = this.shadowHeight;\n break;\n }\n // Update hit box position with proper offset\n if (this.hitBox) {\n const offset = this.side === 'back' ?\n (this.goalSize.y + CONFIG.BASE_RADIUS) / 2 :\n (this.goalSize.y + CONFIG.BASE_RADIUS) / 2;\n this.hitBox.position.y = offset + boundingBox.min.y;\n }\n }\n /**\n * Update the placement box when model size changes\n * Optimized to batch updates and reduce performance impact\n */\n updateFromModelChanges() {\n this.updateSizeFromScene();\n this.updatePositionFromScene();\n // Force immediate geometry update for model changes\n this.updateGeometry();\n this.updateHitMeshes();\n this.ensureProperOrientation();\n // Reset performance tracking\n this.needsGeometryUpdate = false;\n this.lastGeometryUpdateTime = performance.now();\n }\n /**\n * Ensure the placement box is properly oriented for the current mode\n */\n ensureProperOrientation() {\n // Force proper orientation based on side\n if (this.side === 'bottom') {\n // For floor placement, ensure it's horizontal\n this.rotation.x = -Math.PI / 2;\n this.rotation.y = 0;\n this.rotation.z = 0;\n }\n else if (this.side === 'back') {\n // For wall placement, ensure it's vertical\n this.rotation.x = 0;\n this.rotation.y = 0;\n this.rotation.z = 0;\n }\n }\n /**\n * Set screen space mode to adjust positioning for mobile AR\n */\n setScreenSpaceMode(isScreenSpace) {\n if (isScreenSpace) {\n // In screen space mode, ensure the placement box is more visible\n // and properly positioned for touch interaction\n this.scale.set(CONFIG.SCREEN_SPACE_SCALE, CONFIG.SCREEN_SPACE_SCALE, CONFIG.SCREEN_SPACE_SCALE);\n }\n else {\n // Reset scale for world space mode\n this.scale.set(1.0, 1.0, 1.0);\n }\n }\n updateHitMeshes() {\n if (this.hitPlane && this.hitBox) {\n const x = this.goalSize.x / 2;\n const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2;\n const modelSize = Math.min(x, y);\n const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2);\n // Update hit plane geometry\n const hitPlaneGeometry = new PlaneGeometry(2 * (x + radius), 2 * (y + radius));\n this.hitPlane.geometry.dispose();\n this.hitPlane.geometry = hitPlaneGeometry;\n // Update hit box geometry\n const hitBoxGeometry = new BoxGeometry(this.goalSize.x + 2 * radius, this.goalSize.y + radius, this.goalSize.z + 2 * radius);\n this.hitBox.geometry.dispose();\n this.hitBox.geometry = hitBoxGeometry;\n }\n }\n /**\n * Set interaction state for visual feedback\n */\n setInteractionState(isActive, isHovered = false) {\n this.isActive = isActive;\n this.isHovered = isHovered;\n this.updateVisualState();\n }\n updateVisualState() {\n let targetColor;\n let targetFillColor;\n if (this.isActive) {\n targetColor = CONFIG.COLORS.ACTIVE_EDGE;\n targetFillColor = CONFIG.COLORS.ACTIVE_FILL;\n }\n else if (this.isHovered) {\n targetColor = CONFIG.COLORS.EDGE_FALLOFF;\n targetFillColor = CONFIG.COLORS.FILL_FALLOFF;\n }\n else {\n targetColor = CONFIG.COLORS.EDGE_CUTOFF;\n targetFillColor = CONFIG.COLORS.FILL_CUTOFF;\n }\n // Smoothly transition colors with configurable response speed\n this.edgeMaterial.color.lerp(targetColor, CONFIG.COLOR_LERP_FACTOR);\n this.fillMaterial.color.lerp(targetFillColor, CONFIG.COLOR_LERP_FACTOR);\n }\n /**\n * Apply distance-based scaling\n */\n applyDistanceScaling(cameraPosition) {\n const distanceToCamera = cameraPosition.distanceTo(this.position);\n const clampedDistance = Math.max(CONFIG.MIN_DISTANCE, Math.min(CONFIG.MAX_DISTANCE, distanceToCamera));\n const scaleFactor = CONFIG.BASE_SCALE +\n (clampedDistance - CONFIG.MIN_DISTANCE) * CONFIG.DISTANCE_SCALE_FACTOR;\n this.scale.set(scaleFactor, scaleFactor, scaleFactor);\n }\n /**\n * Get the world hit position if the touch coordinates hit the box, and null\n * otherwise. Pass the scene in to get access to its raycaster.\n */\n getHit(scene, screenX, screenY) {\n vector2.set(screenX, -screenY);\n this.hitPlane.visible = true;\n const hitResult = scene.positionAndNormalFromPoint(vector2, this.hitPlane);\n this.hitPlane.visible = false;\n return hitResult == null ? null : hitResult.position;\n }\n getExpandedHit(scene, screenX, screenY) {\n this.hitPlane.scale.set(1000, 1000, 1000);\n this.hitPlane.updateMatrixWorld();\n const hitResult = this.getHit(scene, screenX, screenY);\n this.hitPlane.scale.set(1, 1, 1);\n return hitResult;\n }\n controllerIntersection(scene, controller) {\n this.hitBox.visible = true;\n const hitResult = scene.hitFromController(controller, this.hitBox);\n this.hitBox.visible = false;\n return hitResult;\n }\n /**\n * Offset the height of the box relative to the bottom of the scene. Positive\n * is up, so generally only negative values are used.\n */\n set offsetHeight(offset) {\n offset -= 0.001; // push 1 mm below shadow to avoid z-fighting\n if (this.side === 'back') {\n this.position.z = this.shadowHeight + offset;\n }\n else {\n this.position.y = this.shadowHeight + offset;\n }\n }\n get offsetHeight() {\n if (this.side === 'back') {\n return this.position.z - this.shadowHeight;\n }\n else {\n return this.position.y - this.shadowHeight;\n }\n }\n /**\n * Set the box's visibility; it will fade in and out.\n */\n set show(visible) {\n this.goalOpacity = visible ? CONFIG.MAX_OPACITY : 0;\n }\n /**\n * Call on each frame with the frame delta to fade the box.\n */\n updateOpacity(delta) {\n const material = this.material;\n const newOpacity = this.opacityDamper.update(material.opacity, this.goalOpacity, delta, 1);\n // Update both edge and fill materials with configurable visibility\n this.edgeMaterial.opacity = newOpacity;\n this.fillMaterial.opacity = newOpacity * CONFIG.FILL_OPACITY_MULTIPLIER;\n // Add subtle glow effect when active or hovered\n if (this.isActive || this.isHovered) {\n this.edgeMaterial.opacity = newOpacity * CONFIG.INTERACTIVE_OPACITY_MULTIPLIER;\n }\n this.visible = newOpacity > 0;\n }\n /**\n * Update method to be called each frame for smooth transitions\n * Optimized to reduce frequent geometry updates for better performance\n */\n update(delta, cameraPosition) {\n // Update opacity\n this.updateOpacity(delta);\n // Update size transitions with performance optimization\n if (!this.currentSize.equals(this.goalSize)) {\n const newSize = new Vector3();\n newSize.x = this.sizeDamper.update(this.currentSize.x, this.goalSize.x, delta, 1);\n newSize.y = this.sizeDamper.update(this.currentSize.y, this.goalSize.y, delta, 1);\n newSize.z = this.sizeDamper.update(this.currentSize.z, this.goalSize.z, delta, 1);\n // Check if size change is significant enough to warrant geometry update\n const sizeChange = newSize.distanceTo(this.currentSize);\n if (sizeChange > CONFIG.SIZE_UPDATE_THRESHOLD) {\n this.currentSize.copy(newSize);\n this.needsGeometryUpdate = true;\n }\n }\n // Debounce geometry updates to prevent excessive updates\n const now = performance.now();\n if (this.needsGeometryUpdate &&\n (now - this.lastGeometryUpdateTime) > CONFIG.GEOMETRY_UPDATE_DEBOUNCE) {\n this.updateGeometry();\n this.updateHitMeshes();\n this.needsGeometryUpdate = false;\n this.lastGeometryUpdateTime = now;\n }\n // Apply distance scaling if camera position is provided\n if (cameraPosition) {\n this.applyDistanceScaling(cameraPosition);\n }\n // Update visual state\n this.updateVisualState();\n }\n /**\n * Get the current size of the placement box\n */\n getSize() {\n return this.goalSize.clone();\n }\n /**\n * Call this to clean up Three's cache when you remove the box.\n */\n dispose() {\n const { geometry, material } = this.hitPlane;\n geometry.dispose();\n material.dispose();\n this.hitBox.geometry.dispose();\n this.hitBox.material.dispose();\n this.geometry.dispose();\n this.edgeMaterial.dispose();\n this.fillMaterial.dispose();\n this.hitBox.removeFromParent();\n this.removeFromParent();\n }\n}\n//# sourceMappingURL=PlacementBox.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const numberNode = (value, unit) => ({ type: 'number', number: value, unit });\n/**\n * Given a string representing a comma-separated set of CSS-like expressions,\n * parses and returns an array of ASTs that correspond to those expressions.\n *\n * Currently supported syntax includes:\n *\n * - functions (top-level and nested)\n * - calc() arithmetic operators\n * - numbers with units\n * - hexadecimal-encoded colors in 3, 6 or 8 digit form\n * - idents\n *\n * All syntax is intended to match the parsing rules and semantics of the actual\n * CSS spec as closely as possible.\n *\n * @see https://www.w3.org/TR/CSS2/\n * @see https://www.w3.org/TR/css-values-3/\n */\nexport const parseExpressions = (() => {\n const cache = {};\n const MAX_PARSE_ITERATIONS = 1000; // Arbitrarily large\n return (inputString) => {\n const cacheKey = inputString;\n if (cacheKey in cache) {\n return cache[cacheKey];\n }\n const expressions = [];\n let parseIterations = 0;\n while (inputString) {\n if (++parseIterations > MAX_PARSE_ITERATIONS) {\n // Avoid a potentially infinite loop due to typos:\n inputString = '';\n break;\n }\n const expressionParseResult = parseExpression(inputString);\n const expression = expressionParseResult.nodes[0];\n if (expression == null || expression.terms.length === 0) {\n break;\n }\n expressions.push(expression);\n inputString = expressionParseResult.remainingInput;\n }\n return cache[cacheKey] = expressions;\n };\n})();\n/**\n * Parse a single expression. For the purposes of our supported syntax, an\n * expression is the set of semantically meaningful terms that appear before the\n * next comma, or between the parens of a function invocation.\n */\nconst parseExpression = (() => {\n const IS_IDENT_RE = /^(\\-\\-|[a-z\\u0240-\\uffff])/i;\n const IS_OPERATOR_RE = /^([\\*\\+\\/]|[\\-]\\s)/i;\n const IS_EXPRESSION_END_RE = /^[\\),]/;\n const FUNCTION_ARGUMENTS_FIRST_TOKEN = '(';\n const HEX_FIRST_TOKEN = '#';\n return (inputString) => {\n const terms = [];\n while (inputString.length) {\n inputString = inputString.trim();\n if (IS_EXPRESSION_END_RE.test(inputString)) {\n break;\n }\n else if (inputString[0] === FUNCTION_ARGUMENTS_FIRST_TOKEN) {\n const { nodes, remainingInput } = parseFunctionArguments(inputString);\n inputString = remainingInput;\n terms.push({\n type: 'function',\n name: { type: 'ident', value: 'calc' },\n arguments: nodes\n });\n }\n else if (IS_IDENT_RE.test(inputString)) {\n const identParseResult = parseIdent(inputString);\n const identNode = identParseResult.nodes[0];\n inputString = identParseResult.remainingInput;\n if (inputString[0] === FUNCTION_ARGUMENTS_FIRST_TOKEN) {\n const { nodes, remainingInput } = parseFunctionArguments(inputString);\n terms.push({ type: 'function', name: identNode, arguments: nodes });\n inputString = remainingInput;\n }\n else {\n terms.push(identNode);\n }\n }\n else if (IS_OPERATOR_RE.test(inputString)) {\n // Operators are always a single character, so just pluck them out:\n terms.push({ type: 'operator', value: inputString[0] });\n inputString = inputString.slice(1);\n }\n else {\n const { nodes, remainingInput } = inputString[0] === HEX_FIRST_TOKEN ?\n parseHex(inputString) :\n parseNumber(inputString);\n // The remaining string may not have had any meaningful content. Exit\n // early if this is the case:\n if (nodes.length === 0) {\n break;\n }\n terms.push(nodes[0]);\n inputString = remainingInput;\n }\n }\n return { nodes: [{ type: 'expression', terms }], remainingInput: inputString };\n };\n})();\n/**\n * An ident is something like a function name or the keyword \"auto\".\n */\nconst parseIdent = (() => {\n const NOT_IDENT_RE = /[^a-z0-9_\\-\\u0240-\\uffff]/i;\n return (inputString) => {\n const match = inputString.match(NOT_IDENT_RE);\n const ident = match == null ? inputString : inputString.substr(0, match.index);\n const remainingInput = match == null ? '' : inputString.substr(match.index);\n return { nodes: [{ type: 'ident', value: ident }], remainingInput };\n };\n})();\n/**\n * Parses a number. A number value can be expressed with an integer or\n * non-integer syntax, and usually includes a unit (but does not strictly\n * require one for our purposes).\n */\nconst parseNumber = (() => {\n // @see https://www.w3.org/TR/css-syntax/#number-token-diagram\n const VALUE_RE = /[\\+\\-]?(\\d+[\\.]\\d+|\\d+|[\\.]\\d+)([eE][\\+\\-]?\\d+)?/;\n const UNIT_RE = /^[a-z%]+/i;\n const ALLOWED_UNITS = /^(m|mm|cm|rad|deg|[%])$/;\n return (inputString) => {\n const valueMatch = inputString.match(VALUE_RE);\n const value = valueMatch == null ? '0' : valueMatch[0];\n inputString = value == null ? inputString : inputString.slice(value.length);\n const unitMatch = inputString.match(UNIT_RE);\n let unit = unitMatch != null && unitMatch[0] !== '' ? unitMatch[0] : null;\n const remainingInput = unitMatch == null ? inputString : inputString.slice(unit.length);\n if (unit != null && !ALLOWED_UNITS.test(unit)) {\n unit = null;\n }\n return {\n nodes: [{\n type: 'number',\n number: parseFloat(value) || 0,\n unit: unit\n }],\n remainingInput\n };\n };\n})();\n/**\n * Parses a hexadecimal-encoded color in 3, 6 or 8 digit form.\n */\nconst parseHex = (() => {\n // TODO(cdata): right now we don't actually enforce the number of digits\n const HEX_RE = /^[a-f0-9]*/i;\n return (inputString) => {\n inputString = inputString.slice(1).trim();\n const hexMatch = inputString.match(HEX_RE);\n const nodes = hexMatch == null ? [] : [{ type: 'hex', value: hexMatch[0] }];\n return {\n nodes,\n remainingInput: hexMatch == null ? inputString :\n inputString.slice(hexMatch[0].length)\n };\n };\n})();\n/**\n * Parses arguments passed to a function invocation (e.g., the expressions\n * within a matched set of parens).\n */\nconst parseFunctionArguments = (inputString) => {\n const expressionNodes = [];\n // Consume the opening paren\n inputString = inputString.slice(1).trim();\n while (inputString.length) {\n const expressionParseResult = parseExpression(inputString);\n expressionNodes.push(expressionParseResult.nodes[0]);\n inputString = expressionParseResult.remainingInput.trim();\n if (inputString[0] === ',') {\n inputString = inputString.slice(1).trim();\n }\n else if (inputString[0] === ')') {\n // Consume the closing paren and stop parsing\n inputString = inputString.slice(1);\n break;\n }\n }\n return { nodes: expressionNodes, remainingInput: inputString };\n};\nconst $visitedTypes = Symbol('visitedTypes');\n/**\n * An ASTWalker walks an array of ASTs such as the type produced by\n * parseExpressions and invokes a callback for a configured set of nodes that\n * the user wishes to \"visit\" during the walk.\n */\nexport class ASTWalker {\n constructor(visitedTypes) {\n this[$visitedTypes] = visitedTypes;\n }\n /**\n * Walk the given set of ASTs, and invoke the provided callback for nodes that\n * match the filtered set that the ASTWalker was constructed with.\n */\n walk(ast, callback) {\n const remaining = ast.slice();\n while (remaining.length) {\n const next = remaining.shift();\n if (this[$visitedTypes].indexOf(next.type) > -1) {\n callback(next);\n }\n switch (next.type) {\n case 'expression':\n remaining.unshift(...next.terms);\n break;\n case 'function':\n remaining.unshift(next.name, ...next.arguments);\n break;\n }\n }\n }\n}\nexport const ZERO = Object.freeze({ type: 'number', number: 0, unit: null });\n//# sourceMappingURL=parsers.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ZERO } from './parsers.js';\n/**\n * Ensures that a given number is expressed in radians. If the number is already\n * in radians, does nothing. If the value is in degrees, converts it to radians.\n * If the value has no specified unit, the unit is assumed to be radians. If the\n * value is not in radians or degrees, the value is resolved as 0 radians.\n *\n * Also accepts a second argument that is a default value to use if the input\n * numberNode number is NaN or Infinity.\n */\nexport const degreesToRadians = (numberNode, fallbackRadianValue = 0) => {\n let { number, unit } = numberNode;\n if (!isFinite(number)) {\n number = fallbackRadianValue;\n unit = 'rad';\n }\n else if (numberNode.unit === 'rad' || numberNode.unit == null) {\n return numberNode;\n }\n const valueIsDegrees = unit === 'deg' && number != null;\n const value = valueIsDegrees ? number : 0;\n const radians = value * Math.PI / 180;\n return { type: 'number', number: radians, unit: 'rad' };\n};\n/**\n * Ensures that a given number is expressed in degrees. If the number is already\n * in degrees, does nothing. If the value is in radians or has no specified\n * unit, converts it to degrees. If the value is not in radians or degrees, the\n * value is resolved as 0 degrees.\n *\n * Also accepts a second argument that is a default value to use if the input\n * numberNode number is NaN or Infinity.\n */\nexport const radiansToDegrees = (numberNode, fallbackDegreeValue = 0) => {\n let { number, unit } = numberNode;\n if (!isFinite(number)) {\n number = fallbackDegreeValue;\n unit = 'deg';\n }\n else if (numberNode.unit === 'deg') {\n return numberNode;\n }\n const valueIsRadians = (unit === null || unit === 'rad') && number != null;\n const value = valueIsRadians ? number : 0;\n const degrees = value * 180 / Math.PI;\n return { type: 'number', number: degrees, unit: 'deg' };\n};\n/**\n * Converts a given length to meters. Currently supported input units are\n * meters, centimeters and millimeters.\n *\n * Also accepts a second argument that is a default value to use if the input\n * numberNode number is NaN or Infinity.\n */\nexport const lengthToBaseMeters = (numberNode, fallbackMeterValue = 0) => {\n let { number, unit } = numberNode;\n if (!isFinite(number)) {\n number = fallbackMeterValue;\n unit = 'm';\n }\n else if (numberNode.unit === 'm') {\n return numberNode;\n }\n let scale;\n switch (unit) {\n default:\n scale = 1;\n break;\n case 'cm':\n scale = 1 / 100;\n break;\n case 'mm':\n scale = 1 / 1000;\n break;\n }\n const value = scale * number;\n return { type: 'number', number: value, unit: 'm' };\n};\n/**\n * Normalizes the unit of a given input number so that it is expressed in a\n * preferred unit. For length nodes, the return value will be expressed in\n * meters. For angle nodes, the return value will be expressed in radians.\n *\n * Also takes a fallback number that is used when the number value is not a\n * valid number or when the unit of the given number cannot be normalized.\n */\nexport const normalizeUnit = (() => {\n const identity = (node) => node;\n const unitNormalizers = {\n 'rad': identity,\n 'deg': degreesToRadians,\n 'm': identity,\n 'mm': lengthToBaseMeters,\n 'cm': lengthToBaseMeters\n };\n return (node, fallback = ZERO) => {\n if (!isFinite(node.number)) {\n node.number = fallback.number;\n node.unit = fallback.unit;\n }\n const { unit } = node;\n if (unit == null) {\n return node;\n }\n const normalize = unitNormalizers[unit];\n if (normalize == null) {\n return fallback;\n }\n return normalize(node);\n };\n})();\n//# sourceMappingURL=conversions.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b, _c;\nimport { normalizeUnit } from './conversions.js';\nimport { numberNode, ZERO } from './parsers.js';\nconst $evaluate = Symbol('evaluate');\nconst $lastValue = Symbol('lastValue');\n/**\n * An Evaluator is used to derive a computed style from part (or all) of a CSS\n * expression AST. This construct is particularly useful for complex ASTs\n * containing function calls such as calc, var and env. Such styles could be\n * costly to re-evaluate on every frame (and in some cases we may try to do\n * that). The Evaluator construct allows us to mark sub-trees of the AST as\n * constant, so that only the dynamic parts are re-evaluated. It also separates\n * one-time AST preparation work from work that necessarily has to happen upon\n * each evaluation.\n */\nexport class Evaluator {\n constructor() {\n this[_a] = null;\n }\n /**\n * An Evaluatable is a NumberNode or an Evaluator that evaluates a NumberNode\n * as the result of invoking its evaluate method. This is mainly used to\n * ensure that CSS function nodes are cast to the corresponding Evaluators\n * that will resolve the result of the function, but is also used to ensure\n * that a percentage nested at arbitrary depth in the expression will always\n * be evaluated against the correct basis.\n */\n static evaluatableFor(node, basis = ZERO) {\n if (node instanceof Evaluator) {\n return node;\n }\n if (node.type === 'number') {\n if (node.unit === '%') {\n return new PercentageEvaluator(node, basis);\n }\n return node;\n }\n switch (node.name.value) {\n case 'calc':\n return new CalcEvaluator(node, basis);\n case 'env':\n return new EnvEvaluator(node);\n }\n return ZERO;\n }\n /**\n * If the input is an Evaluator, returns the result of evaluating it.\n * Otherwise, returns the input.\n *\n * This is a helper to aide in resolving a NumberNode without conditionally\n * checking if the Evaluatable is an Evaluator everywhere.\n */\n static evaluate(evaluatable) {\n if (evaluatable instanceof Evaluator) {\n return evaluatable.evaluate();\n }\n return evaluatable;\n }\n /**\n * If the input is an Evaluator, returns the value of its isConstant property.\n * Returns true for all other input values.\n */\n static isConstant(evaluatable) {\n if (evaluatable instanceof Evaluator) {\n return evaluatable.isConstant;\n }\n return true;\n }\n /**\n * This method applies a set of structured intrinsic metadata to an evaluated\n * result from a parsed CSS-like string of expressions. Intrinsics provide\n * sufficient metadata (e.g., basis values, analogs for keywords) such that\n * omitted values in the input string can be backfilled, and keywords can be\n * converted to concrete numbers.\n *\n * The result of applying intrinsics is a tuple of NumberNode values whose\n * units match the units used by the basis of the intrinsics.\n *\n * The following is a high-level description of how intrinsics are applied:\n *\n * 1. Determine the value of 'auto' for the current term\n * 2. If there is no corresponding input value for this term, substitute the\n * 'auto' value.\n * 3. If the term is an IdentNode, treat it as a keyword and perform the\n * appropriate substitution.\n * 4. If the term is still null, fallback to the 'auto' value\n * 5. If the term is a percentage, apply it to the basis and return that\n * value\n * 6. Normalize the unit of the term\n * 7. If the term's unit does not match the basis unit, return the basis\n * value\n * 8. Return the term as is\n */\n static applyIntrinsics(evaluated, intrinsics) {\n const { basis, keywords } = intrinsics;\n const { auto } = keywords;\n return basis.map((basisNode, index) => {\n // Use an auto value if we have it, otherwise the auto value is the basis:\n const autoSubstituteNode = auto[index] == null ? basisNode : auto[index];\n // If the evaluated nodes do not have a node at the current\n // index, fallback to the \"auto\" substitute right away:\n let evaluatedNode = evaluated[index] ? evaluated[index] : autoSubstituteNode;\n // Any ident node is considered a keyword:\n if (evaluatedNode.type === 'ident') {\n const keyword = evaluatedNode.value;\n // Substitute any keywords for concrete values first:\n if (keyword in keywords) {\n evaluatedNode = keywords[keyword][index];\n }\n }\n // If we don't have a NumberNode at this point, fall back to whatever\n // is specified for auto:\n if (evaluatedNode == null || evaluatedNode.type === 'ident') {\n evaluatedNode = autoSubstituteNode;\n }\n // For percentages, we always apply the percentage to the basis value:\n if (evaluatedNode.unit === '%') {\n return numberNode(evaluatedNode.number / 100 * basisNode.number, basisNode.unit);\n }\n // Otherwise, normalize whatever we have:\n evaluatedNode = normalizeUnit(evaluatedNode, basisNode);\n // If the normalized units do not match, return the basis as a fallback:\n if (evaluatedNode.unit !== basisNode.unit) {\n return basisNode;\n }\n // Finally, return the evaluated node with intrinsics applied:\n return evaluatedNode;\n });\n }\n /**\n * If true, the Evaluator will only evaluate its AST one time. If false, the\n * Evaluator will re-evaluate the AST each time that the public evaluate\n * method is invoked.\n */\n get isConstant() {\n return false;\n }\n /**\n * Evaluate the Evaluator and return the result. If the Evaluator is constant,\n * the corresponding AST will only be evaluated once, and the result of\n * evaluating it the first time will be returned on all subsequent\n * evaluations.\n */\n evaluate() {\n if (!this.isConstant || this[$lastValue] == null) {\n this[$lastValue] = this[$evaluate]();\n }\n return this[$lastValue];\n }\n}\n_a = $lastValue;\nconst $percentage = Symbol('percentage');\nconst $basis = Symbol('basis');\n/**\n * A PercentageEvaluator scales a given basis value by a given percentage value.\n * The evaluated result is always considered to be constant.\n */\nexport class PercentageEvaluator extends Evaluator {\n constructor(percentage, basis) {\n super();\n this[$percentage] = percentage;\n this[$basis] = basis;\n }\n get isConstant() {\n return true;\n }\n [$evaluate]() {\n return numberNode(this[$percentage].number / 100 * this[$basis].number, this[$basis].unit);\n }\n}\nconst $identNode = Symbol('identNode');\n/**\n * Evaluator for CSS-like env() functions. Currently, only one environment\n * variable is accepted as an argument for such functions: window-scroll-y.\n *\n * The env() Evaluator is explicitly dynamic because it always refers to\n * external state that changes as the user scrolls, so it should always be\n * re-evaluated to ensure we get the most recent value.\n *\n * Some important notes about this feature include:\n *\n * - There is no such thing as a \"window-scroll-y\" CSS environment variable in\n * any stable browser at the time that this comment is being written.\n * - The actual CSS env() function accepts a second argument as a fallback for\n * the case that the specified first argument isn't set; our syntax does not\n * support this second argument.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/env\n */\nexport class EnvEvaluator extends Evaluator {\n constructor(envFunction) {\n super();\n this[_b] = null;\n const identNode = envFunction.arguments.length ? envFunction.arguments[0].terms[0] : null;\n if (identNode != null && identNode.type === 'ident') {\n this[$identNode] = identNode;\n }\n }\n get isConstant() {\n return false;\n }\n ;\n [(_b = $identNode, $evaluate)]() {\n if (this[$identNode] != null) {\n switch (this[$identNode].value) {\n case 'window-scroll-y':\n const verticalScrollPosition = window.pageYOffset;\n const verticalScrollMax = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);\n const scrollY = verticalScrollPosition /\n (verticalScrollMax - window.innerHeight) ||\n 0;\n return { type: 'number', number: scrollY, unit: null };\n }\n }\n return ZERO;\n }\n}\nconst IS_MULTIPLICATION_RE = /[\\*\\/]/;\nconst $evaluator = Symbol('evaluator');\n/**\n * Evaluator for CSS-like calc() functions. Our implementation of calc()\n * evaluation currently support nested function calls, an unlimited number of\n * terms, and all four algebraic operators (+, -, * and /).\n *\n * The Evaluator is marked as constant unless the calc expression contains an\n * internal env expression at any depth, in which case it will be marked as\n * dynamic.\n *\n * @see https://www.w3.org/TR/css-values-3/#calc-syntax\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/calc\n */\nexport class CalcEvaluator extends Evaluator {\n constructor(calcFunction, basis = ZERO) {\n super();\n this[_c] = null;\n if (calcFunction.arguments.length !== 1) {\n return;\n }\n const terms = calcFunction.arguments[0].terms.slice();\n const secondOrderTerms = [];\n while (terms.length) {\n const term = terms.shift();\n if (secondOrderTerms.length > 0) {\n const previousTerm = secondOrderTerms[secondOrderTerms.length - 1];\n if (previousTerm.type === 'operator' &&\n IS_MULTIPLICATION_RE.test(previousTerm.value)) {\n const operator = secondOrderTerms.pop();\n const leftValue = secondOrderTerms.pop();\n if (leftValue == null) {\n return;\n }\n secondOrderTerms.push(new OperatorEvaluator(operator, Evaluator.evaluatableFor(leftValue, basis), Evaluator.evaluatableFor(term, basis)));\n continue;\n }\n }\n secondOrderTerms.push(term.type === 'operator' ? term :\n Evaluator.evaluatableFor(term, basis));\n }\n while (secondOrderTerms.length > 2) {\n const [left, operator, right] = secondOrderTerms.splice(0, 3);\n if (operator.type !== 'operator') {\n return;\n }\n secondOrderTerms.unshift(new OperatorEvaluator(operator, Evaluator.evaluatableFor(left, basis), Evaluator.evaluatableFor(right, basis)));\n }\n // There should only be one combined evaluator at this point:\n if (secondOrderTerms.length === 1) {\n this[$evaluator] = secondOrderTerms[0];\n }\n }\n get isConstant() {\n return this[$evaluator] == null || Evaluator.isConstant(this[$evaluator]);\n }\n [(_c = $evaluator, $evaluate)]() {\n return this[$evaluator] != null ? Evaluator.evaluate(this[$evaluator]) :\n ZERO;\n }\n}\nconst $operator = Symbol('operator');\nconst $left = Symbol('left');\nconst $right = Symbol('right');\n/**\n * An Evaluator for the operators found inside CSS calc() functions.\n * The evaluator accepts an operator and left/right operands. The operands can\n * be any valid expression term typically allowed inside a CSS calc function.\n *\n * As detail of this implementation, the only supported unit types are angles\n * expressed as radians or degrees, and lengths expressed as meters, centimeters\n * or millimeters.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/calc\n */\nexport class OperatorEvaluator extends Evaluator {\n constructor(operator, left, right) {\n super();\n this[$operator] = operator;\n this[$left] = left;\n this[$right] = right;\n }\n get isConstant() {\n return Evaluator.isConstant(this[$left]) &&\n Evaluator.isConstant(this[$right]);\n }\n [$evaluate]() {\n const leftNode = normalizeUnit(Evaluator.evaluate(this[$left]));\n const rightNode = normalizeUnit(Evaluator.evaluate(this[$right]));\n const { number: leftValue, unit: leftUnit } = leftNode;\n const { number: rightValue, unit: rightUnit } = rightNode;\n // Disallow operations for mismatched normalized units e.g., m and rad:\n if (rightUnit != null && leftUnit != null && rightUnit != leftUnit) {\n return ZERO;\n }\n // NOTE(cdata): rules for calc type checking are defined here\n // https://drafts.csswg.org/css-values-3/#calc-type-checking\n // This is a simplification and may not hold up once we begin to support\n // additional unit types:\n const unit = leftUnit || rightUnit;\n let value;\n switch (this[$operator].value) {\n case '+':\n value = leftValue + rightValue;\n break;\n case '-':\n value = leftValue - rightValue;\n break;\n case '/':\n value = leftValue / rightValue;\n break;\n case '*':\n value = leftValue * rightValue;\n break;\n default:\n return ZERO;\n }\n return { type: 'number', number: value, unit };\n }\n}\nconst $evaluatables = Symbol('evaluatables');\nconst $intrinsics = Symbol('intrinsics');\n/**\n * A VectorEvaluator evaluates a series of numeric terms that usually represent\n * a data structure such as a multi-dimensional vector or a spherical\n *\n * The form of the evaluator's result is determined by the Intrinsics that are\n * given to it when it is constructed. For example, spherical intrinsics would\n * establish two angle terms and a length term, so the result of evaluating the\n * evaluator that is configured with spherical intrinsics is a three element\n * array where the first two elements represent angles in radians and the third\n * element representing a length in meters.\n */\nexport class StyleEvaluator extends Evaluator {\n constructor(expressions, intrinsics) {\n super();\n this[$intrinsics] = intrinsics;\n const firstExpression = expressions[0];\n const terms = firstExpression != null ? firstExpression.terms : [];\n this[$evaluatables] =\n intrinsics.basis.map((basisNode, index) => {\n const term = terms[index];\n if (term == null) {\n return { type: 'ident', value: 'auto' };\n }\n if (term.type === 'ident') {\n return term;\n }\n return Evaluator.evaluatableFor(term, basisNode);\n });\n }\n get isConstant() {\n for (const evaluatable of this[$evaluatables]) {\n if (!Evaluator.isConstant(evaluatable)) {\n return false;\n }\n }\n return true;\n }\n [$evaluate]() {\n const evaluated = this[$evaluatables].map(evaluatable => Evaluator.evaluate(evaluatable));\n return Evaluator.applyIntrinsics(evaluated, this[$intrinsics])\n .map(numberNode => numberNode.number);\n }\n}\n//# sourceMappingURL=evaluators.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b, _c, _d;\nimport { ASTWalker } from './parsers.js';\nconst $instances = Symbol('instances');\nconst $activateListener = Symbol('activateListener');\nconst $deactivateListener = Symbol('deactivateListener');\nconst $notifyInstances = Symbol('notifyInstances');\nconst $notify = Symbol('notify');\nconst $scrollCallback = Symbol('callback');\n/**\n * This internal helper is intended to work as a reference-counting manager of\n * scroll event listeners. Only one scroll listener is ever registered for all\n * instances of the class, and when the last ScrollObserver \"disconnects\", that\n * event listener is removed. This spares us from thrashing\n * the {add,remove}EventListener API (the binding cost of these methods has been\n * known to show up in performance analyses) as well as potential memory leaks.\n */\nclass ScrollObserver {\n static [$notifyInstances]() {\n for (const instance of ScrollObserver[$instances]) {\n instance[$notify]();\n }\n }\n static [(_a = $instances, $activateListener)]() {\n window.addEventListener('scroll', this[$notifyInstances], { passive: true });\n }\n static [$deactivateListener]() {\n window.removeEventListener('scroll', this[$notifyInstances]);\n }\n constructor(callback) {\n this[$scrollCallback] = callback;\n }\n /**\n * Listen for scroll events. The configured callback (passed to the\n * constructor) will be invoked for subsequent global scroll events.\n */\n observe() {\n if (ScrollObserver[$instances].size === 0) {\n ScrollObserver[$activateListener]();\n }\n ScrollObserver[$instances].add(this);\n }\n /**\n * Stop listening for scroll events.\n */\n disconnect() {\n ScrollObserver[$instances].delete(this);\n if (ScrollObserver[$instances].size === 0) {\n ScrollObserver[$deactivateListener]();\n }\n }\n [$notify]() {\n this[$scrollCallback]();\n }\n ;\n}\nScrollObserver[_a] = new Set();\nconst $computeStyleCallback = Symbol('computeStyleCallback');\nconst $astWalker = Symbol('astWalker');\nconst $dependencies = Symbol('dependencies');\nconst $onScroll = Symbol('onScroll');\n/**\n * The StyleEffector is configured with a callback that will be invoked at the\n * optimal time that some array of CSS expression ASTs ought to be evaluated.\n *\n * For example, our CSS-like expression syntax supports usage of the env()\n * function to incorporate the current top-level scroll position into a CSS\n * expression: env(window-scroll-y).\n *\n * This \"environment variable\" will change dynamically as the user scrolls the\n * page. If an AST contains such a usage of env(), we would have to evaluate the\n * AST on every frame in order to be sure that the computed style stays up to\n * date.\n *\n * The StyleEffector spares us from evaluating the expressions on every frame by\n * correlating specific parts of an AST with observers of the external effects\n * that they refer to (if any). So, if the AST contains env(window-scroll-y),\n * the StyleEffector manages the lifetime of a global scroll event listener and\n * notifies the user at the optimal time to evaluate the computed style.\n */\nexport class StyleEffector {\n constructor(callback) {\n this[_b] = {};\n this[_c] = new ASTWalker(['function']);\n this[_d] = () => {\n this[$computeStyleCallback]({ relatedState: 'window-scroll' });\n };\n this[$computeStyleCallback] = callback;\n }\n /**\n * Sets the expressions that govern when the StyleEffector callback will be\n * invoked.\n */\n observeEffectsFor(ast) {\n const newDependencies = {};\n const oldDependencies = this[$dependencies];\n this[$astWalker].walk(ast, functionNode => {\n const { name } = functionNode;\n const firstArgument = functionNode.arguments[0];\n const firstTerm = firstArgument.terms[0];\n if (name.value !== 'env' || firstTerm == null ||\n firstTerm.type !== 'ident') {\n return;\n }\n switch (firstTerm.value) {\n case 'window-scroll-y':\n if (newDependencies['window-scroll'] == null) {\n const observer = 'window-scroll' in oldDependencies ?\n oldDependencies['window-scroll'] :\n new ScrollObserver(this[$onScroll]);\n observer.observe();\n delete oldDependencies['window-scroll'];\n newDependencies['window-scroll'] = observer;\n }\n break;\n }\n });\n for (const environmentState in oldDependencies) {\n const observer = oldDependencies[environmentState];\n observer.disconnect();\n }\n this[$dependencies] = newDependencies;\n }\n /**\n * Disposes of the StyleEffector by disconnecting all observers of external\n * effects.\n */\n dispose() {\n for (const environmentState in this[$dependencies]) {\n const observer = this[$dependencies][environmentState];\n observer.disconnect();\n }\n }\n}\n_b = $dependencies, _c = $astWalker, _d = $onScroll;\n//# sourceMappingURL=style-effector.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { StyleEvaluator } from './styles/evaluators.js';\nimport { parseExpressions } from './styles/parsers.js';\nimport { StyleEffector } from './styles/style-effector.js';\n/**\n * The @style decorator is responsible for coordinating the conversion of a\n * CSS-like string property value into numbers that can be applied to\n * lower-level constructs. It also can optionally manage the lifecycle of a\n * StyleEffector which allows automatic updates for styles that use env() or\n * var() functions.\n *\n * The decorator is configured with Intrinsics and the property key for a\n * method that handles updates. The named update handler is invoked with the\n * result of parsing and evaluating the raw property string value. The format of\n * the evaluated result is derived from the basis of the configured Intrinsics,\n * and is always an array of numbers of fixed length.\n *\n * NOTE: This decorator depends on the property updating mechanism defined by\n * UpdatingElement as exported by the lit-element module. That means it *must*\n * be used in conjunction with the @property decorator, or equivalent\n * JavaScript.\n *\n * Supported configurations are:\n *\n * - `intrinsics`: An Intrinsics struct that describes how to interpret a\n * serialized style attribute. For more detail on intrinsics see\n * ./styles/evaluators.ts\n * - `updateHandler`: A string or Symbol that is the key of a method to be\n * invoked with the result of parsing and evaluating a serialized style string.\n * - `observeEffects`: Optional, if set to true then styles that use env() will\n * cause their update handlers to be invoked every time the corresponding\n * environment variable changes (even if the style attribute itself remains\n * static).\n */\nexport const style = (config) => {\n const observeEffects = config.observeEffects || false;\n const getIntrinsics = config.intrinsics instanceof Function ?\n config.intrinsics :\n (() => config.intrinsics);\n return (proto, propertyName) => {\n const originalUpdated = proto.updated;\n const originalConnectedCallback = proto.connectedCallback;\n const originalDisconnectedCallback = proto.disconnectedCallback;\n const $styleEffector = Symbol(`${propertyName}StyleEffector`);\n const $styleEvaluator = Symbol(`${propertyName}StyleEvaluator`);\n const $updateEvaluator = Symbol(`${propertyName}UpdateEvaluator`);\n const $evaluateAndSync = Symbol(`${propertyName}EvaluateAndSync`);\n Object.defineProperties(proto, {\n [$styleEffector]: { value: null, writable: true },\n [$styleEvaluator]: { value: null, writable: true },\n [$updateEvaluator]: {\n value: function () {\n const ast = parseExpressions(this[propertyName]);\n this[$styleEvaluator] =\n new StyleEvaluator(ast, getIntrinsics(this));\n if (this[$styleEffector] == null && observeEffects) {\n this[$styleEffector] =\n new StyleEffector(() => this[$evaluateAndSync]());\n }\n if (this[$styleEffector] != null) {\n this[$styleEffector].observeEffectsFor(ast);\n }\n }\n },\n [$evaluateAndSync]: {\n value: function () {\n if (this[$styleEvaluator] == null) {\n return;\n }\n const result = this[$styleEvaluator].evaluate();\n // @see https://github.com/microsoft/TypeScript/pull/30769\n // @see https://github.com/Microsoft/TypeScript/issues/1863\n this[config.updateHandler](result);\n }\n },\n updated: {\n value: function (changedProperties) {\n // Always invoke updates to styles first. This gives a class that\n // uses this decorator the opportunity to override the effect, or\n // respond to it, in its own implementation of `updated`.\n if (changedProperties.has(propertyName)) {\n this[$updateEvaluator]();\n this[$evaluateAndSync]();\n }\n originalUpdated.call(this, changedProperties);\n }\n },\n connectedCallback: {\n value: function () {\n originalConnectedCallback.call(this);\n this.requestUpdate(propertyName, this[propertyName]);\n }\n },\n disconnectedCallback: {\n value: function () {\n originalDisconnectedCallback.call(this);\n if (this[$styleEffector] != null) {\n this[$styleEffector].dispose();\n this[$styleEffector] = null;\n }\n }\n }\n });\n };\n};\n//# sourceMappingURL=decorators.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { clamp } from '../utilities.js';\n// Adapted from https://gist.github.com/gre/1650294\nexport const easeInOutQuad = (t) => t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n/**\n * Creates a TimingFunction that uses a given ease to interpolate between\n * two configured number values.\n */\nexport const interpolate = (start, end, ease = easeInOutQuad) => (time) => start + (end - start) * ease(time);\n/**\n * Creates a TimingFunction that interpolates through a weighted list\n * of other TimingFunctions (\"tracks\"). Tracks are interpolated in order, and\n * allocated a percentage of the total time based on their relative weight.\n */\nexport const sequence = (tracks, weights) => {\n const cumulativeSum = ((sum) => (value) => sum += value);\n const times = weights.map(cumulativeSum(0));\n return (time) => {\n time = clamp(time, 0, 1);\n time *= times[times.length - 1];\n const i = times.findIndex((val) => val >= time);\n const start = i < 1 ? 0 : times[i - 1];\n const end = times[i];\n return tracks[i]((time - start) / (end - start));\n };\n};\n/**\n * Creates a \"timeline\" TimingFunction out of an initial value and a series of\n * Keyframes. The timeline function accepts value from 0-1 and returns the\n * current value based on keyframe interpolation across the total number of\n * frames. Frames are only used to indicate the relative length of each keyframe\n * transition, so interpolated values will be computed for fractional frames.\n */\nexport const timeline = (path) => {\n const tracks = [];\n const weights = [];\n let lastValue = path.initialValue;\n for (let i = 0; i < path.keyframes.length; ++i) {\n const keyframe = path.keyframes[i];\n const { value, frames } = keyframe;\n const ease = keyframe.ease || easeInOutQuad;\n const track = interpolate(lastValue, value, ease);\n tracks.push(track);\n weights.push(frames);\n lastValue = value;\n }\n return sequence(tracks, weights);\n};\n//# sourceMappingURL=animation.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { Spherical, Vector3 } from 'three';\nimport { style } from '../decorators.js';\nimport { $ariaLabel, $container, $getModelIsVisible, $loadedTime, $needsRender, $onModelLoad, $onResize, $renderer, $scene, $tick, $updateStatus, $userInputElement, toVector3D } from '../model-viewer-base.js';\nimport { degreesToRadians, normalizeUnit } from '../styles/conversions.js';\nimport { StyleEvaluator } from '../styles/evaluators.js';\nimport { numberNode, parseExpressions } from '../styles/parsers.js';\nimport { DECAY_MILLISECONDS } from '../three-components/Damper.js';\nimport { ChangeSource, SmoothControls } from '../three-components/SmoothControls.js';\nimport { timeline } from '../utilities/animation.js';\n// NOTE(cdata): The following \"animation\" timing functions are deliberately\n// being used in favor of CSS animations. In Safari 12.1 and 13, CSS animations\n// would cause the interaction prompt to glitch unexpectedly\n// @see https://github.com/google/model-viewer/issues/839\nconst PROMPT_ANIMATION_TIME = 5000;\n// For timing purposes, a \"frame\" is a timing agnostic relative unit of time\n// and a \"value\" is a target value for the Frame.\nconst wiggle = timeline({\n initialValue: 0,\n keyframes: [\n { frames: 5, value: -1 },\n { frames: 1, value: -1 },\n { frames: 8, value: 1 },\n { frames: 1, value: 1 },\n { frames: 5, value: 0 },\n { frames: 18, value: 0 }\n ]\n});\nconst fade = timeline({\n initialValue: 0,\n keyframes: [\n { frames: 1, value: 1 },\n { frames: 5, value: 1 },\n { frames: 1, value: 0 },\n { frames: 6, value: 0 }\n ]\n});\nexport const DEFAULT_FOV_DEG = 30;\nexport const DEFAULT_MIN_FOV_DEG = 12;\nexport const DEFAULT_CAMERA_ORBIT = '0deg 75deg 105%';\nconst DEFAULT_CAMERA_TARGET = 'auto auto auto';\nconst DEFAULT_FIELD_OF_VIEW = 'auto';\nconst MINIMUM_RADIUS_RATIO = 2.2;\nconst AZIMUTHAL_QUADRANT_LABELS = ['front', 'right', 'back', 'left'];\nconst POLAR_TRIENT_LABELS = ['upper-', '', 'lower-'];\nexport const DEFAULT_INTERACTION_PROMPT_THRESHOLD = 3000;\nexport const INTERACTION_PROMPT = '. Use mouse, touch or arrow keys to move.';\nexport const InteractionPromptStrategy = {\n AUTO: 'auto',\n NONE: 'none'\n};\nexport const InteractionPromptStyle = {\n BASIC: 'basic',\n WIGGLE: 'wiggle'\n};\nexport const TouchAction = {\n PAN_Y: 'pan-y',\n PAN_X: 'pan-x',\n NONE: 'none'\n};\nexport const fieldOfViewIntrinsics = () => {\n return {\n basis: [degreesToRadians(numberNode(DEFAULT_FOV_DEG, 'deg'))],\n keywords: { auto: [null] }\n };\n};\nconst minFieldOfViewIntrinsics = () => {\n return {\n basis: [degreesToRadians(numberNode(DEFAULT_MIN_FOV_DEG, 'deg'))],\n keywords: { auto: [null] }\n };\n};\nexport const cameraOrbitIntrinsics = (() => {\n const defaultTerms = parseExpressions(DEFAULT_CAMERA_ORBIT)[0]\n .terms;\n const theta = normalizeUnit(defaultTerms[0]);\n const phi = normalizeUnit(defaultTerms[1]);\n return (element) => {\n const radius = element[$scene].idealCameraDistance();\n return {\n basis: [theta, phi, numberNode(radius, 'm')],\n keywords: { auto: [null, null, numberNode(105, '%')] }\n };\n };\n})();\nconst minCameraOrbitIntrinsics = (element) => {\n const radius = MINIMUM_RADIUS_RATIO * element[$scene].boundingSphere.radius;\n return {\n basis: [\n numberNode(-Infinity, 'rad'),\n numberNode(0, 'rad'),\n numberNode(radius, 'm')\n ],\n keywords: { auto: [null, null, null] }\n };\n};\nconst maxCameraOrbitIntrinsics = (element) => {\n const orbitIntrinsics = cameraOrbitIntrinsics(element);\n const evaluator = new StyleEvaluator([], orbitIntrinsics);\n const defaultRadius = evaluator.evaluate()[2];\n return {\n basis: [\n numberNode(Infinity, 'rad'),\n numberNode(Math.PI, 'rad'),\n numberNode(defaultRadius, 'm')\n ],\n keywords: { auto: [null, null, null] }\n };\n};\nexport const cameraTargetIntrinsics = (element) => {\n const center = element[$scene].boundingBox.getCenter(new Vector3());\n return {\n basis: [\n numberNode(center.x, 'm'),\n numberNode(center.y, 'm'),\n numberNode(center.z, 'm')\n ],\n keywords: { auto: [null, null, null] }\n };\n};\nconst HALF_PI = Math.PI / 2.0;\nconst THIRD_PI = Math.PI / 3.0;\nconst QUARTER_PI = HALF_PI / 2.0;\nconst TAU = 2.0 * Math.PI;\nexport const $controls = Symbol('controls');\nexport const $panElement = Symbol('panElement');\nexport const $promptElement = Symbol('promptElement');\nexport const $promptAnimatedContainer = Symbol('promptAnimatedContainer');\nexport const $fingerAnimatedContainers = Symbol('fingerAnimatedContainers');\nconst $deferInteractionPrompt = Symbol('deferInteractionPrompt');\nconst $updateAria = Symbol('updateAria');\nconst $a11y = Symbol('a11y');\nconst $updateA11y = Symbol('updateA11y');\nconst $updateCameraForRadius = Symbol('updateCameraForRadius');\nconst $cancelPrompts = Symbol('cancelPrompts');\nconst $onChange = Symbol('onChange');\nconst $onPointerChange = Symbol('onPointerChange');\nconst $waitingToPromptUser = Symbol('waitingToPromptUser');\nconst $userHasInteracted = Symbol('userHasInteracted');\nconst $promptElementVisibleTime = Symbol('promptElementVisibleTime');\nconst $lastPromptOffset = Symbol('lastPromptOffset');\nconst $cancellationSource = Symbol('cancellationSource');\nconst $lastSpherical = Symbol('lastSpherical');\nconst $jumpCamera = Symbol('jumpCamera');\nconst $initialized = Symbol('initialized');\nconst $maintainThetaPhi = Symbol('maintainThetaPhi');\nconst $syncCameraOrbit = Symbol('syncCameraOrbit');\nconst $syncFieldOfView = Symbol('syncFieldOfView');\nconst $syncCameraTarget = Symbol('syncCameraTarget');\nconst $syncMinCameraOrbit = Symbol('syncMinCameraOrbit');\nconst $syncMaxCameraOrbit = Symbol('syncMaxCameraOrbit');\nconst $syncMinFieldOfView = Symbol('syncMinFieldOfView');\nconst $syncMaxFieldOfView = Symbol('syncMaxFieldOfView');\nexport const ControlsMixin = (ModelViewerElement) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;\n class ControlsModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this.cameraControls = false;\n this.cameraOrbit = DEFAULT_CAMERA_ORBIT;\n this.cameraTarget = DEFAULT_CAMERA_TARGET;\n this.fieldOfView = DEFAULT_FIELD_OF_VIEW;\n this.minCameraOrbit = 'auto';\n this.maxCameraOrbit = 'auto';\n this.minFieldOfView = 'auto';\n this.maxFieldOfView = 'auto';\n this.interactionPromptThreshold = DEFAULT_INTERACTION_PROMPT_THRESHOLD;\n this.interactionPrompt = InteractionPromptStrategy.AUTO;\n this.interactionPromptStyle = InteractionPromptStyle.WIGGLE;\n this.orbitSensitivity = 1;\n this.zoomSensitivity = 1;\n this.panSensitivity = 1;\n this.touchAction = TouchAction.NONE;\n this.disableZoom = false;\n this.disablePan = false;\n this.disableTap = false;\n this.interpolationDecay = DECAY_MILLISECONDS;\n this.a11y = null;\n this[_a] = this.shadowRoot.querySelector('.interaction-prompt');\n this[_b] = this.shadowRoot.querySelector('#prompt');\n this[_c] = [\n this.shadowRoot.querySelector('#finger0'),\n this.shadowRoot.querySelector('#finger1')\n ];\n this[_d] = this.shadowRoot.querySelector('.pan-target');\n this[_e] = 0;\n this[_f] = Infinity;\n this[_g] = false;\n this[_h] = false;\n this[_j] = ChangeSource.AUTOMATIC;\n this[_k] = new SmoothControls(this[$scene].camera, this[$userInputElement], this[$scene]);\n this[_l] = new Spherical();\n this[_m] = false;\n this[_o] = false;\n this[_p] = false;\n this[_q] = {};\n this[_r] = () => {\n const source = this[$controls].changeSource;\n this[$cancellationSource] = source;\n if (source === ChangeSource.USER_INTERACTION) {\n this[$userHasInteracted] = true;\n this[$deferInteractionPrompt]();\n }\n };\n this[_s] = () => {\n this[$updateAria]();\n this[$needsRender]();\n const source = this[$controls].changeSource;\n this.dispatchEvent(new CustomEvent('camera-change', { detail: { source } }));\n };\n this[_t] = (event) => {\n this[$container].classList.toggle('pointer-tumbling', event.type === 'pointer-change-start');\n };\n }\n get inputSensitivity() {\n return this[$controls].inputSensitivity;\n }\n set inputSensitivity(value) {\n this[$controls].inputSensitivity = value;\n }\n getCameraOrbit() {\n const { theta, phi, radius } = this[$lastSpherical];\n return {\n theta,\n phi,\n radius,\n toString() {\n return `${this.theta}rad ${this.phi}rad ${this.radius}m`;\n }\n };\n }\n getCameraTarget() {\n return toVector3D(this[$renderer].isPresenting ? this[$renderer].arRenderer.target :\n this[$scene].getDynamicTarget());\n }\n getFieldOfView() {\n return this[$controls].getFieldOfView();\n }\n // Provided so user code does not have to parse these from attributes.\n getMinimumFieldOfView() {\n return this[$controls].options.minimumFieldOfView;\n }\n getMaximumFieldOfView() {\n return this[$controls].options.maximumFieldOfView;\n }\n getIdealAspect() {\n return this[$scene].idealAspect;\n }\n jumpCameraToGoal() {\n this[$jumpCamera] = true;\n this.requestUpdate($jumpCamera, false);\n }\n resetInteractionPrompt() {\n this[$lastPromptOffset] = 0;\n this[$promptElementVisibleTime] = Infinity;\n this[$userHasInteracted] = false;\n this[$waitingToPromptUser] =\n this.interactionPrompt === InteractionPromptStrategy.AUTO &&\n this.cameraControls;\n }\n zoom(keyPresses) {\n const event = new WheelEvent('wheel', { deltaY: -30 * keyPresses });\n this[$userInputElement].dispatchEvent(event);\n }\n connectedCallback() {\n super.connectedCallback();\n this[$controls].addEventListener('user-interaction', this[$cancelPrompts]);\n this[$controls].addEventListener('pointer-change-start', this[$onPointerChange]);\n this[$controls].addEventListener('pointer-change-end', this[$onPointerChange]);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this[$controls].removeEventListener('user-interaction', this[$cancelPrompts]);\n this[$controls].removeEventListener('pointer-change-start', this[$onPointerChange]);\n this[$controls].removeEventListener('pointer-change-end', this[$onPointerChange]);\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n const controls = this[$controls];\n const scene = this[$scene];\n if (changedProperties.has('cameraControls')) {\n if (this.cameraControls) {\n controls.enableInteraction();\n if (this.interactionPrompt === InteractionPromptStrategy.AUTO) {\n this[$waitingToPromptUser] = true;\n }\n }\n else {\n controls.disableInteraction();\n this[$deferInteractionPrompt]();\n }\n this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]);\n }\n if (changedProperties.has('disableZoom')) {\n controls.disableZoom = this.disableZoom;\n }\n if (changedProperties.has('disablePan')) {\n controls.enablePan = !this.disablePan;\n }\n if (changedProperties.has('disableTap')) {\n controls.enableTap = !this.disableTap;\n }\n if (changedProperties.has('interactionPrompt') ||\n changedProperties.has('cameraControls') ||\n changedProperties.has('src')) {\n if (this.interactionPrompt === InteractionPromptStrategy.AUTO &&\n this.cameraControls && !this[$userHasInteracted]) {\n this[$waitingToPromptUser] = true;\n }\n else {\n this[$deferInteractionPrompt]();\n }\n }\n if (changedProperties.has('interactionPromptStyle')) {\n this[$promptAnimatedContainer].style.opacity =\n this.interactionPromptStyle == InteractionPromptStyle.BASIC ? '1' :\n '0';\n }\n if (changedProperties.has('touchAction')) {\n const touchAction = this.touchAction;\n controls.applyOptions({ touchAction });\n controls.updateTouchActionStyle();\n }\n if (changedProperties.has('orbitSensitivity')) {\n controls.orbitSensitivity = this.orbitSensitivity;\n }\n if (changedProperties.has('zoomSensitivity')) {\n controls.zoomSensitivity = this.zoomSensitivity;\n }\n if (changedProperties.has('panSensitivity')) {\n controls.panSensitivity = this.panSensitivity;\n }\n if (changedProperties.has('interpolationDecay')) {\n controls.setDamperDecayTime(this.interpolationDecay);\n scene.setTargetDamperDecayTime(this.interpolationDecay);\n }\n if (changedProperties.has('a11y')) {\n this[$updateA11y]();\n }\n if (this[$jumpCamera] === true) {\n Promise.resolve().then(() => {\n controls.jumpToGoal();\n scene.jumpToGoal();\n this[$onChange]();\n this[$jumpCamera] = false;\n });\n }\n }\n async updateFraming() {\n const scene = this[$scene];\n const oldFramedFoV = scene.adjustedFoV(scene.framedFoVDeg);\n await scene.updateFraming();\n const newFramedFoV = scene.adjustedFoV(scene.framedFoVDeg);\n const zoom = this[$controls].getFieldOfView() / oldFramedFoV;\n this[$controls].setFieldOfView(newFramedFoV * zoom);\n this[$maintainThetaPhi] = true;\n this.requestUpdate('maxFieldOfView');\n this.requestUpdate('fieldOfView');\n this.requestUpdate('minCameraOrbit');\n this.requestUpdate('maxCameraOrbit');\n this.requestUpdate('cameraOrbit');\n await this.updateComplete;\n }\n interact(duration, finger0, finger1) {\n const inputElement = this[$userInputElement];\n const fingerElements = this[$fingerAnimatedContainers];\n if (fingerElements[0].style.opacity === '1') {\n console.warn('interact() failed because an existing interaction is running.');\n return;\n }\n const xy = new Array();\n xy.push({ x: timeline(finger0.x), y: timeline(finger0.y) });\n const positions = [{ x: xy[0].x(0), y: xy[0].y(0) }];\n if (finger1 != null) {\n xy.push({ x: timeline(finger1.x), y: timeline(finger1.y) });\n positions.push({ x: xy[1].x(0), y: xy[1].y(0) });\n }\n let startTime = performance.now();\n const { width, height } = this[$scene];\n const rect = this.getBoundingClientRect();\n const dispatchTouches = (type) => {\n for (const [i, position] of positions.entries()) {\n const { style } = fingerElements[i];\n style.transform = `translateX(${width * position.x}px) translateY(${height * position.y}px)`;\n if (type === 'pointerdown') {\n style.opacity = '1';\n }\n else if (type === 'pointerup') {\n style.opacity = '0';\n }\n const init = {\n pointerId: i - 5678, // help ensure uniqueness\n pointerType: 'touch',\n target: inputElement,\n clientX: width * position.x + rect.x,\n clientY: height * position.y + rect.y,\n altKey: true // flag that this is not a user interaction\n };\n inputElement.dispatchEvent(new PointerEvent(type, init));\n }\n };\n const moveTouches = () => {\n // Cancel interaction if something else moves the camera or input is\n // removed from the DOM.\n const changeSource = this[$cancellationSource];\n if (changeSource !== ChangeSource.AUTOMATIC ||\n !inputElement.isConnected) {\n for (const fingerElement of this[$fingerAnimatedContainers]) {\n fingerElement.style.opacity = '0';\n }\n dispatchTouches('pointercancel');\n this.dispatchEvent(new CustomEvent('interact-stopped', { detail: { source: changeSource } }));\n document.removeEventListener('visibilitychange', onVisibilityChange);\n return;\n }\n const time = Math.min(1, (performance.now() - startTime) / duration);\n for (const [i, position] of positions.entries()) {\n position.x = xy[i].x(time);\n position.y = xy[i].y(time);\n }\n dispatchTouches('pointermove');\n if (time < 1) {\n requestAnimationFrame(moveTouches);\n }\n else {\n dispatchTouches('pointerup');\n this.dispatchEvent(new CustomEvent('interact-stopped', { detail: { source: ChangeSource.AUTOMATIC } }));\n document.removeEventListener('visibilitychange', onVisibilityChange);\n }\n };\n const onVisibilityChange = () => {\n let elapsed = 0;\n if (document.visibilityState === 'hidden') {\n elapsed = performance.now() - startTime;\n }\n else {\n startTime = performance.now() - elapsed;\n }\n };\n document.addEventListener('visibilitychange', onVisibilityChange);\n dispatchTouches('pointerdown');\n this[$cancellationSource] = ChangeSource.AUTOMATIC;\n requestAnimationFrame(moveTouches);\n }\n [(_a = $promptElement, _b = $promptAnimatedContainer, _c = $fingerAnimatedContainers, _d = $panElement, _e = $lastPromptOffset, _f = $promptElementVisibleTime, _g = $userHasInteracted, _h = $waitingToPromptUser, _j = $cancellationSource, _k = $controls, _l = $lastSpherical, _m = $jumpCamera, _o = $initialized, _p = $maintainThetaPhi, _q = $a11y, $syncFieldOfView)](style) {\n const controls = this[$controls];\n const scene = this[$scene];\n scene.framedFoVDeg = style[0] * 180 / Math.PI;\n controls.changeSource = ChangeSource.NONE;\n controls.setFieldOfView(scene.adjustedFoV(scene.framedFoVDeg));\n this[$cancelPrompts]();\n }\n [$syncCameraOrbit](style) {\n const controls = this[$controls];\n if (this[$maintainThetaPhi]) {\n const { theta, phi } = this.getCameraOrbit();\n style[0] = theta;\n style[1] = phi;\n this[$maintainThetaPhi] = false;\n }\n controls.changeSource = ChangeSource.NONE;\n controls.setOrbit(style[0], style[1], style[2]);\n this[$cancelPrompts]();\n }\n [$syncMinCameraOrbit](style) {\n this[$controls].applyOptions({\n minimumAzimuthalAngle: style[0],\n minimumPolarAngle: style[1],\n minimumRadius: style[2]\n });\n this.jumpCameraToGoal();\n }\n [$syncMaxCameraOrbit](style) {\n this[$controls].applyOptions({\n maximumAzimuthalAngle: style[0],\n maximumPolarAngle: style[1],\n maximumRadius: style[2]\n });\n this[$updateCameraForRadius](style[2]);\n this.jumpCameraToGoal();\n }\n [$syncMinFieldOfView](style) {\n this[$controls].applyOptions({ minimumFieldOfView: style[0] * 180 / Math.PI });\n this.jumpCameraToGoal();\n }\n [$syncMaxFieldOfView](style) {\n const fov = this[$scene].adjustedFoV(style[0] * 180 / Math.PI);\n this[$controls].applyOptions({ maximumFieldOfView: fov });\n this.jumpCameraToGoal();\n }\n [$syncCameraTarget](style) {\n const [x, y, z] = style;\n if (!this[$renderer].arRenderer.isPresenting) {\n this[$scene].setTarget(x, y, z);\n }\n this[$controls].changeSource = ChangeSource.NONE;\n this[$renderer].arRenderer.updateTarget();\n this[$cancelPrompts]();\n }\n [$tick](time, delta) {\n super[$tick](time, delta);\n if (this[$renderer].isPresenting || !this[$getModelIsVisible]()) {\n return;\n }\n const controls = this[$controls];\n const scene = this[$scene];\n const now = performance.now();\n if (this[$waitingToPromptUser]) {\n if (this.loaded &&\n now > this[$loadedTime] + this.interactionPromptThreshold) {\n this[$waitingToPromptUser] = false;\n this[$promptElementVisibleTime] = now;\n this[$promptElement].classList.add('visible');\n }\n }\n if (isFinite(this[$promptElementVisibleTime]) &&\n this.interactionPromptStyle === InteractionPromptStyle.WIGGLE) {\n const animationTime = ((now - this[$promptElementVisibleTime]) / PROMPT_ANIMATION_TIME) %\n 1;\n const offset = wiggle(animationTime);\n const opacity = fade(animationTime);\n this[$promptAnimatedContainer].style.opacity = `${opacity}`;\n if (offset !== this[$lastPromptOffset]) {\n const xOffset = offset * scene.width * 0.05;\n const deltaTheta = (offset - this[$lastPromptOffset]) * Math.PI / 16;\n this[$promptAnimatedContainer].style.transform =\n `translateX(${xOffset}px)`;\n controls.changeSource = ChangeSource.AUTOMATIC;\n controls.adjustOrbit(deltaTheta, 0, 0);\n this[$lastPromptOffset] = offset;\n }\n }\n const cameraMoved = controls.update(time, delta);\n const targetMoved = scene.updateTarget(delta);\n if (cameraMoved || targetMoved) {\n this[$onChange]();\n }\n }\n [$deferInteractionPrompt]() {\n // Effectively cancel the timer waiting for user interaction:\n this[$waitingToPromptUser] = false;\n this[$promptElement].classList.remove('visible');\n this[$promptElementVisibleTime] = Infinity;\n }\n /**\n * Updates the camera's near and far planes to enclose the scene when\n * orbiting at the supplied radius.\n */\n [$updateCameraForRadius](radius) {\n const maximumRadius = Math.max(this[$scene].farRadius(), radius);\n const near = 0;\n const far = Math.abs(2 * maximumRadius);\n this[$controls].updateNearFar(near, far);\n }\n [$updateAria]() {\n const { theta, phi } = this[$controls].getCameraSpherical(this[$lastSpherical]);\n const azimuthalQuadrant = (4 + Math.floor(((theta % TAU) + QUARTER_PI) / HALF_PI)) % 4;\n const polarTrient = Math.floor(phi / THIRD_PI);\n const azimuthalQuadrantLabel = AZIMUTHAL_QUADRANT_LABELS[azimuthalQuadrant];\n const polarTrientLabel = POLAR_TRIENT_LABELS[polarTrient];\n const position = `${polarTrientLabel}${azimuthalQuadrantLabel}`;\n const key = position;\n if (key in this[$a11y]) {\n this[$updateStatus](this[$a11y][key]);\n }\n else {\n this[$updateStatus](`View from stage ${position}`);\n }\n }\n get [$ariaLabel]() {\n let interactionPrompt = INTERACTION_PROMPT;\n if ('interaction-prompt' in this[$a11y]) {\n interactionPrompt = `. ${this[$a11y]['interaction-prompt']}`;\n }\n return super[$ariaLabel].replace(/\\.$/, '') +\n (this.cameraControls ? interactionPrompt : '');\n }\n async [$onResize](event) {\n const controls = this[$controls];\n const scene = this[$scene];\n const oldFramedFoV = scene.adjustedFoV(scene.framedFoVDeg);\n // The super of $onResize may update the scene's adjustedFoV, so we\n // compare the before and after to calculate the proper zoom.\n super[$onResize](event);\n const fovRatio = scene.adjustedFoV(scene.framedFoVDeg) / oldFramedFoV;\n const fov = controls.getFieldOfView() * (isFinite(fovRatio) ? fovRatio : 1);\n controls.updateAspect(this[$scene].aspect);\n this.requestUpdate('maxFieldOfView', this.maxFieldOfView);\n await this.updateComplete;\n this[$controls].setFieldOfView(fov);\n this.jumpCameraToGoal();\n }\n [$onModelLoad]() {\n super[$onModelLoad]();\n if (this[$initialized]) {\n this[$maintainThetaPhi] = true;\n }\n else {\n this[$initialized] = true;\n }\n this.requestUpdate('maxFieldOfView', this.maxFieldOfView);\n this.requestUpdate('fieldOfView', this.fieldOfView);\n this.requestUpdate('minCameraOrbit', this.minCameraOrbit);\n this.requestUpdate('maxCameraOrbit', this.maxCameraOrbit);\n this.requestUpdate('cameraOrbit', this.cameraOrbit);\n this.requestUpdate('cameraTarget', this.cameraTarget);\n this.jumpCameraToGoal();\n }\n [(_r = $cancelPrompts, _s = $onChange, _t = $onPointerChange, $updateA11y)]() {\n if (typeof this.a11y === 'string') {\n if (this.a11y.startsWith('{')) {\n try {\n this[$a11y] = JSON.parse(this.a11y);\n }\n catch (error) {\n console.warn('Error parsing a11y JSON:', error);\n }\n }\n else if (this.a11y.length > 0) {\n console.warn('Error not supported format, should be a JSON string:', this.a11y);\n }\n else {\n this[$a11y] = {};\n }\n }\n else if (typeof this.a11y === 'object' && this.a11y != null) {\n this[$a11y] = Object.assign({}, this.a11y);\n }\n else {\n this[$a11y] = {};\n }\n this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]);\n }\n }\n __decorate([\n property({ type: Boolean, attribute: 'camera-controls' })\n ], ControlsModelViewerElement.prototype, \"cameraControls\", void 0);\n __decorate([\n style({\n intrinsics: cameraOrbitIntrinsics,\n observeEffects: true,\n updateHandler: $syncCameraOrbit\n }),\n property({ type: String, attribute: 'camera-orbit', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"cameraOrbit\", void 0);\n __decorate([\n style({\n intrinsics: cameraTargetIntrinsics,\n observeEffects: true,\n updateHandler: $syncCameraTarget\n }),\n property({ type: String, attribute: 'camera-target', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"cameraTarget\", void 0);\n __decorate([\n style({\n intrinsics: fieldOfViewIntrinsics,\n observeEffects: true,\n updateHandler: $syncFieldOfView\n }),\n property({ type: String, attribute: 'field-of-view', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"fieldOfView\", void 0);\n __decorate([\n style({\n intrinsics: minCameraOrbitIntrinsics,\n updateHandler: $syncMinCameraOrbit\n }),\n property({ type: String, attribute: 'min-camera-orbit', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"minCameraOrbit\", void 0);\n __decorate([\n style({\n intrinsics: maxCameraOrbitIntrinsics,\n updateHandler: $syncMaxCameraOrbit\n }),\n property({ type: String, attribute: 'max-camera-orbit', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"maxCameraOrbit\", void 0);\n __decorate([\n style({\n intrinsics: minFieldOfViewIntrinsics,\n updateHandler: $syncMinFieldOfView\n }),\n property({ type: String, attribute: 'min-field-of-view', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"minFieldOfView\", void 0);\n __decorate([\n style({ intrinsics: fieldOfViewIntrinsics, updateHandler: $syncMaxFieldOfView }),\n property({ type: String, attribute: 'max-field-of-view', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"maxFieldOfView\", void 0);\n __decorate([\n property({ type: Number, attribute: 'interaction-prompt-threshold' })\n ], ControlsModelViewerElement.prototype, \"interactionPromptThreshold\", void 0);\n __decorate([\n property({ type: String, attribute: 'interaction-prompt' })\n ], ControlsModelViewerElement.prototype, \"interactionPrompt\", void 0);\n __decorate([\n property({ type: String, attribute: 'interaction-prompt-style' })\n ], ControlsModelViewerElement.prototype, \"interactionPromptStyle\", void 0);\n __decorate([\n property({ type: Number, attribute: 'orbit-sensitivity' })\n ], ControlsModelViewerElement.prototype, \"orbitSensitivity\", void 0);\n __decorate([\n property({ type: Number, attribute: 'zoom-sensitivity' })\n ], ControlsModelViewerElement.prototype, \"zoomSensitivity\", void 0);\n __decorate([\n property({ type: Number, attribute: 'pan-sensitivity' })\n ], ControlsModelViewerElement.prototype, \"panSensitivity\", void 0);\n __decorate([\n property({ type: String, attribute: 'touch-action' })\n ], ControlsModelViewerElement.prototype, \"touchAction\", void 0);\n __decorate([\n property({ type: Boolean, attribute: 'disable-zoom' })\n ], ControlsModelViewerElement.prototype, \"disableZoom\", void 0);\n __decorate([\n property({ type: Boolean, attribute: 'disable-pan' })\n ], ControlsModelViewerElement.prototype, \"disablePan\", void 0);\n __decorate([\n property({ type: Boolean, attribute: 'disable-tap' })\n ], ControlsModelViewerElement.prototype, \"disableTap\", void 0);\n __decorate([\n property({ type: Number, attribute: 'interpolation-decay' })\n ], ControlsModelViewerElement.prototype, \"interpolationDecay\", void 0);\n __decorate([\n property()\n ], ControlsModelViewerElement.prototype, \"a11y\", void 0);\n return ControlsModelViewerElement;\n};\n//# sourceMappingURL=controls.js.map","/* @license\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Euler, EventDispatcher, Matrix3, Spherical, Vector2, Vector3 } from 'three';\nimport { $panElement } from '../features/controls.js';\nimport { clamp } from '../utilities.js';\nimport { Damper, SETTLING_TIME } from './Damper.js';\nconst PAN_SENSITIVITY = 0.018;\nconst TAP_DISTANCE = 2;\nconst TAP_MS = 300;\nconst vector2 = new Vector2();\nconst vector3 = new Vector3();\nexport const DEFAULT_OPTIONS = Object.freeze({\n minimumRadius: 0,\n maximumRadius: Infinity,\n minimumPolarAngle: 0,\n maximumPolarAngle: Math.PI,\n minimumAzimuthalAngle: -Infinity,\n maximumAzimuthalAngle: Infinity,\n minimumFieldOfView: 10,\n maximumFieldOfView: 45,\n touchAction: 'none'\n});\n// Constants\nconst KEYBOARD_ORBIT_INCREMENT = Math.PI / 8;\nconst ZOOM_SENSITIVITY = 0.04;\n// The move size on pan key event\nconst PAN_KEY_INCREMENT = 10;\nexport const KeyCode = {\n PAGE_UP: 33,\n PAGE_DOWN: 34,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40\n};\nexport const ChangeSource = {\n USER_INTERACTION: 'user-interaction',\n NONE: 'none',\n AUTOMATIC: 'automatic'\n};\n/**\n * SmoothControls is a Three.js helper for adding delightful pointer and\n * keyboard-based input to a staged Three.js scene. Its API is very similar to\n * OrbitControls, but it offers more opinionated (subjectively more delightful)\n * defaults, easy extensibility and subjectively better out-of-the-box keyboard\n * support.\n *\n * One important change compared to OrbitControls is that the `update` method\n * of SmoothControls must be invoked on every frame, otherwise the controls\n * will not have an effect.\n *\n * Another notable difference compared to OrbitControls is that SmoothControls\n * does not currently support panning (but probably will in a future revision).\n *\n * Like OrbitControls, SmoothControls assumes that the orientation of the camera\n * has been set in terms of position, rotation and scale, so it is important to\n * ensure that the camera's matrixWorld is in sync before using SmoothControls.\n */\nexport class SmoothControls extends EventDispatcher {\n constructor(camera, element, scene) {\n super();\n this.camera = camera;\n this.element = element;\n this.scene = scene;\n this.orbitSensitivity = 1;\n this.zoomSensitivity = 1;\n this.panSensitivity = 1;\n this.inputSensitivity = 1;\n this.changeSource = ChangeSource.NONE;\n this._interactionEnabled = false;\n this._disableZoom = false;\n this.isUserPointing = false;\n // Pan state\n this.enablePan = true;\n this.enableTap = true;\n this.panProjection = new Matrix3();\n this.panPerPixel = 0;\n // Internal orbital position state\n this.spherical = new Spherical();\n this.goalSpherical = new Spherical();\n this.thetaDamper = new Damper();\n this.phiDamper = new Damper();\n this.radiusDamper = new Damper();\n this.logFov = Math.log(DEFAULT_OPTIONS.maximumFieldOfView);\n this.goalLogFov = this.logFov;\n this.fovDamper = new Damper();\n // Pointer state\n this.touchMode = null;\n this.pointers = [];\n this.startTime = 0;\n this.startPointerPosition = { clientX: 0, clientY: 0 };\n this.lastSeparation = 0;\n this.touchDecided = false;\n this.onContext = (event) => {\n if (this.enablePan) {\n event.preventDefault();\n }\n else {\n for (const pointer of this.pointers) {\n // Required because of a common browser bug where the context menu never\n // fires a pointercancel event.\n this.onPointerUp(new PointerEvent('pointercancel', Object.assign(Object.assign({}, this.startPointerPosition), { pointerId: pointer.id })));\n }\n }\n };\n this.touchModeZoom = (dx, dy) => {\n if (!this._disableZoom) {\n const touchDistance = this.twoTouchDistance(this.pointers[0], this.pointers[1]);\n const deltaZoom = ZOOM_SENSITIVITY * this.zoomSensitivity *\n (this.lastSeparation - touchDistance) * 50 / this.scene.height;\n this.lastSeparation = touchDistance;\n this.userAdjustOrbit(0, 0, deltaZoom);\n }\n if (this.panPerPixel > 0) {\n this.movePan(dx, dy);\n }\n };\n // We implement our own version of the browser's CSS touch-action, enforced by\n // this function, because the iOS implementation of pan-y is bad and doesn't\n // match Android. Specifically, even if a touch gesture begins by panning X,\n // iOS will switch to scrolling as soon as the gesture moves in the Y, rather\n // than staying in the same mode until the end of the gesture.\n this.disableScroll = (event) => {\n event.preventDefault();\n };\n this.touchModeRotate = (dx, dy) => {\n const { touchAction } = this._options;\n if (!this.touchDecided && touchAction !== 'none') {\n this.touchDecided = true;\n const dxMag = Math.abs(dx);\n const dyMag = Math.abs(dy);\n // If motion is mostly vertical, assume scrolling is the intent.\n if (this.changeSource === ChangeSource.USER_INTERACTION &&\n ((touchAction === 'pan-y' && dyMag > dxMag) ||\n (touchAction === 'pan-x' && dxMag > dyMag))) {\n this.touchMode = null;\n return;\n }\n else {\n this.element.addEventListener('touchmove', this.disableScroll, { passive: false });\n }\n }\n this.handleSinglePointerMove(dx, dy);\n };\n this.onPointerDown = (event) => {\n if (this.pointers.length > 2) {\n return;\n }\n const { element } = this;\n if (this.pointers.length === 0) {\n element.addEventListener('pointermove', this.onPointerMove);\n element.addEventListener('pointerup', this.onPointerUp);\n this.touchMode = null;\n this.touchDecided = false;\n this.startPointerPosition.clientX = event.clientX;\n this.startPointerPosition.clientY = event.clientY;\n this.startTime = performance.now();\n }\n try {\n element.setPointerCapture(event.pointerId);\n }\n catch (_a) {\n }\n this.pointers.push({ clientX: event.clientX, clientY: event.clientY, id: event.pointerId });\n this.isUserPointing = false;\n if (event.pointerType === 'touch') {\n this.changeSource = event.altKey ? // set by interact() in controls.ts\n ChangeSource.AUTOMATIC :\n ChangeSource.USER_INTERACTION;\n this.onTouchChange(event);\n }\n else {\n this.changeSource = ChangeSource.USER_INTERACTION;\n this.onMouseDown(event);\n }\n if (this.changeSource === ChangeSource.USER_INTERACTION) {\n this.dispatchEvent({ type: 'user-interaction' });\n }\n };\n this.onPointerMove = (event) => {\n const pointer = this.pointers.find((pointer) => pointer.id === event.pointerId);\n if (pointer == null) {\n return;\n }\n // In case no one gave us a pointerup or pointercancel event.\n if (event.pointerType === 'mouse' && event.buttons === 0) {\n this.onPointerUp(event);\n return;\n }\n const numTouches = this.pointers.length;\n const dx = (event.clientX - pointer.clientX) / numTouches;\n const dy = (event.clientY - pointer.clientY) / numTouches;\n if (dx === 0 && dy === 0) {\n return;\n }\n pointer.clientX = event.clientX;\n pointer.clientY = event.clientY;\n if (event.pointerType === 'touch') {\n this.changeSource = event.altKey ? // set by interact() in controls.ts\n ChangeSource.AUTOMATIC :\n ChangeSource.USER_INTERACTION;\n if (this.touchMode !== null) {\n this.touchMode(dx, dy);\n }\n }\n else {\n this.changeSource = ChangeSource.USER_INTERACTION;\n if (this.panPerPixel > 0) {\n this.movePan(dx, dy);\n }\n else {\n this.handleSinglePointerMove(dx, dy);\n }\n }\n };\n this.onPointerUp = (event) => {\n const { element } = this;\n const index = this.pointers.findIndex((pointer) => pointer.id === event.pointerId);\n if (index !== -1) {\n this.pointers.splice(index, 1);\n }\n // altKey indicates an interaction prompt; don't reset radius in this case\n // as it will cause the camera to drift.\n if (this.panPerPixel > 0 && !event.altKey) {\n this.resetRadius();\n }\n if (this.pointers.length === 0) {\n element.removeEventListener('pointermove', this.onPointerMove);\n element.removeEventListener('pointerup', this.onPointerUp);\n element.removeEventListener('touchmove', this.disableScroll);\n if (this.enablePan && this.enableTap) {\n this.recenter(event);\n }\n }\n else if (this.touchMode !== null) {\n this.onTouchChange(event);\n }\n this.scene.element[$panElement].style.opacity = 0;\n element.style.cursor = 'grab';\n this.panPerPixel = 0;\n if (this.isUserPointing) {\n this.dispatchEvent({ type: 'pointer-change-end' });\n }\n };\n this.onWheel = (event) => {\n this.changeSource = ChangeSource.USER_INTERACTION;\n const deltaZoom = event.deltaY *\n (event.deltaMode == 1 ? 18 : 1) * ZOOM_SENSITIVITY *\n this.zoomSensitivity / 30;\n this.userAdjustOrbit(0, 0, deltaZoom);\n event.preventDefault();\n this.dispatchEvent({ type: 'user-interaction' });\n };\n this.onKeyDown = (event) => {\n // We track if the key is actually one we respond to, so as not to\n // accidentally clobber unrelated key inputs when the has\n // focus.\n const { changeSource } = this;\n this.changeSource = ChangeSource.USER_INTERACTION;\n const relevantKey = (event.shiftKey && this.enablePan) ?\n this.panKeyCodeHandler(event) :\n this.orbitZoomKeyCodeHandler(event);\n if (relevantKey) {\n event.preventDefault();\n this.dispatchEvent({ type: 'user-interaction' });\n }\n else {\n this.changeSource = changeSource;\n }\n };\n this._options = Object.assign({}, DEFAULT_OPTIONS);\n this.setOrbit(0, Math.PI / 2, 1);\n this.setFieldOfView(100);\n this.jumpToGoal();\n }\n get interactionEnabled() {\n return this._interactionEnabled;\n }\n enableInteraction() {\n if (this._interactionEnabled === false) {\n const { element } = this;\n element.addEventListener('pointerdown', this.onPointerDown);\n element.addEventListener('pointercancel', this.onPointerUp);\n if (!this._disableZoom) {\n element.addEventListener('wheel', this.onWheel);\n }\n element.addEventListener('keydown', this.onKeyDown);\n // This little beauty is to work around a WebKit bug that otherwise makes\n // touch events randomly not cancelable.\n element.addEventListener('touchmove', () => { }, { passive: false });\n element.addEventListener('contextmenu', this.onContext);\n this.element.style.cursor = 'grab';\n this._interactionEnabled = true;\n this.updateTouchActionStyle();\n }\n }\n disableInteraction() {\n if (this._interactionEnabled === true) {\n const { element } = this;\n element.removeEventListener('pointerdown', this.onPointerDown);\n element.removeEventListener('pointermove', this.onPointerMove);\n element.removeEventListener('pointerup', this.onPointerUp);\n element.removeEventListener('pointercancel', this.onPointerUp);\n element.removeEventListener('wheel', this.onWheel);\n element.removeEventListener('keydown', this.onKeyDown);\n element.removeEventListener('contextmenu', this.onContext);\n element.style.cursor = '';\n this.touchMode = null;\n this._interactionEnabled = false;\n this.updateTouchActionStyle();\n }\n }\n /**\n * The options that are currently configured for the controls instance.\n */\n get options() {\n return this._options;\n }\n set disableZoom(disable) {\n if (this._disableZoom != disable) {\n this._disableZoom = disable;\n if (disable === true) {\n this.element.removeEventListener('wheel', this.onWheel);\n }\n else {\n this.element.addEventListener('wheel', this.onWheel);\n }\n this.updateTouchActionStyle();\n }\n }\n /**\n * Copy the spherical values that represent the current camera orbital\n * position relative to the configured target into a provided Spherical\n * instance. If no Spherical is provided, a new Spherical will be allocated\n * to copy the values into. The Spherical that values are copied into is\n * returned.\n */\n getCameraSpherical(target = new Spherical()) {\n return target.copy(this.spherical);\n }\n /**\n * Returns the camera's current vertical field of view in degrees.\n */\n getFieldOfView() {\n return this.camera.fov;\n }\n /**\n * Configure the _options of the controls. Configured _options will be\n * merged with whatever _options have already been configured for this\n * controls instance.\n */\n applyOptions(_options) {\n Object.assign(this._options, _options);\n // Re-evaluates clamping based on potentially new values for min/max\n // polar, azimuth and radius:\n this.setOrbit();\n this.setFieldOfView(Math.exp(this.goalLogFov));\n }\n /**\n * Sets the near and far planes of the camera.\n */\n updateNearFar(nearPlane, farPlane) {\n this.camera.far = farPlane === 0 ? 2 : farPlane;\n this.camera.near = Math.max(nearPlane, this.camera.far / 1000);\n this.camera.updateProjectionMatrix();\n }\n /**\n * Sets the aspect ratio of the camera\n */\n updateAspect(aspect) {\n this.camera.aspect = aspect;\n this.camera.updateProjectionMatrix();\n }\n /**\n * Set the absolute orbital goal of the camera. The change will be\n * applied over a number of frames depending on configured acceleration and\n * dampening _options.\n *\n * Returns true if invoking the method will result in the camera changing\n * position and/or rotation, otherwise false.\n */\n setOrbit(goalTheta = this.goalSpherical.theta, goalPhi = this.goalSpherical.phi, goalRadius = this.goalSpherical.radius) {\n const { minimumAzimuthalAngle, maximumAzimuthalAngle, minimumPolarAngle, maximumPolarAngle, minimumRadius, maximumRadius } = this._options;\n const { theta, phi, radius } = this.goalSpherical;\n const nextTheta = clamp(goalTheta, minimumAzimuthalAngle, maximumAzimuthalAngle);\n if (!isFinite(minimumAzimuthalAngle) &&\n !isFinite(maximumAzimuthalAngle)) {\n this.spherical.theta =\n this.wrapAngle(this.spherical.theta - nextTheta) + nextTheta;\n }\n const nextPhi = clamp(goalPhi, minimumPolarAngle, maximumPolarAngle);\n const nextRadius = clamp(goalRadius, minimumRadius, maximumRadius);\n if (nextTheta === theta && nextPhi === phi && nextRadius === radius) {\n return false;\n }\n if (!isFinite(nextTheta) || !isFinite(nextPhi) || !isFinite(nextRadius)) {\n return false;\n }\n this.goalSpherical.theta = nextTheta;\n this.goalSpherical.phi = nextPhi;\n this.goalSpherical.radius = nextRadius;\n this.goalSpherical.makeSafe();\n return true;\n }\n /**\n * Subset of setOrbit() above, which only sets the camera's radius.\n */\n setRadius(radius) {\n this.goalSpherical.radius = radius;\n this.setOrbit();\n }\n /**\n * Sets the goal field of view for the camera\n */\n setFieldOfView(fov) {\n const { minimumFieldOfView, maximumFieldOfView } = this._options;\n fov = clamp(fov, minimumFieldOfView, maximumFieldOfView);\n this.goalLogFov = Math.log(fov);\n }\n /**\n * Sets the smoothing decay time.\n */\n setDamperDecayTime(decayMilliseconds) {\n this.thetaDamper.setDecayTime(decayMilliseconds);\n this.phiDamper.setDecayTime(decayMilliseconds);\n this.radiusDamper.setDecayTime(decayMilliseconds);\n this.fovDamper.setDecayTime(decayMilliseconds);\n }\n /**\n * Adjust the orbital position of the camera relative to its current orbital\n * position. Does not let the theta goal get more than pi ahead of the current\n * theta, which ensures interpolation continues in the direction of the delta.\n * The deltaZoom parameter adjusts both the field of view and the orbit radius\n * such that they progress across their allowed ranges in sync.\n */\n adjustOrbit(deltaTheta, deltaPhi, deltaZoom) {\n const { theta, phi, radius } = this.goalSpherical;\n const { minimumRadius, maximumRadius, minimumFieldOfView, maximumFieldOfView } = this._options;\n const dTheta = this.spherical.theta - theta;\n const dThetaLimit = Math.PI - 0.001;\n const goalTheta = theta - clamp(deltaTheta, -dThetaLimit - dTheta, dThetaLimit - dTheta);\n const goalPhi = phi - deltaPhi;\n const deltaRatio = deltaZoom === 0 ?\n 0 :\n ((deltaZoom > 0 ? maximumRadius : minimumRadius) - radius) /\n (Math.log(deltaZoom > 0 ? maximumFieldOfView : minimumFieldOfView) -\n this.goalLogFov);\n const goalRadius = radius +\n deltaZoom *\n (isFinite(deltaRatio) ? deltaRatio :\n (maximumRadius - minimumRadius) * 2);\n this.setOrbit(goalTheta, goalPhi, goalRadius);\n if (deltaZoom !== 0) {\n const goalLogFov = this.goalLogFov + deltaZoom;\n this.setFieldOfView(Math.exp(goalLogFov));\n }\n }\n /**\n * Move the camera instantly instead of accelerating toward the goal\n * parameters.\n */\n jumpToGoal() {\n this.update(0, SETTLING_TIME);\n }\n /**\n * Update controls. In most cases, this will result in the camera\n * interpolating its position and rotation until it lines up with the\n * designated goal orbital position. Returns false if the camera did not move.\n *\n * Time and delta are measured in milliseconds.\n */\n update(_time, delta) {\n if (this.isStationary()) {\n return false;\n }\n const { maximumPolarAngle, maximumRadius } = this._options;\n const dTheta = this.spherical.theta - this.goalSpherical.theta;\n if (Math.abs(dTheta) > Math.PI &&\n !isFinite(this._options.minimumAzimuthalAngle) &&\n !isFinite(this._options.maximumAzimuthalAngle)) {\n this.spherical.theta -= Math.sign(dTheta) * 2 * Math.PI;\n }\n this.spherical.theta = this.thetaDamper.update(this.spherical.theta, this.goalSpherical.theta, delta, Math.PI);\n this.spherical.phi = this.phiDamper.update(this.spherical.phi, this.goalSpherical.phi, delta, maximumPolarAngle);\n this.spherical.radius = this.radiusDamper.update(this.spherical.radius, this.goalSpherical.radius, delta, maximumRadius);\n this.logFov = this.fovDamper.update(this.logFov, this.goalLogFov, delta, 1);\n this.moveCamera();\n return true;\n }\n updateTouchActionStyle() {\n const { style } = this.element;\n if (this._interactionEnabled) {\n const { touchAction } = this._options;\n if (this._disableZoom && touchAction !== 'none') {\n style.touchAction = 'manipulation';\n }\n else {\n style.touchAction = touchAction;\n }\n }\n else {\n style.touchAction = '';\n }\n }\n isStationary() {\n return this.goalSpherical.theta === this.spherical.theta &&\n this.goalSpherical.phi === this.spherical.phi &&\n this.goalSpherical.radius === this.spherical.radius &&\n this.goalLogFov === this.logFov;\n }\n moveCamera() {\n // Derive the new camera position from the updated spherical:\n this.spherical.makeSafe();\n this.camera.position.setFromSpherical(this.spherical);\n this.camera.setRotationFromEuler(new Euler(this.spherical.phi - Math.PI / 2, this.spherical.theta, 0, 'YXZ'));\n if (this.camera.fov !== Math.exp(this.logFov)) {\n this.camera.fov = Math.exp(this.logFov);\n this.camera.updateProjectionMatrix();\n }\n }\n userAdjustOrbit(deltaTheta, deltaPhi, deltaZoom) {\n this.adjustOrbit(deltaTheta * this.orbitSensitivity * this.inputSensitivity, deltaPhi * this.orbitSensitivity * this.inputSensitivity, deltaZoom * this.inputSensitivity);\n }\n // Wraps to between -pi and pi\n wrapAngle(radians) {\n const normalized = (radians + Math.PI) / (2 * Math.PI);\n const wrapped = normalized - Math.floor(normalized);\n return wrapped * 2 * Math.PI - Math.PI;\n }\n pixelLengthToSphericalAngle(pixelLength) {\n return 2 * Math.PI * pixelLength / this.scene.height;\n }\n twoTouchDistance(touchOne, touchTwo) {\n const { clientX: xOne, clientY: yOne } = touchOne;\n const { clientX: xTwo, clientY: yTwo } = touchTwo;\n const xDelta = xTwo - xOne;\n const yDelta = yTwo - yOne;\n return Math.sqrt(xDelta * xDelta + yDelta * yDelta);\n }\n handleSinglePointerMove(dx, dy) {\n const deltaTheta = this.pixelLengthToSphericalAngle(dx);\n const deltaPhi = this.pixelLengthToSphericalAngle(dy);\n if (this.isUserPointing === false) {\n this.isUserPointing = true;\n this.dispatchEvent({ type: 'pointer-change-start' });\n }\n this.userAdjustOrbit(deltaTheta, deltaPhi, 0);\n }\n initializePan() {\n const { theta, phi } = this.spherical;\n const psi = theta - this.scene.yaw;\n this.panPerPixel =\n PAN_SENSITIVITY * this.panSensitivity / this.scene.height;\n this.panProjection.set(-Math.cos(psi), -Math.cos(phi) * Math.sin(psi), 0, 0, Math.sin(phi), 0, Math.sin(psi), -Math.cos(phi) * Math.cos(psi), 0);\n }\n movePan(dx, dy) {\n const { scene } = this;\n const dxy = vector3.set(dx, dy, 0).multiplyScalar(this.inputSensitivity);\n const metersPerPixel = this.spherical.radius * Math.exp(this.logFov) * this.panPerPixel;\n dxy.multiplyScalar(metersPerPixel);\n const target = scene.getTarget();\n target.add(dxy.applyMatrix3(this.panProjection));\n scene.boundingSphere.clampPoint(target, target);\n scene.setTarget(target.x, target.y, target.z);\n }\n recenter(pointer) {\n if (performance.now() > this.startTime + TAP_MS ||\n Math.abs(pointer.clientX - this.startPointerPosition.clientX) >\n TAP_DISTANCE ||\n Math.abs(pointer.clientY - this.startPointerPosition.clientY) >\n TAP_DISTANCE) {\n return;\n }\n const { scene } = this;\n const hit = scene.positionAndNormalFromPoint(scene.getNDC(pointer.clientX, pointer.clientY));\n if (hit == null) {\n const { cameraTarget } = scene.element;\n scene.element.cameraTarget = '';\n scene.element.cameraTarget = cameraTarget;\n // Zoom all the way out.\n this.userAdjustOrbit(0, 0, 1);\n }\n else {\n scene.target.worldToLocal(hit.position);\n scene.setTarget(hit.position.x, hit.position.y, hit.position.z);\n }\n }\n resetRadius() {\n const { scene } = this;\n const hit = scene.positionAndNormalFromPoint(vector2.set(0, 0));\n if (hit == null) {\n return;\n }\n scene.target.worldToLocal(hit.position);\n const goalTarget = scene.getTarget();\n const { theta, phi } = this.spherical;\n // Set target to surface hit point, except the target is still settling,\n // so offset the goal accordingly so the transition is smooth even though\n // this will drift the target slightly away from the hit point.\n const psi = theta - scene.yaw;\n const n = vector3.set(Math.sin(phi) * Math.sin(psi), Math.cos(phi), Math.sin(phi) * Math.cos(psi));\n const dr = n.dot(hit.position.sub(goalTarget));\n goalTarget.add(n.multiplyScalar(dr));\n scene.setTarget(goalTarget.x, goalTarget.y, goalTarget.z);\n // Change the camera radius to match the change in target so that the\n // camera itself does not move, unless it hits a radius bound.\n this.setOrbit(undefined, undefined, this.goalSpherical.radius - dr);\n }\n onTouchChange(event) {\n if (this.pointers.length === 1) {\n this.touchMode = this.touchModeRotate;\n }\n else {\n if (this._disableZoom) {\n this.touchMode = null;\n this.element.removeEventListener('touchmove', this.disableScroll);\n return;\n }\n this.touchMode = (this.touchDecided && this.touchMode === null) ?\n null :\n this.touchModeZoom;\n this.touchDecided = true;\n this.element.addEventListener('touchmove', this.disableScroll, { passive: false });\n this.lastSeparation =\n this.twoTouchDistance(this.pointers[0], this.pointers[1]);\n if (this.enablePan && this.touchMode != null) {\n this.initializePan();\n if (!event.altKey) { // user interaction, not prompt\n this.scene.element[$panElement].style.opacity = 1;\n }\n }\n }\n }\n onMouseDown(event) {\n this.panPerPixel = 0;\n if (this.enablePan &&\n (event.button === 2 || event.ctrlKey || event.metaKey ||\n event.shiftKey)) {\n this.initializePan();\n this.scene.element[$panElement].style.opacity = 1;\n }\n this.element.style.cursor = 'grabbing';\n }\n /**\n * Handles the orbit and Zoom key presses\n * Uses constants for the increment.\n * @param event The keyboard event for the .key value\n * @returns boolean to indicate if the key event has been handled\n */\n orbitZoomKeyCodeHandler(event) {\n let relevantKey = true;\n switch (event.key) {\n case 'PageUp':\n this.userAdjustOrbit(0, 0, ZOOM_SENSITIVITY * this.zoomSensitivity);\n break;\n case 'PageDown':\n this.userAdjustOrbit(0, 0, -1 * ZOOM_SENSITIVITY * this.zoomSensitivity);\n break;\n case 'ArrowUp':\n this.userAdjustOrbit(0, -KEYBOARD_ORBIT_INCREMENT, 0);\n break;\n case 'ArrowDown':\n this.userAdjustOrbit(0, KEYBOARD_ORBIT_INCREMENT, 0);\n break;\n case 'ArrowLeft':\n this.userAdjustOrbit(-KEYBOARD_ORBIT_INCREMENT, 0, 0);\n break;\n case 'ArrowRight':\n this.userAdjustOrbit(KEYBOARD_ORBIT_INCREMENT, 0, 0);\n break;\n default:\n relevantKey = false;\n break;\n }\n return relevantKey;\n }\n /**\n * Handles the Pan key presses\n * Uses constants for the increment.\n * @param event The keyboard event for the .key value\n * @returns boolean to indicate if the key event has been handled\n */\n panKeyCodeHandler(event) {\n this.initializePan();\n let relevantKey = true;\n switch (event.key) {\n case 'ArrowUp':\n this.movePan(0, -1 * PAN_KEY_INCREMENT); // This is the negative one so that the\n // model appears to move as the arrow\n // direction rather than the view moving\n break;\n case 'ArrowDown':\n this.movePan(0, PAN_KEY_INCREMENT);\n break;\n case 'ArrowLeft':\n this.movePan(-1 * PAN_KEY_INCREMENT, 0);\n break;\n case 'ArrowRight':\n this.movePan(PAN_KEY_INCREMENT, 0);\n break;\n default:\n relevantKey = false;\n break;\n }\n return relevantKey;\n }\n}\n//# sourceMappingURL=SmoothControls.js.map","import { CanvasTexture, Mesh, Object3D, Shape, ShapeGeometry, LinearFilter, MeshBasicMaterial, PlaneGeometry, Vector3 } from 'three';\nimport { Damper } from './Damper.js';\n// SVG strings for the icons are defined here to avoid io and better performance for xr.\nconst CLOSE_ICON_SVG = `\n \n`;\nconst VIEW_REAL_SIZE_ICON_SVG = `\n \n`;\nconst REPLAY_ICON_SVG = `\n \n \n \n \n \n \n \n \n`;\n// Panel configuration\nconst PANEL_CONFIG = {\n width: 0.16,\n height: 0.07,\n cornerRadius: 0.03,\n opacity: 1,\n color: 0x000000,\n // Distance-based scaling configuration\n minDistance: 0.5, // Minimum distance for scaling (meters)\n maxDistance: 10.0, // Maximum distance for scaling (meters)\n baseScale: 1.0, // Base scale factor\n distanceScaleFactor: 0.3 // How much to scale per meter of distance\n};\n// Button configuration\nconst BUTTON_CONFIG = {\n size: 0.05, // Fixed size for all buttons\n zOffset: 0.01, // Distance from panel surface\n spacing: 0.07 // Space between button centers\n};\n// Icon configuration\nconst ICON_CONFIG = {\n canvasSize: 128,\n filter: LinearFilter\n};\nexport class XRMenuPanel extends Object3D {\n constructor() {\n super();\n this.isActualSize = false; // Start with normalized size\n // Pre-render all icons\n this.preRenderIcons();\n this.createPanel();\n this.createButtons();\n this.opacityDamper = new Damper();\n this.goalOpacity = PANEL_CONFIG.opacity;\n }\n createPanel() {\n const panelShape = this.createPanelShape();\n const geometry = new ShapeGeometry(panelShape);\n const material = new MeshBasicMaterial({\n color: PANEL_CONFIG.color,\n opacity: PANEL_CONFIG.opacity,\n transparent: true\n });\n this.panelMesh = new Mesh(geometry, material);\n this.panelMesh.name = 'MenuPanel';\n this.add(this.panelMesh);\n }\n createButtons() {\n // Create exit button\n this.exitButton = this.createButton('close');\n this.exitButton.name = 'ExitButton';\n this.exitButton.position.set(BUTTON_CONFIG.spacing / 2, 0, BUTTON_CONFIG.zOffset);\n this.add(this.exitButton);\n // Create toggle button\n this.toggleButton = this.createButton('view-real-size');\n this.toggleButton.name = 'ToggleButton';\n this.toggleButton.position.set(-BUTTON_CONFIG.spacing / 2, 0, BUTTON_CONFIG.zOffset);\n this.add(this.toggleButton);\n }\n createPanelShape() {\n const shape = new Shape();\n const { width: w, height: h, cornerRadius: r } = PANEL_CONFIG;\n // Create rounded rectangle path\n shape.moveTo(-w / 2 + r, -h / 2);\n shape.lineTo(w / 2 - r, -h / 2);\n shape.quadraticCurveTo(w / 2, -h / 2, w / 2, -h / 2 + r);\n shape.lineTo(w / 2, h / 2 - r);\n shape.quadraticCurveTo(w / 2, h / 2, w / 2 - r, h / 2);\n shape.lineTo(-w / 2 + r, h / 2);\n shape.quadraticCurveTo(-w / 2, h / 2, -w / 2, h / 2 - r);\n shape.lineTo(-w / 2, -h / 2 + r);\n shape.quadraticCurveTo(-w / 2, -h / 2, -w / 2 + r, -h / 2);\n return shape;\n }\n preRenderIcons() {\n const iconSvgs = [\n { key: 'close', svg: CLOSE_ICON_SVG },\n { key: 'view-real-size', svg: VIEW_REAL_SIZE_ICON_SVG },\n { key: 'replay', svg: REPLAY_ICON_SVG }\n ];\n iconSvgs.forEach(({ key, svg }) => {\n if (!XRMenuPanel.iconTextures.has(key)) {\n this.createTextureFromSvg(svg, key);\n }\n });\n }\n createTextureFromSvg(svgContent, key) {\n const canvas = document.createElement('canvas');\n canvas.width = ICON_CONFIG.canvasSize;\n canvas.height = ICON_CONFIG.canvasSize;\n const ctx = canvas.getContext('2d');\n // Create an image from SVG content\n const img = new Image();\n const svgBlob = new Blob([svgContent], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(svgBlob);\n img.onload = () => {\n ctx.drawImage(img, 0, 0, ICON_CONFIG.canvasSize, ICON_CONFIG.canvasSize);\n const texture = new CanvasTexture(canvas);\n texture.needsUpdate = true;\n texture.minFilter = ICON_CONFIG.filter;\n XRMenuPanel.iconTextures.set(key, texture);\n URL.revokeObjectURL(url);\n };\n img.src = url;\n }\n createButton(iconKey) {\n // Create a placeholder mesh\n const material = new MeshBasicMaterial({ transparent: true });\n const geometry = new PlaneGeometry(BUTTON_CONFIG.size, BUTTON_CONFIG.size);\n const mesh = new Mesh(geometry, material);\n // Try to get cached texture, or create a fallback\n const cachedTexture = XRMenuPanel.iconTextures.get(iconKey);\n if (cachedTexture) {\n mesh.material.map = cachedTexture;\n mesh.material.needsUpdate = true;\n }\n else {\n // RACE CONDITION FIX: Texture creation is async (img.onload), but button creation is sync\n // This fallback handles the case where buttons are created before textures finish loading\n this.createTextureFromSvg(iconKey === 'close' ? CLOSE_ICON_SVG :\n iconKey === 'view-real-size' ? VIEW_REAL_SIZE_ICON_SVG :\n REPLAY_ICON_SVG, iconKey);\n // Polling mechanism: Wait for async texture creation to complete\n // This prevents white squares from appearing on first load\n const checkTexture = () => {\n const texture = XRMenuPanel.iconTextures.get(iconKey);\n if (texture) {\n // Texture is ready - apply it to the mesh\n mesh.material.map = texture;\n mesh.material.needsUpdate = true;\n }\n else {\n // Texture not ready yet - check again in 10ms\n setTimeout(checkTexture, 10);\n }\n };\n checkTexture();\n }\n return mesh;\n }\n exitButtonControllerIntersection(scene, controller) {\n const hitResult = scene.hitFromController(controller, this.exitButton);\n return hitResult;\n }\n scaleModeButtonControllerIntersection(scene, controller) {\n const hitResult = scene.hitFromController(controller, this.toggleButton);\n return hitResult;\n }\n handleScaleToggle(worldSpaceInitialPlacementDone, initialModelScale, minScale, maxScale) {\n if (!worldSpaceInitialPlacementDone) {\n return null;\n }\n this.isActualSize = !this.isActualSize;\n // Toggle between view real size icon and replay icon\n // When isActualSize is true, show replay icon (to reset)\n // When isActualSize is false, show view real size icon (to go to actual size)\n const iconKey = this.isActualSize ? 'replay' : 'view-real-size';\n this.updateScaleModeButtonLabel(iconKey);\n const targetScale = this.isActualSize ? 1.0 : initialModelScale;\n const goalScale = Math.max(minScale, Math.min(maxScale, targetScale));\n return goalScale;\n }\n updateScaleModeButtonLabel(iconKey) {\n const cachedTexture = XRMenuPanel.iconTextures.get(iconKey);\n if (cachedTexture) {\n this.toggleButton.material.map = cachedTexture;\n this.toggleButton.material.needsUpdate = true;\n }\n }\n updatePosition(camera, placementBox) {\n if (!placementBox) {\n return;\n }\n // Get the world position of the placement box\n const placementBoxWorldPos = new Vector3();\n placementBox.getWorldPosition(placementBoxWorldPos);\n // Get the placement box size to calculate dynamic offsets\n const placementBoxSize = placementBox.getSize();\n const placementBoxMinDimension = Math.min(placementBoxSize.x, placementBoxSize.z);\n // Calculate dynamic offsets based on placement box size\n // Base offsets with placement box size scaling\n const baseOffsetUp = -0.2;\n const baseOffsetForward = 0.9;\n const sizeScaleFactor = Math.max(0.5, Math.min(2.0, placementBoxMinDimension / 1.0)); // Scale between 0.5x and 2x\n const offsetUp = baseOffsetUp * sizeScaleFactor;\n const offsetForward = baseOffsetForward * sizeScaleFactor;\n // Get direction from placement box to camera (horizontal only)\n const directionToCamera = new Vector3()\n .copy(camera.position)\n .sub(placementBoxWorldPos);\n directionToCamera.y = 0; // Zero out vertical component\n directionToCamera.normalize();\n // Calculate the final position\n const panelPosition = new Vector3()\n .copy(placementBoxWorldPos)\n .add(new Vector3(0, offsetUp, 0)) // Move up\n .add(directionToCamera.multiplyScalar(offsetForward)); // Move forward\n this.position.copy(panelPosition);\n // Calculate distance-based scaling\n const distanceToCamera = camera.position.distanceTo(panelPosition);\n const clampedDistance = Math.max(PANEL_CONFIG.minDistance, Math.min(PANEL_CONFIG.maxDistance, distanceToCamera));\n const scaleFactor = PANEL_CONFIG.baseScale + (clampedDistance - PANEL_CONFIG.minDistance) * PANEL_CONFIG.distanceScaleFactor;\n // Apply scaling to the entire panel (including buttons)\n this.scale.set(scaleFactor, scaleFactor, scaleFactor);\n // Make the menu panel face the camera\n this.lookAt(camera.position);\n }\n /**\n * Set the box's visibility; it will fade in and out.\n */\n set show(visible) {\n this.goalOpacity = visible ? PANEL_CONFIG.opacity : 0;\n }\n /**\n * Call on each frame with the frame delta to fade the box.\n */\n updateOpacity(delta) {\n const material = this.panelMesh.material;\n const currentOpacity = material.opacity;\n const newOpacity = this.opacityDamper.update(currentOpacity, this.goalOpacity, delta, 1);\n this.traverse((child) => {\n if (child instanceof Mesh) {\n const mat = child.material;\n if (mat.transparent)\n mat.opacity = newOpacity;\n }\n });\n this.visible = newOpacity > 0;\n }\n dispose() {\n var _a;\n this.children.forEach(child => {\n if (child instanceof Mesh) {\n // Dispose geometry first\n if (child.geometry) {\n child.geometry.dispose();\n }\n // Handle material(s)\n // Material can be a single Material or an array of Materials\n const materials = Array.isArray(child.material) ? child.material : [child.material];\n materials.forEach(material => {\n if (material) { // Ensure material exists before proceeding\n // Dispose texture if it exists and is a CanvasTexture\n // We specifically created CanvasTextures for buttons, so check for that type.\n if ('map' in material && material.map instanceof CanvasTexture) { // Check if 'map' property exists and is a CanvasTexture\n material.map.dispose();\n }\n // Dispose material itself\n material.dispose();\n }\n });\n }\n });\n // Remove the panel itself from its parent in the scene graph\n (_a = this.parent) === null || _a === void 0 ? void 0 : _a.remove(this);\n }\n}\n// Cache for pre-rendered textures\nXRMenuPanel.iconTextures = new Map();\n//# sourceMappingURL=XRMenuPanel.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Box3, BufferGeometry, EventDispatcher, Line, Matrix4, PerspectiveCamera, Quaternion, Vector3 } from 'three';\nimport { XREstimatedLight } from 'three/examples/jsm/webxr/XREstimatedLight.js';\nimport { $currentBackground, $currentEnvironmentMap } from '../features/environment.js';\nimport { assertIsArCandidate } from '../utilities.js';\nimport { Damper } from './Damper.js';\nimport { PlacementBox } from './PlacementBox.js';\nimport { ChangeSource } from './SmoothControls.js';\nimport { XRMenuPanel } from './XRMenuPanel.js';\n// number of initial null pose XRFrames allowed before we post not-tracking\nconst INIT_FRAMES = 30;\n// AR shadow is not user-configurable. This is to pave the way for AR lighting\n// estimation, which will be used once available in WebXR.\nconst AR_SHADOW_INTENSITY = 0.8;\nconst ROTATION_RATE = 1.5;\n// Angle down (towards bottom of screen) from camera center ray to use for hit\n// testing against the floor. This makes placement faster and more intuitive\n// assuming the phone is in portrait mode. This seems to be a reasonable\n// assumption for the start of the session and UI will lack landscape mode to\n// encourage upright use.\nconst HIT_ANGLE_DEG = 20;\nconst SCALE_SNAP = 0.2;\n// upward-oriented ray for ceiling detection\nconst CEILING_HIT_ANGLE_DEG = 20;\nconst CEILING_ORIENTATION_THRESHOLD = 15; // degrees\n// For automatic dynamic viewport scaling, don't let the scale drop below this\n// limit.\nconst MIN_VIEWPORT_SCALE = 0.25;\n// Furthest away you can move an object (meters).\nconst MAX_DISTANCE = 10;\n// Damper decay in milliseconds for the headset - screen uses default.\nconst DECAY = 150;\n// Longer controller/hand indicator line (meters).\nconst MAX_LINE_LENGTH = 5;\n// Axis Y in webxr.\nconst AXIS_Y = new Vector3(0, 1, 0);\n// Webxr rotation sensitivity\nconst ROTATION_SENSIVITY = 0.3;\n// World-space AR automatic positioning constants (similar to FrameModel approach in SVXR)\nconst MIN_WORLD_SPACE_DISTANCE = 1.5; // Minimum distance from camera (meters)\nconst VIEW_DROP_DEGREES = 15; // Angle down from camera center for optimal viewing\nconst VIEW_RATIO = 0.3; // Ratio of viewport to use for model sizing\nconst MIN_MODEL_SIZE = 0.01; // Minimum model size to prevent division by zero\nconst PLACEMENT_BOX_EXTRA_PADDING = 0.15; // Extra padding for model-viewer\n// SVXR-like constants for scale limits\nconst MAX_MODEL_SIZE = 70.0;\nconst MODEL_SIZE_EPSILON = 0.001;\nconst FOOTPRINT__INTERSECT_THRESHOLD = 0.2;\nexport const ARStatus = {\n NOT_PRESENTING: 'not-presenting',\n SESSION_STARTED: 'session-started',\n OBJECT_PLACED: 'object-placed',\n FAILED: 'failed'\n};\nexport const ARTracking = {\n TRACKING: 'tracking',\n NOT_TRACKING: 'not-tracking'\n};\nconst vector3 = new Vector3();\nconst quaternion = new Quaternion();\nconst matrix4 = new Matrix4();\nconst hitPosition = new Vector3();\nconst camera = new PerspectiveCamera(45, 1, 0.1, 100);\nconst lineGeometry = new BufferGeometry().setFromPoints([new Vector3(0, 0, 0), new Vector3(0, 0, -1)]);\nexport const XRMode = {\n SCREEN_SPACE: 'screen-space',\n WORLD_SPACE: 'world-space'\n};\nexport class ARRenderer extends EventDispatcher {\n /**\n * Check if world-space mode is active and initial placement is complete\n */\n isWorldSpaceReady() {\n return this.xrMode === XRMode.WORLD_SPACE && this.worldSpaceInitialPlacementDone;\n }\n constructor(renderer) {\n super();\n this.renderer = renderer;\n this.currentSession = null;\n this.placementMode = 'floor';\n this.placementBox = null;\n this.menuPanel = null;\n this.lastTick = null;\n this.turntableRotation = null;\n this.oldShadowIntensity = null;\n this.frame = null;\n this.initialHitSource = null;\n this.transientHitTestSource = null;\n this.inputSource = null;\n this._presentedScene = null;\n this.resolveCleanup = null;\n this.exitWebXRButtonContainer = null;\n this.overlay = null;\n this.xrLight = null;\n this.xrMode = null;\n this.xrController1 = null;\n this.xrController2 = null;\n this.selectedXRController = null;\n this.tracking = true;\n this.frames = 0;\n this.initialized = false;\n this.oldTarget = new Vector3();\n this.placementComplete = false;\n this.isTranslating = false;\n this.isRotating = false;\n this.isTwoHandInteraction = false;\n this.lastDragPosition = new Vector3();\n this.deltaRotation = new Quaternion();\n this.scaleLine = new Line(lineGeometry);\n this.firstRatio = 0;\n this.lastAngle = 0;\n this.goalPosition = new Vector3();\n this.goalYaw = 0;\n this.goalScale = 1;\n this.xDamper = new Damper();\n this.yDamper = new Damper();\n this.zDamper = new Damper();\n this.yawDamper = new Damper();\n this.pitchDamper = new Damper();\n this.rollDamper = new Damper();\n this.scaleDamper = new Damper();\n this.wasTwoFingering = false;\n // Track if initial automatic placement has been done for world-space mode\n this.worldSpaceInitialPlacementDone = false;\n // Scale toggle state for world-space mode\n this.initialModelScale = 1.0;\n this.minScale = 1.0;\n this.maxScale = 1.0;\n this.onExitWebXRButtonContainerClick = () => this.stopPresenting();\n this.onControllerSelectStart = (event) => {\n var _a, _b, _c;\n const scene = this.presentedScene;\n const controller = event.target;\n const menuPanel = this.menuPanel;\n const exitIntersect = this.menuPanel.exitButtonControllerIntersection(scene, controller);\n if (exitIntersect != null) {\n (_a = this.menuPanel) === null || _a === void 0 ? void 0 : _a.dispose();\n this.stopPresenting();\n return;\n }\n const scaleModeIntersect = this.menuPanel.scaleModeButtonControllerIntersection(scene, controller);\n if (scaleModeIntersect != null) {\n const goalScale = this.menuPanel.handleScaleToggle(this.worldSpaceInitialPlacementDone, this.initialModelScale, this.minScale, this.maxScale);\n if (goalScale !== null) {\n this.goalScale = goalScale;\n }\n return;\n }\n if (menuPanel) {\n menuPanel.show = false;\n }\n const intersection = this.placementBox.controllerIntersection(scene, controller);\n if (intersection != null) {\n const bbox = new Box3().setFromObject(scene.pivot);\n const footprintY = bbox.min.y + FOOTPRINT__INTERSECT_THRESHOLD; // Small threshold above base\n // Check if the ray intersection is near the footprint\n const isFootprint = intersection.point.y <= footprintY;\n if (isFootprint) {\n if (this.selectedXRController != null) {\n this.selectedXRController.userData.line.visible = false;\n if (scene.canScale && this.isWorldSpaceReady()) {\n this.isTwoHandInteraction = true;\n this.firstRatio = this.controllerSeparation() / scene.pivot.scale.x;\n this.scaleLine.visible = true;\n }\n }\n else {\n controller.attach(scene.pivot);\n }\n this.selectedXRController = controller;\n scene.setShadowIntensity(0.01);\n }\n else {\n if (controller == this.xrController1) {\n this.xrController1.userData.isSelected = true;\n }\n else if (controller == this.xrController2) {\n this.xrController2.userData.isSelected = true;\n }\n if (((_b = this.xrController1) === null || _b === void 0 ? void 0 : _b.userData.isSelected) && ((_c = this.xrController2) === null || _c === void 0 ? void 0 : _c.userData.isSelected)) {\n if (scene.canScale && this.isWorldSpaceReady()) {\n this.isTwoHandInteraction = true;\n this.firstRatio = this.controllerSeparation() / scene.pivot.scale.x;\n this.scaleLine.visible = true;\n }\n }\n else {\n const otherController = controller === this.xrController1 ? this.xrController2 :\n this.xrController1;\n controller.userData.initialX = controller.position.x;\n otherController.userData.turning = false;\n controller.userData.turning = true;\n controller.userData.line.visible = false;\n }\n }\n }\n };\n this.onControllerSelectEnd = (event) => {\n const controller = event.target;\n controller.userData.turning = false;\n controller.userData.line.visible = true;\n this.isTwoHandInteraction = false;\n this.scaleLine.visible = false;\n if (controller == this.xrController1) {\n this.xrController1.userData.isSelected = false;\n }\n else if (controller == this.xrController2) {\n this.xrController2.userData.isSelected = false;\n }\n if (this.selectedXRController != null &&\n this.selectedXRController != controller) {\n return;\n }\n const scene = this.presentedScene;\n // drop on floor\n scene.attach(scene.pivot);\n this.selectedXRController = null;\n this.goalYaw = Math.atan2(scene.pivot.matrix.elements[8], scene.pivot.matrix.elements[10]);\n this.goalPosition.x = scene.pivot.position.x;\n this.goalPosition.z = scene.pivot.position.z;\n // For world-space mode after initial placement, preserve Y position\n if (this.isWorldSpaceReady()) {\n this.goalPosition.y = scene.pivot.position.y;\n }\n const menuPanel = this.menuPanel;\n menuPanel.show = true;\n };\n this.onUpdateScene = () => {\n if (this.placementBox != null && this.isPresenting) {\n // Update the existing placement box with new model dimensions instead of recreating\n this.placementBox.updateFromModelChanges();\n // Ensure screen space mode is maintained\n this.placementBox.setScreenSpaceMode(this.xrMode === XRMode.SCREEN_SPACE);\n }\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n if (this.menuPanel) {\n this.menuPanel.dispose();\n this.menuPanel = null;\n }\n this.menuPanel = new XRMenuPanel();\n this.presentedScene.add(this.menuPanel);\n this.menuPanel.updatePosition(this.presentedScene.getCamera(), this.placementBox);\n }\n };\n this.onSelectStart = (event) => {\n const hitSource = this.transientHitTestSource;\n if (hitSource == null) {\n return;\n }\n const fingers = this.frame.getHitTestResultsForTransientInput(hitSource);\n const scene = this.presentedScene;\n const box = this.placementBox;\n if (fingers.length === 1) {\n this.inputSource = event.inputSource;\n const { axes } = this.inputSource.gamepad;\n const hitPosition = box.getHit(this.presentedScene, axes[0], axes[1]);\n box.show = true;\n if (hitPosition != null) {\n this.isTranslating = true;\n this.lastDragPosition.copy(hitPosition);\n }\n else if (this.placeOnWall === false) {\n this.isRotating = true;\n this.lastAngle = axes[0] * ROTATION_RATE;\n }\n }\n else if (fingers.length === 2) {\n box.show = true;\n this.isTwoHandInteraction = true;\n const { separation, angle } = this.fingerPolar(fingers);\n this.lastAngle = angle; // Initialize lastAngle, do not update goalYaw\n if (this.firstRatio === 0) {\n this.firstRatio = separation / scene.pivot.scale.x;\n }\n if (scene.canScale) {\n this.setScale(separation);\n }\n return;\n }\n };\n this.onSelectEnd = () => {\n this.isTranslating = false;\n this.isRotating = false;\n this.isTwoHandInteraction = false;\n this.inputSource = null;\n this.goalPosition.y +=\n this.placementBox.offsetHeight * this.presentedScene.scale.x;\n this.placementBox.show = false;\n };\n this.threeRenderer = renderer.threeRenderer;\n this.threeRenderer.xr.enabled = true;\n }\n async resolveARSession() {\n assertIsArCandidate();\n const session = await navigator.xr.requestSession('immersive-ar', {\n requiredFeatures: [],\n optionalFeatures: ['hit-test', 'dom-overlay', 'light-estimation'],\n domOverlay: this.overlay ? { root: this.overlay } : undefined\n });\n this.threeRenderer.xr.setReferenceSpaceType('local');\n await this.threeRenderer.xr.setSession(session);\n this.threeRenderer.xr.cameraAutoUpdate = false;\n return session;\n }\n /**\n * The currently presented scene, if any\n */\n get presentedScene() {\n return this._presentedScene;\n }\n /**\n * Resolves to true if the renderer has detected all the necessary qualities\n * to support presentation in AR.\n */\n async supportsPresentation() {\n try {\n assertIsArCandidate();\n return await navigator.xr.isSessionSupported('immersive-ar');\n }\n catch (error) {\n console.warn('Request to present in WebXR denied:');\n console.warn(error);\n console.warn('Falling back to next ar-mode');\n return false;\n }\n }\n /**\n * Present a scene in AR\n */\n async present(scene, environmentEstimation = false) {\n if (this.isPresenting) {\n console.warn('Cannot present while a model is already presenting');\n }\n let waitForAnimationFrame = new Promise((resolve, _reject) => {\n requestAnimationFrame(() => resolve());\n });\n scene.setHotspotsVisibility(false);\n scene.queueRender();\n // Render a frame to turn off the hotspots\n await waitForAnimationFrame;\n // This sets isPresenting to true\n this._presentedScene = scene;\n this.overlay = scene.element.shadowRoot.querySelector('div.default');\n if (environmentEstimation === true) {\n this.xrLight = new XREstimatedLight(this.threeRenderer);\n this.xrLight.addEventListener('estimationstart', () => {\n if (!this.isPresenting || this.xrLight == null) {\n return;\n }\n const scene = this.presentedScene;\n scene.add(this.xrLight);\n scene.environment = this.xrLight.environment;\n });\n }\n const currentSession = await this.resolveARSession();\n currentSession.addEventListener('end', () => {\n this.postSessionCleanup();\n }, { once: true });\n const exitButton = scene.element.shadowRoot.querySelector('.slot.exit-webxr-ar-button');\n exitButton.classList.add('enabled');\n exitButton.addEventListener('click', this.onExitWebXRButtonContainerClick);\n this.exitWebXRButtonContainer = exitButton;\n const viewerRefSpace = await currentSession.requestReferenceSpace('viewer');\n this.xrMode = currentSession.interactionMode;\n this.tracking = true;\n this.frames = 0;\n this.initialized = false;\n this.turntableRotation = scene.yaw;\n this.goalYaw = scene.yaw;\n this.goalScale = 1;\n scene.setBackground(null);\n this.oldShadowIntensity = scene.shadowIntensity;\n scene.setShadowIntensity(0.01); // invisible, but not changing the shader\n this.oldTarget.copy(scene.getTarget());\n scene.element.addEventListener('load', this.onUpdateScene);\n // Create hit test source for all modes (will be used differently based on mode and state)\n let ray;\n if (!this.placeOnWall && !this.placeOnCeiling) {\n // floor – shoot slightly downward\n const r = HIT_ANGLE_DEG * Math.PI / 180;\n ray = new XRRay(new DOMPoint(0, 0, 0), { x: 0, y: -Math.sin(r), z: -Math.cos(r) });\n }\n else if (this.placeOnWall) {\n ray = undefined;\n }\n else { // ceiling – shoot upward\n const r = CEILING_HIT_ANGLE_DEG * Math.PI / 180;\n ray = new XRRay(new DOMPoint(0, 0, 0), { x: 0, y: Math.sin(r), z: -Math.cos(r) });\n }\n currentSession\n .requestHitTestSource({ space: viewerRefSpace, offsetRay: ray }).then(hitTestSource => {\n this.initialHitSource = hitTestSource;\n });\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n this.setupXRControllers();\n this.xDamper.setDecayTime(DECAY);\n this.yDamper.setDecayTime(DECAY);\n this.zDamper.setDecayTime(DECAY);\n this.yawDamper.setDecayTime(DECAY);\n this.pitchDamper.setDecayTime(DECAY);\n this.rollDamper.setDecayTime(DECAY);\n this.scaleDamper.setDecayTime(DECAY);\n }\n this.currentSession = currentSession;\n this.placementBox = new PlacementBox(scene, this.placeOnWall ? 'back'\n : this.placeOnCeiling ? 'top' : 'bottom');\n // Set screen space mode for proper positioning\n if (this.placementBox) {\n this.placementBox.setScreenSpaceMode(this.xrMode === XRMode.SCREEN_SPACE);\n }\n this.placementComplete = false;\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n this.menuPanel = new XRMenuPanel();\n scene.add(this.menuPanel);\n this.menuPanel.updatePosition(scene.getCamera(), this.placementBox); // Position the menu panel\n }\n this.lastTick = performance.now();\n this.dispatchEvent({ type: 'status', status: ARStatus.SESSION_STARTED });\n }\n setupXRControllerLine(xrController) {\n if (!xrController.userData.line) {\n const line = new Line(lineGeometry);\n line.name = 'line';\n line.scale.z = MAX_LINE_LENGTH;\n xrController.userData.turning = false;\n xrController.userData.line = line;\n xrController.add(line);\n }\n }\n setupController(controller) {\n this.setupXRControllerLine(controller);\n controller.addEventListener('selectstart', this.onControllerSelectStart);\n controller.addEventListener('selectend', this.onControllerSelectEnd);\n }\n setupXRControllers() {\n this.xrController1 = this.threeRenderer.xr.getController(0);\n this.xrController2 = this.threeRenderer.xr.getController(1);\n this.setupController(this.xrController1);\n this.setupController(this.xrController2);\n this.scaleLine.name = 'scale line';\n this.scaleLine.visible = false;\n this.xrController1.add(this.scaleLine);\n // Add controllers to the scene\n const scene = this.presentedScene;\n scene.add(this.xrController1);\n scene.add(this.xrController2);\n }\n hover(xrController) {\n // Do not highlight in mobile-ar\n if (this.xrMode === XRMode.SCREEN_SPACE ||\n this.selectedXRController == xrController) {\n return false;\n }\n const scene = this.presentedScene;\n const intersection = this.placementBox.controllerIntersection(scene, xrController);\n xrController.userData.line.scale.z =\n intersection == null ? MAX_LINE_LENGTH : intersection.distance;\n return intersection != null;\n }\n controllerSeparation() {\n return this.xrController1.position.distanceTo(this.xrController2.position);\n }\n /**\n * If currently presenting a scene in AR, stops presentation and exits AR.\n */\n async stopPresenting() {\n if (!this.isPresenting) {\n return;\n }\n const cleanupPromise = new Promise((resolve) => {\n this.resolveCleanup = resolve;\n });\n try {\n await this.currentSession.end();\n await cleanupPromise;\n }\n catch (error) {\n console.warn('Error while trying to end WebXR AR session');\n console.warn(error);\n this.postSessionCleanup();\n }\n }\n /**\n * True if a scene is currently in the process of being presented in AR\n */\n get isPresenting() {\n return this.presentedScene != null;\n }\n get target() {\n return this.oldTarget;\n }\n get placeOnCeiling() { return this.placementMode === 'ceiling'; }\n get placeOnWall() { return this.placementMode === 'wall'; }\n updateTarget() {\n const scene = this.presentedScene;\n if (scene != null) {\n const target = scene.getTarget();\n this.oldTarget.copy(target);\n if (this.placeOnWall) {\n target.z = scene.boundingBox.min.z;\n }\n else if (this.placeOnCeiling) {\n target.y = scene.boundingBox.max.y; // Use ceiling height\n }\n else {\n target.y = scene.boundingBox.min.y; // Floor height\n }\n scene.setTarget(target.x, target.y, target.z);\n }\n }\n cleanupXRController(xrController) {\n xrController.userData.turning = false;\n xrController.userData.line.visible = true;\n xrController.removeEventListener('selectstart', this.onControllerSelectStart);\n xrController.removeEventListener('selectend', this.onControllerSelectEnd);\n xrController.removeFromParent();\n }\n postSessionCleanup() {\n const session = this.currentSession;\n if (session != null) {\n session.removeEventListener('selectstart', this.onSelectStart);\n session.removeEventListener('selectend', this.onSelectEnd);\n this.currentSession = null;\n }\n const scene = this.presentedScene;\n this._presentedScene = null;\n if (scene != null) {\n const { element } = scene;\n if (this.xrLight != null) {\n scene.remove(this.xrLight);\n this.xrLight.dispose();\n this.xrLight = null;\n }\n if (this.menuPanel != null) {\n this.menuPanel.dispose();\n this.menuPanel = null;\n }\n scene.add(scene.pivot);\n scene.pivot.quaternion.set(0, 0, 0, 1);\n scene.pivot.position.set(0, 0, 0);\n scene.pivot.scale.set(1, 1, 1);\n scene.setShadowOffset(0);\n const yaw = this.turntableRotation;\n if (yaw != null) {\n scene.yaw = yaw;\n }\n const intensity = this.oldShadowIntensity;\n if (intensity != null) {\n scene.setShadowIntensity(intensity);\n }\n scene.setEnvironmentAndSkybox(element[$currentEnvironmentMap], element[$currentBackground]);\n const point = this.oldTarget;\n scene.setTarget(point.x, point.y, point.z);\n scene.xrCamera = null;\n scene.element.removeEventListener('load', this.onUpdateScene);\n scene.orientHotspots(0);\n const { width, height } = element.getBoundingClientRect();\n scene.setSize(width, height);\n requestAnimationFrame(() => {\n scene.element.dispatchEvent(new CustomEvent('camera-change', { detail: { source: ChangeSource.NONE } }));\n });\n }\n // Force the Renderer to update its size\n this.renderer.height = 0;\n const exitButton = this.exitWebXRButtonContainer;\n if (exitButton != null) {\n exitButton.classList.remove('enabled');\n exitButton.removeEventListener('click', this.onExitWebXRButtonContainerClick);\n this.exitWebXRButtonContainer = null;\n }\n const hitSource = this.transientHitTestSource;\n if (hitSource != null) {\n hitSource.cancel();\n this.transientHitTestSource = null;\n }\n const hitSourceInitial = this.initialHitSource;\n if (hitSourceInitial != null) {\n hitSourceInitial.cancel();\n this.initialHitSource = null;\n }\n if (this.placementBox != null) {\n this.placementBox.dispose();\n this.placementBox = null;\n }\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n if (this.xrController1 != null) {\n this.cleanupXRController(this.xrController1);\n this.xrController1 = null;\n }\n if (this.xrController2 != null) {\n this.cleanupXRController(this.xrController2);\n this.xrController2 = null;\n }\n this.selectedXRController = null;\n this.scaleLine.visible = false;\n }\n this.isTranslating = false;\n this.isRotating = false;\n this.isTwoHandInteraction = false;\n this.lastTick = null;\n this.turntableRotation = null;\n this.oldShadowIntensity = null;\n this.frame = null;\n this.inputSource = null;\n this.overlay = null;\n this.worldSpaceInitialPlacementDone = false;\n if (this.resolveCleanup != null) {\n this.resolveCleanup();\n }\n this.dispatchEvent({ type: 'status', status: ARStatus.NOT_PRESENTING });\n }\n updateView(view) {\n const scene = this.presentedScene;\n const xr = this.threeRenderer.xr;\n xr.updateCamera(camera);\n scene.xrCamera = xr.getCamera();\n const { elements } = scene.getCamera().matrixWorld;\n scene.orientHotspots(Math.atan2(elements[1], elements[5]));\n if (!this.initialized) {\n this.placeInitially();\n this.initialized = true;\n }\n // Use automatic dynamic viewport scaling if supported.\n if (view.requestViewportScale && view.recommendedViewportScale) {\n const scale = view.recommendedViewportScale;\n view.requestViewportScale(Math.max(scale, MIN_VIEWPORT_SCALE));\n }\n const layer = xr.getBaseLayer();\n if (layer != null) {\n const viewport = layer instanceof XRWebGLLayer ?\n layer.getViewport(view) :\n xr.getBinding().getViewSubImage(layer, view).viewport;\n this.threeRenderer.setViewport(viewport.x, viewport.y, viewport.width, viewport.height);\n }\n }\n placeInitially() {\n const scene = this.presentedScene;\n const { pivot, element } = scene;\n const { position } = pivot;\n const xrCamera = scene.getCamera();\n const { width, height } = this.overlay.getBoundingClientRect();\n scene.setSize(width, height);\n xrCamera.projectionMatrixInverse.copy(xrCamera.projectionMatrix).invert();\n const { theta } = element\n .getCameraOrbit();\n // Orient model to match the 3D camera view\n const cameraDirection = xrCamera.getWorldDirection(vector3);\n scene.yaw = Math.atan2(-cameraDirection.x, -cameraDirection.z) - theta;\n this.goalYaw = scene.yaw;\n if (this.placeOnCeiling && !this.isViewPointingUp()) {\n scene.visible = false; // Hide until properly oriented\n scene.setHotspotsVisibility(true); // Still show UI\n // Set up touch interaction for screen-space mode\n if (this.xrMode === XRMode.SCREEN_SPACE) {\n const { session } = this.frame;\n session.addEventListener('selectstart', this.onSelectStart);\n session.addEventListener('selectend', this.onSelectEnd);\n session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' })\n .then(hitTestSource => { this.transientHitTestSource = hitTestSource; });\n }\n return; // Exit early - don't place yet\n }\n // Use different placement logic for world-space vs screen-space\n if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone) {\n // Use automatic optimal placement for world-space AR only on first session\n const { position: optimalPosition, scale: optimalScale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera);\n this.goalPosition.copy(optimalPosition);\n this.goalScale = optimalScale;\n // Store the initial scale for toggle functionality\n this.initialModelScale = optimalScale;\n // Set initial position and scale immediately for world-space\n position.copy(optimalPosition);\n pivot.scale.set(optimalScale, optimalScale, optimalScale);\n // Mark that initial placement is done\n this.worldSpaceInitialPlacementDone = true;\n // Calculate scale limits for world-space mode (SVXR logic)\n this.calculateWorldSpaceScaleLimits(scene);\n // Enable user interaction after initial placement\n this.enableWorldSpaceUserInteraction();\n }\n else if (this.xrMode === XRMode.SCREEN_SPACE) {\n // Use original placement logic for screen-space AR\n const radius = Math.max(1, 2 * scene.boundingSphere.radius);\n position.copy(xrCamera.position)\n .add(cameraDirection.multiplyScalar(radius));\n this.updateTarget();\n const target = scene.getTarget();\n position.add(target).sub(this.oldTarget);\n this.goalPosition.copy(position);\n }\n scene.setHotspotsVisibility(true);\n scene.visible = true; // Model is properly oriented, show it\n if (this.xrMode === XRMode.SCREEN_SPACE) {\n const { session } = this.frame;\n session.addEventListener('selectstart', this.onSelectStart);\n session.addEventListener('selectend', this.onSelectEnd);\n session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' })\n .then(hitTestSource => { this.transientHitTestSource = hitTestSource; });\n }\n }\n checkForDeferredCeilingPlacement() {\n // Check on every frame—both XR modes, only when ceiling is the target and the model is hidden\n if (!this.placeOnCeiling || !this.presentedScene || this.presentedScene.visible)\n return;\n const isWorldSpaceDeferred = this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone;\n const isScreenSpaceDeferred = this.xrMode === XRMode.SCREEN_SPACE;\n if (isWorldSpaceDeferred || isScreenSpaceDeferred) {\n if (this.isViewPointingUp()) {\n this.performDeferredPlacement();\n }\n }\n }\n performDeferredPlacement() {\n const scene = this.presentedScene;\n if (this.xrMode === XRMode.WORLD_SPACE) {\n const xrCamera = scene.getCamera();\n const { position, scale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera);\n this.goalPosition.copy(position);\n this.goalScale = scale;\n this.initialModelScale = scale;\n scene.pivot.position.copy(position);\n scene.pivot.scale.set(scale, scale, scale);\n this.worldSpaceInitialPlacementDone = true;\n this.calculateWorldSpaceScaleLimits(scene);\n this.enableWorldSpaceUserInteraction();\n }\n else { // SCREEN_SPACE\n const xrCamera = scene.getCamera();\n const cameraDirection = xrCamera.getWorldDirection(new Vector3());\n const radius = Math.max(1, 2 * scene.boundingSphere.radius);\n scene.pivot.position.copy(xrCamera.position).add(cameraDirection.multiplyScalar(radius));\n this.updateTarget();\n const target = scene.getTarget();\n scene.pivot.position.add(target).sub(this.oldTarget);\n this.goalPosition.copy(scene.pivot.position);\n // Setup touch interaction if needed\n const { session } = this.frame;\n session.addEventListener('selectstart', this.onSelectStart);\n session.addEventListener('selectend', this.onSelectEnd);\n session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' })\n .then(hitTestSource => { this.transientHitTestSource = hitTestSource; });\n }\n scene.visible = true;\n scene.setHotspotsVisibility(true);\n this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED });\n }\n getTouchLocation() {\n const { axes } = this.inputSource.gamepad;\n let location = this.placementBox.getExpandedHit(this.presentedScene, axes[0], axes[1]);\n if (location != null) {\n vector3.copy(location).sub(this.presentedScene.getCamera().position);\n if (vector3.length() > MAX_DISTANCE)\n return null;\n }\n return location;\n }\n getHitPoint(hitResult) {\n const refSpace = this.threeRenderer.xr.getReferenceSpace();\n const pose = hitResult.getPose(refSpace);\n if (pose == null) {\n return null;\n }\n const hitMatrix = matrix4.fromArray(pose.transform.matrix);\n if (this.placeOnWall === true) {\n // Orient the model to the wall's normal vector.\n this.goalYaw = Math.atan2(hitMatrix.elements[4], hitMatrix.elements[6]);\n }\n // Check that the y-coordinate of the normal is large enough that the normal\n // is pointing up for floor placement; opposite for wall placement.\n const normalY = hitMatrix.elements[5];\n if (this.placeOnWall) {\n // wall: reject if normal points down/up too much\n return normalY < -0.75 ? null : hitPosition.setFromMatrixPosition(hitMatrix);\n }\n if (this.placeOnCeiling) {\n // ceiling: accept only downward-facing planes\n return normalY < -0.5\n ? hitPosition.setFromMatrixPosition(hitMatrix)\n : null;\n }\n // floor: accept only upward-facing planes\n return normalY > 0.75 ? hitPosition.setFromMatrixPosition(hitMatrix) : null;\n }\n /**\n * Hit-test the environment once per frame until a suitable surface is found,\n * then lock the model to that anchor.\n * – Floor: accept upward-facing planes and “drop” the model down.\n * – Wall: accept vertical planes; keep full XYZ.\n * – Ceiling: accept downward-facing planes; keep full XYZ and hide model\n * until a ceiling hit arrives (no premature floor placement).\n */\n moveToAnchor(frame) {\n // Handle deferred initial placement for ceiling mode\n if (this.placeOnCeiling &&\n this.xrMode === XRMode.WORLD_SPACE &&\n !this.worldSpaceInitialPlacementDone &&\n !this.presentedScene.visible) {\n // Check if orientation is now sufficient\n if (!this.isViewPointingUp()) {\n console.log('[ARR/moveToAnchor] Still waiting for proper ceiling orientation');\n return;\n }\n // Orientation is good - complete the deferred world-space placement\n const scene = this.presentedScene;\n const xrCamera = scene.getCamera();\n const { position: optimalPosition, scale: optimalScale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera);\n this.goalPosition.copy(optimalPosition);\n this.goalScale = optimalScale;\n this.initialModelScale = optimalScale;\n scene.pivot.position.copy(optimalPosition);\n scene.pivot.scale.set(optimalScale, optimalScale, optimalScale);\n this.worldSpaceInitialPlacementDone = true;\n this.calculateWorldSpaceScaleLimits(scene);\n this.enableWorldSpaceUserInteraction();\n scene.visible = true;\n this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED });\n return;\n }\n // Skip for world-space mode after initial placement (unless ceiling was deferred)\n if (this.xrMode === XRMode.WORLD_SPACE && this.worldSpaceInitialPlacementDone) {\n this.placementBox.show = false;\n this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED });\n return;\n }\n }\n isViewPointingUp(thresholdDeg = CEILING_ORIENTATION_THRESHOLD) {\n const cam = this.presentedScene.getCamera();\n // Handle ArrayCamera (common in XR)\n const realCam = cam.isArrayCamera && Array.isArray(cam.cameras)\n ? cam.cameras[0] // Use first sub-camera\n : cam;\n if (!realCam || typeof realCam.updateMatrixWorld !== 'function') {\n return false;\n }\n // Update camera matrix to get current world orientation\n realCam.updateMatrixWorld(true);\n const elements = realCam.matrixWorld.elements;\n // Get forward direction from camera matrix (-Z column)\n const forwardY = -elements[9]; // Y component of forward vector\n const minY = Math.sin(thresholdDeg * Math.PI / 180);\n return forwardY >= minY;\n }\n fingerPolar(fingers) {\n const fingerOne = fingers[0].inputSource.gamepad.axes;\n const fingerTwo = fingers[1].inputSource.gamepad.axes;\n const deltaX = fingerTwo[0] - fingerOne[0];\n const deltaY = fingerTwo[1] - fingerOne[1];\n const angle = Math.atan2(deltaY, deltaX);\n let deltaYaw = this.lastAngle - angle;\n if (deltaYaw > Math.PI) {\n deltaYaw -= 2 * Math.PI;\n }\n else if (deltaYaw < -Math.PI) {\n deltaYaw += 2 * Math.PI;\n }\n return {\n separation: Math.sqrt(deltaX * deltaX + deltaY * deltaY),\n deltaYaw: deltaYaw,\n angle: angle\n };\n }\n setScale(separation) {\n let scale = separation / this.firstRatio;\n scale = (Math.abs(scale - 1) < SCALE_SNAP) ? 1 : scale;\n // Clamp to min/max for world-space mode after initial placement\n if (this.isWorldSpaceReady()) {\n scale = Math.max(this.minScale, Math.min(this.maxScale, scale));\n }\n this.goalScale = scale;\n }\n processInput(frame) {\n const hitSource = this.transientHitTestSource;\n if (hitSource == null) {\n return;\n }\n const fingers = frame.getHitTestResultsForTransientInput(hitSource);\n const scene = this.presentedScene;\n const scale = scene.pivot.scale.x;\n // Robust two-finger gesture handling\n if (fingers.length === 2) {\n if (!this.wasTwoFingering) {\n // New two-finger gesture starting\n const { separation, angle } = this.fingerPolar(fingers);\n this.firstRatio = separation / scale;\n this.lastAngle = angle;\n this.wasTwoFingering = true;\n this.isTwoHandInteraction = true;\n // Do not apply rotation or scale on this frame\n return;\n }\n // Ongoing two-finger gesture\n const { separation, deltaYaw, angle } = this.fingerPolar(fingers);\n this.goalYaw += deltaYaw;\n this.lastAngle = angle;\n if (scene.canScale) {\n this.setScale(separation);\n }\n this.isTwoHandInteraction = true;\n return;\n }\n else {\n if (this.wasTwoFingering) {\n // Two-finger gesture ended\n this.wasTwoFingering = false;\n this.isTwoHandInteraction = false;\n this.firstRatio = 0;\n }\n }\n if (!this.isTranslating && !this.isTwoHandInteraction && !this.isRotating) {\n return;\n }\n // Handle single finger interactions\n if (this.isRotating) {\n const angle = this.inputSource.gamepad.axes[0] * ROTATION_RATE;\n this.goalYaw += angle - this.lastAngle;\n this.lastAngle = angle;\n }\n else if (this.isTranslating) {\n fingers.forEach(finger => {\n if (finger.inputSource !== this.inputSource) {\n return;\n }\n let hit = null;\n if (finger.results.length > 0) {\n hit = this.getHitPoint(finger.results[0]);\n }\n if (hit == null) {\n hit = this.getTouchLocation();\n }\n if (hit == null) {\n return;\n }\n this.goalPosition.sub(this.lastDragPosition);\n // For world-space mode after initial placement, allow full Y-axis control\n if (this.isWorldSpaceReady()) {\n // Use the hit point directly without floor constraints\n console.log('[processInput] Setting goalPosition.y to hit.y:', hit.y);\n this.goalPosition.add(hit);\n }\n else if (this.placeOnWall === false) {\n // Original logic for screen-space or initial world-space placement\n const offset = hit.y - this.lastDragPosition.y;\n // When a lower floor is found, keep the model at the same height, but\n // drop the placement box to the floor. The model falls on select end.\n if (offset < 0) {\n this.placementBox.offsetHeight = offset / scale;\n this.presentedScene.setShadowOffset(offset);\n // Interpolate hit ray up to drag plane\n const cameraPosition = vector3.copy(scene.getCamera().position);\n const alpha = -offset / (cameraPosition.y - hit.y);\n cameraPosition.multiplyScalar(alpha);\n hit.multiplyScalar(1 - alpha).add(cameraPosition);\n }\n this.goalPosition.add(hit);\n }\n else {\n this.goalPosition.add(hit);\n }\n this.lastDragPosition.copy(hit);\n });\n }\n }\n applyXRControllerRotation(controller, pivot) {\n if (!controller.userData.turning) {\n return;\n }\n const angle = (controller.position.x - controller.userData.initialX) * ROTATION_SENSIVITY;\n this.deltaRotation.setFromAxisAngle(AXIS_Y, angle);\n pivot.quaternion.multiplyQuaternions(this.deltaRotation, pivot.quaternion);\n }\n handleScalingInXR(scene, delta) {\n // Allow manual scaling for world-space mode after initial placement\n if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone) {\n return;\n }\n if (this.xrController1 && this.xrController2 && this.isTwoHandInteraction) {\n const dist = this.controllerSeparation();\n this.setScale(dist);\n this.scaleLine.scale.z = -dist;\n this.scaleLine.lookAt(this.xrController2.position);\n }\n const oldScale = scene.pivot.scale.x;\n if (this.goalScale !== oldScale) {\n const newScale = this.scaleDamper.update(oldScale, this.goalScale, delta, 1);\n scene.pivot.scale.set(newScale, newScale, newScale);\n }\n }\n updatePivotPosition(scene, delta) {\n const { pivot } = scene;\n const box = this.placementBox;\n const boundingRadius = scene.boundingSphere.radius;\n const goal = this.goalPosition;\n const position = pivot.position;\n let source = ChangeSource.NONE;\n if (!goal.equals(position)) {\n source = ChangeSource.USER_INTERACTION;\n let { x, y, z } = position;\n x = this.xDamper.update(x, goal.x, delta, boundingRadius);\n y = this.yDamper.update(y, goal.y, delta, boundingRadius);\n z = this.zDamper.update(z, goal.z, delta, boundingRadius);\n position.set(x, y, z);\n if (this.xrMode === XRMode.SCREEN_SPACE && !this.isTranslating) {\n const offset = goal.y - y;\n if (this.placementComplete && this.placeOnWall === false) {\n box.offsetHeight = offset / scene.pivot.scale.x;\n scene.setShadowOffset(offset);\n }\n else if (offset === 0) {\n this.placementComplete = true;\n box.show = false;\n scene.setShadowIntensity(AR_SHADOW_INTENSITY);\n }\n }\n if (this.xrMode !== XRMode.SCREEN_SPACE && goal.equals(position)) {\n scene.setShadowIntensity(AR_SHADOW_INTENSITY);\n }\n // For world-space mode after initial placement, don't constrain Y position\n if (this.isWorldSpaceReady()) {\n // Allow full Y-axis movement without floor constraints\n scene.setShadowIntensity(AR_SHADOW_INTENSITY);\n }\n }\n // Handle automatic scaling for world-space mode only during initial placement\n if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone && this.goalScale !== pivot.scale.x) {\n const newScale = this.scaleDamper.update(pivot.scale.x, this.goalScale, delta, 1);\n pivot.scale.set(newScale, newScale, newScale);\n }\n scene.updateTarget(delta);\n // Return the source so the caller can use it for camera-change events\n return source;\n }\n updateYaw(scene, delta) {\n // yaw must be updated last, since this also updates the shadow position.\n quaternion.setFromAxisAngle(vector3.set(0, 1, 0), this.goalYaw);\n const angle = scene.pivot.quaternion.angleTo(quaternion);\n const angleStep = angle - this.yawDamper.update(angle, 0, delta, Math.PI);\n scene.pivot.quaternion.rotateTowards(quaternion, angleStep);\n }\n updateMenuPanel(scene, box, delta) {\n if (this.menuPanel) {\n this.menuPanel.updateOpacity(delta);\n this.menuPanel.updatePosition(scene.getCamera(), box);\n }\n }\n applyXRInputToScene(delta) {\n const scene = this.presentedScene;\n const pivot = scene.pivot;\n const box = this.placementBox;\n this.updatePlacementBoxOpacity(box, delta);\n this.updateTwoHandInteractionState();\n this.applyXRControllerRotations(pivot);\n this.handleScalingInXR(scene, delta);\n if (pivot.parent !== scene) {\n // attached to controller instead\n // when moving the model, the menu panel should disapear\n this.updateMenuPanel(scene, box, delta);\n return;\n }\n const source = this.updatePivotPosition(scene, delta);\n this.updateYaw(scene, delta);\n this.dispatchCameraChangeEvent(scene, source);\n this.updateMenuPanel(scene, box, delta);\n }\n updatePlacementBoxOpacity(box, delta) {\n // Use the new enhanced update method that includes distance scaling and visual state\n const camera = this.presentedScene.getCamera();\n box.update(delta, camera.position);\n // Update interaction state based on hover\n const over1 = this.hover(this.xrController1);\n const over2 = this.hover(this.xrController2);\n const isHovered = (over1 || over2) && !this.isTwoHandInteraction;\n // Set interaction state for visual feedback\n box.setInteractionState(this.isTranslating || this.isRotating, isHovered);\n }\n updateTwoHandInteractionState() {\n var _a, _b;\n const bothSelected = ((_a = this.xrController1) === null || _a === void 0 ? void 0 : _a.userData.isSelected) && ((_b = this.xrController2) === null || _b === void 0 ? void 0 : _b.userData.isSelected);\n this.isTwoHandInteraction = !!bothSelected;\n }\n applyXRControllerRotations(pivot) {\n if (!this.isTwoHandInteraction) {\n if (this.xrController1)\n this.applyXRControllerRotation(this.xrController1, pivot);\n if (this.xrController2)\n this.applyXRControllerRotation(this.xrController2, pivot);\n }\n }\n dispatchCameraChangeEvent(scene, source) {\n scene.element.dispatchEvent(new CustomEvent('camera-change', { detail: { source } }));\n }\n updateXRControllerHover() {\n const over1 = this.hover(this.xrController1);\n const over2 = this.hover(this.xrController2);\n const isHovered = (over1 || over2) && !this.isTwoHandInteraction;\n // Use the new interaction state system\n if (this.placementBox) {\n this.placementBox.setInteractionState(this.isTranslating || this.isRotating, isHovered);\n this.placementBox.show = isHovered;\n }\n }\n /**\n * Enable user interaction for world-space mode after initial automatic placement\n */\n enableWorldSpaceUserInteraction() {\n // Show placement box to indicate model can be moved\n if (this.placementBox) {\n this.placementBox.show = true;\n }\n // Enable shadow to show model is placed\n if (this.presentedScene) {\n this.presentedScene.setShadowIntensity(AR_SHADOW_INTENSITY);\n }\n }\n handleFirstView(frame, time) {\n // Skip moveToFloor for world-space mode after initial placement to prevent overriding\n if (this.xrMode !== XRMode.WORLD_SPACE || !this.worldSpaceInitialPlacementDone) {\n this.moveToAnchor(frame);\n }\n this.processInput(frame);\n const delta = time - this.lastTick;\n this.applyXRInputToScene(delta);\n this.renderer.preRender(this.presentedScene, time, delta);\n this.lastTick = time;\n this.presentedScene.renderShadow(this.threeRenderer);\n }\n /**\n * Only public to make it testable.\n */\n onWebXRFrame(time, frame) {\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n this.updateXRControllerHover();\n }\n this.frame = frame;\n // increamenets a counter tracking how many frames have been processed sinces the session started\n ++this.frames;\n // refSpace and pose are used to get the user's current position and orientation in the XR session.\n const refSpace = this.threeRenderer.xr.getReferenceSpace();\n const pose = frame.getViewerPose(refSpace);\n // Tracking loss Detection.\n // If pos is null, it means the XR system cannot currently track the user's position(e.g., the camera is covered or the env can't be recognized).\n // Checks if we previously throught tracking was working\n // Ensures that we don't report tracking loss too early(sometimes the first few frames can be null as the system initializes).\n if (pose == null && this.tracking === true && this.frames > INIT_FRAMES) {\n this.tracking = false;\n this.dispatchEvent({ type: 'tracking', status: ARTracking.NOT_TRACKING });\n }\n // Prevent rendering if there's no valid pose, no scene, or the scene isen't loaded.\n const scene = this.presentedScene;\n if (pose == null || scene == null || !scene.element.loaded) {\n this.threeRenderer.clear();\n return;\n }\n // Tracking REcovery Detection. \n // If tracking was previously lost, but now we have a valid pose, it meanse tracking has been recovered.\n if (this.tracking === false) {\n this.tracking = true;\n this.dispatchEvent({ type: 'tracking', status: ARTracking.TRACKING });\n }\n // WebXR may return multiple views, i.e. for headset AR. This\n // isn't really supported at this point, but make a best-effort\n // attempt to render other views also, using the first view\n // as the main viewpoint.\n let isFirstView = true;\n for (const view of pose.views) {\n this.updateView(view);\n if (isFirstView) {\n this.checkForDeferredCeilingPlacement();\n this.handleFirstView(frame, time);\n isFirstView = false;\n }\n this.threeRenderer.render(scene, scene.getCamera());\n }\n }\n /**\n * Calculate optimal scale and position for world-space AR presentation\n * Similar to the SVXR:FrameModel approach for consistent model presentation\n *\n * This method implements automatic model framing for world-space AR sessions:\n * 1. Calculates optimal viewing distance based on model size and minimum distance\n * 2. Positions model at a drop angle below camera center for natural viewing\n * 3. Automatically scales model to fit within viewport constraints\n * 4. Ensures consistent presentation across different model sizes\n *\n * Note: This automatic placement only happens on the first session start.\n * After initial placement, users have full control over model position, rotation, and scale.\n */\n calculateWorldSpaceOptimalPlacement(scene, camera) {\n // Get model bounding box half extents\n const boundingBox = scene.boundingBox;\n const halfExtent = {\n x: (boundingBox.max.x - boundingBox.min.x) / 2,\n y: (boundingBox.max.y - boundingBox.min.y) / 2,\n z: (boundingBox.max.z - boundingBox.min.z) / 2\n };\n // Compute view distance (with extra padding for model-viewer)\n const placementBoxPadding = PLACEMENT_BOX_EXTRA_PADDING;\n const viewDistance = Math.max(MIN_WORLD_SPACE_DISTANCE + placementBoxPadding, 2 * Math.max(halfExtent.x, halfExtent.z) + placementBoxPadding);\n // Compute ideal view position (drop angle below camera center)\n const dropAngleRad = VIEW_DROP_DEGREES * Math.PI / 180;\n const idealViewPosition = new Vector3(0, -viewDistance * Math.sin(dropAngleRad), -viewDistance * Math.cos(dropAngleRad));\n // Transform ideal view position to world space\n const worldFromCamera = camera.matrixWorld;\n const idealWorldPosition = idealViewPosition.clone().applyMatrix4(worldFromCamera);\n // Compute turntable and vertical radii\n const turntableRadius = Math.max(halfExtent.x, halfExtent.z) + placementBoxPadding;\n const verticalRadius = halfExtent.y;\n const turntableRadiusLimit = viewDistance * VIEW_RATIO;\n const verticalRadiusLimit = viewDistance * VIEW_RATIO;\n // Compute optimal scale\n const verticalScale = verticalRadiusLimit / Math.max(verticalRadius, MIN_MODEL_SIZE);\n const turntableScale = turntableRadiusLimit / Math.max(turntableRadius, MIN_MODEL_SIZE);\n const optimalScale = Math.min(verticalScale, turntableScale);\n // Offset so the model's base sits at the ideal world position\n // (subtract scaled half height in Y)\n const finalPosition = idealWorldPosition.clone().sub(new Vector3(0, optimalScale * halfExtent.y, 0));\n return {\n position: finalPosition,\n scale: optimalScale\n };\n }\n /**\n * Calculate min/max scale for world-space AR, SVXR-style\n */\n calculateWorldSpaceScaleLimits(scene) {\n const size = scene.size;\n const largestDimension = Math.max(size.x, size.y, size.z);\n const smallestDimension = Math.max(Math.min(size.x, size.y, size.z), MODEL_SIZE_EPSILON);\n const scaleMin = MIN_MODEL_SIZE / Math.max(largestDimension, MODEL_SIZE_EPSILON);\n const scaleMax = MAX_MODEL_SIZE / Math.max(smallestDimension, MODEL_SIZE_EPSILON);\n // Clamp to initial scale if needed\n this.minScale = Math.min(scaleMin, scaleMax, this.goalScale);\n this.maxScale = Math.max(scaleMin, scaleMax, this.goalScale);\n }\n}\n//# sourceMappingURL=ARRenderer.js.map","import {\n\tAnimationClip,\n\tAnimationMixer,\n\tMatrix4,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tSkeletonHelper,\n\tVector3,\n\tVectorKeyframeTrack\n} from 'three';\n\nfunction getBoneName( bone, options ) {\n\n\tif ( options.getBoneName !== undefined ) {\n\n\t\treturn options.getBoneName( bone );\n\n\t}\n\n\treturn options.names[ bone.name ];\n\n}\n\nfunction retarget( target, source, options = {} ) {\n\n\tconst quat = new Quaternion(),\n\t\tscale = new Vector3(),\n\t\trelativeMatrix = new Matrix4(),\n\t\tglobalMatrix = new Matrix4();\n\n\toptions.preserveBoneMatrix = options.preserveBoneMatrix !== undefined ? options.preserveBoneMatrix : true;\n\toptions.preserveBonePositions = options.preserveBonePositions !== undefined ? options.preserveBonePositions : true;\n\toptions.useTargetMatrix = options.useTargetMatrix !== undefined ? options.useTargetMatrix : false;\n\toptions.hip = options.hip !== undefined ? options.hip : 'hip';\n\toptions.hipInfluence = options.hipInfluence !== undefined ? options.hipInfluence : new Vector3( 1, 1, 1 );\n\toptions.scale = options.scale !== undefined ? options.scale : 1;\n\toptions.names = options.names || {};\n\n\tconst sourceBones = source.isObject3D ? source.skeleton.bones : getBones( source ),\n\t\tbones = target.isObject3D ? target.skeleton.bones : getBones( target );\n\n\tlet bone, name, boneTo,\n\t\tbonesPosition;\n\n\t// reset bones\n\n\tif ( target.isObject3D ) {\n\n\t\ttarget.skeleton.pose();\n\n\t} else {\n\n\t\toptions.useTargetMatrix = true;\n\t\toptions.preserveBoneMatrix = false;\n\n\t}\n\n\tif ( options.preserveBonePositions ) {\n\n\t\tbonesPosition = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tbonesPosition.push( bones[ i ].position.clone() );\n\n\t\t}\n\n\t}\n\n\tif ( options.preserveBoneMatrix ) {\n\n\t\t// reset matrix\n\n\t\ttarget.updateMatrixWorld();\n\n\t\ttarget.matrixWorld.identity();\n\n\t\t// reset children matrix\n\n\t\tfor ( let i = 0; i < target.children.length; ++ i ) {\n\n\t\t\ttarget.children[ i ].updateMatrixWorld( true );\n\n\t\t}\n\n\t}\n\n\tfor ( let i = 0; i < bones.length; ++ i ) {\n\n\t\tbone = bones[ i ];\n\t\tname = getBoneName( bone, options );\n\n\t\tboneTo = getBoneByName( name, sourceBones );\n\n\t\tglobalMatrix.copy( bone.matrixWorld );\n\n\t\tif ( boneTo ) {\n\n\t\t\tboneTo.updateMatrixWorld();\n\n\t\t\tif ( options.useTargetMatrix ) {\n\n\t\t\t\trelativeMatrix.copy( boneTo.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\trelativeMatrix.copy( target.matrixWorld ).invert();\n\t\t\t\trelativeMatrix.multiply( boneTo.matrixWorld );\n\n\t\t\t}\n\n\t\t\t// ignore scale to extract rotation\n\n\t\t\tscale.setFromMatrixScale( relativeMatrix );\n\t\t\trelativeMatrix.scale( scale.set( 1 / scale.x, 1 / scale.y, 1 / scale.z ) );\n\n\t\t\t// apply to global matrix\n\n\t\t\tglobalMatrix.makeRotationFromQuaternion( quat.setFromRotationMatrix( relativeMatrix ) );\n\n\t\t\tif ( target.isObject3D ) {\n\n\t\t\t\tif ( options.localOffsets ) {\n\n\t\t\t\t\tif ( options.localOffsets[ bone.name ] ) {\n\n\t\t\t\t\t\tglobalMatrix.multiply( options.localOffsets[ bone.name ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tglobalMatrix.copyPosition( relativeMatrix );\n\n\t\t}\n\n\t\tif ( name === options.hip ) {\n\n\t\t\tglobalMatrix.elements[ 12 ] *= options.scale * options.hipInfluence.x;\n\t\t\tglobalMatrix.elements[ 13 ] *= options.scale * options.hipInfluence.y;\n\t\t\tglobalMatrix.elements[ 14 ] *= options.scale * options.hipInfluence.z;\n\n\t\t\tif ( options.hipPosition !== undefined ) {\n\n\t\t\t\tglobalMatrix.elements[ 12 ] += options.hipPosition.x * options.scale;\n\t\t\t\tglobalMatrix.elements[ 13 ] += options.hipPosition.y * options.scale;\n\t\t\t\tglobalMatrix.elements[ 14 ] += options.hipPosition.z * options.scale;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( bone.parent ) {\n\n\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\tbone.matrix.multiply( globalMatrix );\n\n\t\t} else {\n\n\t\t\tbone.matrix.copy( globalMatrix );\n\n\t\t}\n\n\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\tbone.updateMatrixWorld();\n\n\t}\n\n\tif ( options.preserveBonePositions ) {\n\n\t\tfor ( let i = 0; i < bones.length; ++ i ) {\n\n\t\t\tbone = bones[ i ];\n\t\t\tname = getBoneName( bone, options ) || bone.name;\n\n\t\t\tif ( name !== options.hip ) {\n\n\t\t\t\tbone.position.copy( bonesPosition[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tif ( options.preserveBoneMatrix ) {\n\n\t\t// restore matrix\n\n\t\ttarget.updateMatrixWorld( true );\n\n\t}\n\n}\n\nfunction retargetClip( target, source, clip, options = {} ) {\n\n\toptions.useFirstFramePosition = options.useFirstFramePosition !== undefined ? options.useFirstFramePosition : false;\n\n\t// Calculate the fps from the source clip based on the track with the most frames, unless fps is already provided.\n\toptions.fps = options.fps !== undefined ? options.fps : ( Math.max( ...clip.tracks.map( track => track.times.length ) ) / clip.duration );\n\toptions.names = options.names || [];\n\n\tif ( ! source.isObject3D ) {\n\n\t\tsource = getHelperFromSkeleton( source );\n\n\t}\n\n\tconst numFrames = Math.round( clip.duration * ( options.fps / 1000 ) * 1000 ),\n\t\tdelta = clip.duration / ( numFrames - 1 ),\n\t\tconvertedTracks = [],\n\t\tmixer = new AnimationMixer( source ),\n\t\tbones = getBones( target.skeleton ),\n\t\tboneDatas = [];\n\n\tlet positionOffset,\n\t\tbone, boneTo, boneData,\n\t\tname;\n\n\tmixer.clipAction( clip ).play();\n\n\t// trim\n\n\tlet start = 0, end = numFrames;\n\n\tif ( options.trim !== undefined ) {\n\n\t\tstart = Math.round( options.trim[ 0 ] * options.fps );\n\t\tend = Math.min( Math.round( options.trim[ 1 ] * options.fps ), numFrames ) - start;\n\n\t\tmixer.update( options.trim[ 0 ] );\n\n\t} else {\n\n\t\tmixer.update( 0 );\n\n\t}\n\n\tsource.updateMatrixWorld();\n\n\t//\n\n\tfor ( let frame = 0; frame < end; ++ frame ) {\n\n\t\tconst time = frame * delta;\n\n\t\tretarget( target, source, options );\n\n\t\tfor ( let j = 0; j < bones.length; ++ j ) {\n\n\t\t\tbone = bones[ j ];\n\t\t\tname = getBoneName( bone, options ) || bone.name;\n\t\t\tboneTo = getBoneByName( name, source.skeleton );\n\n\t\t\tif ( boneTo ) {\n\n\t\t\t\tboneData = boneDatas[ j ] = boneDatas[ j ] || { bone: bone };\n\n\t\t\t\tif ( options.hip === name ) {\n\n\t\t\t\t\tif ( ! boneData.pos ) {\n\n\t\t\t\t\t\tboneData.pos = {\n\t\t\t\t\t\t\ttimes: new Float32Array( end ),\n\t\t\t\t\t\t\tvalues: new Float32Array( end * 3 )\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( options.useFirstFramePosition ) {\n\n\t\t\t\t\t\tif ( frame === 0 ) {\n\n\t\t\t\t\t\t\tpositionOffset = bone.position.clone();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbone.position.sub( positionOffset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneData.pos.times[ frame ] = time;\n\n\t\t\t\t\tbone.position.toArray( boneData.pos.values, frame * 3 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! boneData.quat ) {\n\n\t\t\t\t\tboneData.quat = {\n\t\t\t\t\t\ttimes: new Float32Array( end ),\n\t\t\t\t\t\tvalues: new Float32Array( end * 4 )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tboneData.quat.times[ frame ] = time;\n\n\t\t\t\tbone.quaternion.toArray( boneData.quat.values, frame * 4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( frame === end - 2 ) {\n\n\t\t\t// last mixer update before final loop iteration\n\t\t\t// make sure we do not go over or equal to clip duration\n\t\t\tmixer.update( delta - 0.0000001 );\n\n\t\t} else {\n\n\t\t\tmixer.update( delta );\n\n\t\t}\n\n\t\tsource.updateMatrixWorld();\n\n\t}\n\n\tfor ( let i = 0; i < boneDatas.length; ++ i ) {\n\n\t\tboneData = boneDatas[ i ];\n\n\t\tif ( boneData ) {\n\n\t\t\tif ( boneData.pos ) {\n\n\t\t\t\tconvertedTracks.push( new VectorKeyframeTrack(\n\t\t\t\t\t'.bones[' + boneData.bone.name + '].position',\n\t\t\t\t\tboneData.pos.times,\n\t\t\t\t\tboneData.pos.values\n\t\t\t\t) );\n\n\t\t\t}\n\n\t\t\tconvertedTracks.push( new QuaternionKeyframeTrack(\n\t\t\t\t'.bones[' + boneData.bone.name + '].quaternion',\n\t\t\t\tboneData.quat.times,\n\t\t\t\tboneData.quat.values\n\t\t\t) );\n\n\t\t}\n\n\t}\n\n\tmixer.uncacheAction( clip );\n\n\treturn new AnimationClip( clip.name, - 1, convertedTracks );\n\n}\n\nfunction clone( source ) {\n\n\tconst sourceLookup = new Map();\n\tconst cloneLookup = new Map();\n\n\tconst clone = source.clone();\n\n\tparallelTraverse( source, clone, function ( sourceNode, clonedNode ) {\n\n\t\tsourceLookup.set( clonedNode, sourceNode );\n\t\tcloneLookup.set( sourceNode, clonedNode );\n\n\t} );\n\n\tclone.traverse( function ( node ) {\n\n\t\tif ( ! node.isSkinnedMesh ) return;\n\n\t\tconst clonedMesh = node;\n\t\tconst sourceMesh = sourceLookup.get( node );\n\t\tconst sourceBones = sourceMesh.skeleton.bones;\n\n\t\tclonedMesh.skeleton = sourceMesh.skeleton.clone();\n\t\tclonedMesh.bindMatrix.copy( sourceMesh.bindMatrix );\n\n\t\tclonedMesh.skeleton.bones = sourceBones.map( function ( bone ) {\n\n\t\t\treturn cloneLookup.get( bone );\n\n\t\t} );\n\n\t\tclonedMesh.bind( clonedMesh.skeleton, clonedMesh.bindMatrix );\n\n\t} );\n\n\treturn clone;\n\n}\n\n// internal helper\n\nfunction getBoneByName( name, skeleton ) {\n\n\tfor ( let i = 0, bones = getBones( skeleton ); i < bones.length; i ++ ) {\n\n\t\tif ( name === bones[ i ].name )\n\n\t\t\treturn bones[ i ];\n\n\t}\n\n}\n\nfunction getBones( skeleton ) {\n\n\treturn Array.isArray( skeleton ) ? skeleton : skeleton.bones;\n\n}\n\n\nfunction getHelperFromSkeleton( skeleton ) {\n\n\tconst source = new SkeletonHelper( skeleton.bones[ 0 ] );\n\tsource.skeleton = skeleton;\n\n\treturn source;\n\n}\n\nfunction parallelTraverse( a, b, callback ) {\n\n\tcallback( a, b );\n\n\tfor ( let i = 0; i < a.children.length; i ++ ) {\n\n\t\tparallelTraverse( a.children[ i ], b.children[ i ], callback );\n\n\t}\n\n}\n\nexport {\n\tretarget,\n\tretargetClip,\n\tclone,\n};\n","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Texture } from 'three';\nimport * as SkeletonUtils from 'three/examples/jsm/utils/SkeletonUtils.js';\nexport const $prepared = Symbol('prepared');\nexport const $prepare = Symbol('prepare');\nexport const $preparedGLTF = Symbol('preparedGLTF');\nexport const $clone = Symbol('clone');\n/**\n * Represents the preparation and enhancement of the output of a Three.js\n * GLTFLoader (a Three.js-flavor \"GLTF\"), to make it suitable for optimal,\n * correct viewing in a given presentation context and also make the cloning\n * process more explicit and legible.\n *\n * A GLTFInstance is API-compatible with a Three.js-flavor \"GLTF\", so it should\n * be considered to be interchangeable with the loaded result of a GLTFLoader.\n *\n * This basic implementation only implements trivial preparation and enhancement\n * of a GLTF. These operations are intended to be enhanced by inheriting\n * classes.\n */\nexport class GLTFInstance {\n /**\n * Prepares a given GLTF for presentation and future cloning. A GLTF that is\n * prepared can safely have this method invoked on it multiple times; it will\n * only be prepared once, including after being cloned.\n */\n static prepare(source) {\n if (source.scene == null) {\n throw new Error('Model does not have a scene');\n }\n if (source[$prepared]) {\n return source;\n }\n const prepared = this[$prepare](source);\n // NOTE: ES5 Symbol polyfill is not compatible with spread operator\n // so {...prepared, [$prepared]: true} does not work\n prepared[$prepared] = true;\n return prepared;\n }\n /**\n * Override in an inheriting class to apply specialty one-time preparations\n * for a given input GLTF.\n */\n static [$prepare](source) {\n // TODO(#195,#1003): We don't currently support multiple scenes, so we don't\n // bother preparing extra scenes for now:\n const { scene } = source;\n const scenes = [scene];\n return Object.assign(Object.assign({}, source), { scene, scenes });\n }\n get parser() {\n return this[$preparedGLTF].parser;\n }\n get animations() {\n return this[$preparedGLTF].animations;\n }\n get scene() {\n return this[$preparedGLTF].scene;\n }\n get scenes() {\n return this[$preparedGLTF].scenes;\n }\n get cameras() {\n return this[$preparedGLTF].cameras;\n }\n get asset() {\n return this[$preparedGLTF].asset;\n }\n get userData() {\n return this[$preparedGLTF].userData;\n }\n constructor(preparedGLTF) {\n this[$preparedGLTF] = preparedGLTF;\n }\n /**\n * Creates and returns a copy of this instance.\n */\n clone() {\n const GLTFInstanceConstructor = this.constructor;\n const clonedGLTF = this[$clone]();\n return new GLTFInstanceConstructor(clonedGLTF);\n }\n /**\n * Cleans up any retained memory that might not otherwise be released when\n * this instance is done being used.\n */\n dispose() {\n this.scenes.forEach((scene) => {\n scene.traverse((object) => {\n const mesh = object;\n if (!mesh.material) {\n return;\n }\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n materials.forEach(material => {\n // Explicitly dispose any textures assigned to this material\n for (const propertyName in material) {\n const texture = material[propertyName];\n if (texture instanceof Texture) {\n const image = texture.source.data;\n if (image.close != null) {\n image.close();\n }\n texture.dispose();\n }\n }\n material.dispose();\n });\n mesh.geometry.dispose();\n });\n });\n }\n /**\n * Override in an inheriting class to implement specialized cloning strategies\n */\n [$clone]() {\n const source = this[$preparedGLTF];\n // TODO(#195,#1003): We don't currently support multiple scenes, so we don't\n // bother cloning extra scenes for now:\n const scene = SkeletonUtils.clone(this.scene);\n cloneVariantMaterials(scene, this.scene);\n const scenes = [scene];\n const userData = source.userData ? Object.assign({}, source.userData) : {};\n return Object.assign(Object.assign({}, source), { scene, scenes, userData });\n }\n}\n// Variant materials and original material instances are stored under\n// object.userData.variantMaterials/originalMaterial.\n// Three.js Object3D.clone() doesn't clone Three.js objects under\n// .userData so this function is a workaround.\nconst cloneVariantMaterials = (dst, src) => {\n traversePair(dst, src, (dst, src) => {\n if (src.userData.variantMaterials !== undefined) {\n dst.userData.variantMaterials = new Map(src.userData.variantMaterials);\n }\n if (src.userData.variantData !== undefined) {\n dst.userData.variantData = src.userData.variantData;\n }\n if (src.userData.originalMaterial !== undefined) {\n dst.userData.originalMaterial = src.userData.originalMaterial;\n }\n });\n};\nconst traversePair = (obj1, obj2, callback) => {\n callback(obj1, obj2);\n // Assume obj1 and obj2 have the same tree structure\n for (let i = 0; i < obj1.children.length; i++) {\n traversePair(obj1.children[i], obj2.children[i], callback);\n }\n};\n//# sourceMappingURL=GLTFInstance.js.map","import { Material } from 'three';\nconst $threeGLTF = Symbol('threeGLTF');\nconst $gltf = Symbol('gltf');\nconst $gltfElementMap = Symbol('gltfElementMap');\nconst $threeObjectMap = Symbol('threeObjectMap');\nconst $parallelTraverseThreeScene = Symbol('parallelTraverseThreeScene');\nconst $correlateOriginalThreeGLTF = Symbol('correlateOriginalThreeGLTF');\nconst $correlateCloneThreeGLTF = Symbol('correlateCloneThreeGLTF');\n/**\n * The Three.js GLTFLoader provides us with an in-memory representation\n * of a glTF in terms of Three.js constructs. It also provides us with a copy\n * of the deserialized glTF without any Three.js decoration, and a mapping of\n * glTF elements to their corresponding Three.js constructs.\n *\n * A CorrelatedSceneGraph exposes a synchronously available mapping of glTF\n * element references to their corresponding Three.js constructs.\n */\nexport class CorrelatedSceneGraph {\n /**\n * Produce a CorrelatedSceneGraph from a naturally generated Three.js GLTF.\n * Such GLTFs are produced by Three.js' GLTFLoader, and contain cached\n * details that expedite the correlation step.\n *\n * If a CorrelatedSceneGraph is provided as the second argument, re-correlates\n * a cloned Three.js GLTF with a clone of the glTF hierarchy used to produce\n * the upstream Three.js GLTF that the clone was created from. The result\n * CorrelatedSceneGraph is representative of the cloned hierarchy.\n */\n static from(threeGLTF, upstreamCorrelatedSceneGraph) {\n if (upstreamCorrelatedSceneGraph != null) {\n return this[$correlateCloneThreeGLTF](threeGLTF, upstreamCorrelatedSceneGraph);\n }\n else {\n return this[$correlateOriginalThreeGLTF](threeGLTF);\n }\n }\n static [$correlateOriginalThreeGLTF](threeGLTF) {\n const gltf = threeGLTF.parser.json;\n const associations = threeGLTF.parser.associations;\n const gltfElementMap = new Map();\n const defaultMaterial = { name: 'Default' };\n const defaultReference = { type: 'materials', index: -1 };\n for (const threeMaterial of associations.keys()) {\n // Note: GLTFLoader creates a \"default\" material that has no\n // corresponding glTF element in the case that no materials are\n // specified in the source glTF. In this case we append a default\n // material to allow this to be operated upon.\n if (threeMaterial instanceof Material &&\n associations.get(threeMaterial) == null) {\n if (defaultReference.index < 0) {\n if (gltf.materials == null) {\n gltf.materials = [];\n }\n defaultReference.index = gltf.materials.length;\n gltf.materials.push(defaultMaterial);\n }\n threeMaterial.name = defaultMaterial.name;\n associations.set(threeMaterial, { materials: defaultReference.index });\n }\n }\n // Creates a reverse look up map (gltf-object to Three-object)\n for (const [threeObject, gltfMappings] of associations) {\n if (gltfMappings) {\n threeObject.userData = threeObject.userData || {};\n threeObject.userData.associations = gltfMappings;\n }\n for (const mapping in gltfMappings) {\n if (mapping != null && mapping !== 'primitives') {\n const type = mapping;\n const elementArray = gltf[type] || [];\n const gltfElement = elementArray[gltfMappings[type]];\n if (gltfElement == null) {\n // TODO: Maybe throw here...\n continue;\n }\n let threeObjects = gltfElementMap.get(gltfElement);\n if (threeObjects == null) {\n threeObjects = new Set();\n gltfElementMap.set(gltfElement, threeObjects);\n }\n threeObjects.add(threeObject);\n }\n }\n }\n return new CorrelatedSceneGraph(threeGLTF, gltf, associations, gltfElementMap);\n }\n /**\n * Transfers the association between a raw glTF and a Three.js scene graph\n * to a clone of the Three.js scene graph, resolved as a new\n * CorrelatedSceneGraph instance.\n */\n static [$correlateCloneThreeGLTF](cloneThreeGLTF, upstreamCorrelatedSceneGraph) {\n const originalThreeGLTF = upstreamCorrelatedSceneGraph.threeGLTF;\n const originalGLTF = upstreamCorrelatedSceneGraph.gltf;\n const cloneGLTF = JSON.parse(JSON.stringify(originalGLTF));\n const cloneThreeObjectMap = new Map();\n const cloneGLTFElementMap = new Map();\n for (let i = 0; i < originalThreeGLTF.scenes.length; i++) {\n this[$parallelTraverseThreeScene](originalThreeGLTF.scenes[i], cloneThreeGLTF.scenes[i], (object, cloneObject) => {\n const elementReference = upstreamCorrelatedSceneGraph.threeObjectMap.get(object);\n if (elementReference == null) {\n return;\n }\n for (const mapping in elementReference) {\n if (mapping != null && mapping !== 'primitives') {\n const type = mapping;\n const index = elementReference[type];\n const cloneElement = cloneGLTF[type][index];\n const mappings = cloneThreeObjectMap.get(cloneObject) || {};\n mappings[type] = index;\n cloneThreeObjectMap.set(cloneObject, mappings);\n const cloneObjects = cloneGLTFElementMap.get(cloneElement) || new Set();\n cloneObjects.add(cloneObject);\n cloneGLTFElementMap.set(cloneElement, cloneObjects);\n }\n }\n });\n }\n return new CorrelatedSceneGraph(cloneThreeGLTF, cloneGLTF, cloneThreeObjectMap, cloneGLTFElementMap);\n }\n /**\n * Traverses two presumably identical Three.js scenes, and invokes a\n * callback for each Object3D or Material encountered, including the initial\n * scene. Adapted from\n * https://github.com/mrdoob/three.js/blob/7c1424c5819ab622a346dd630ee4e6431388021e/examples/jsm/utils/SkeletonUtils.js#L586-L596\n */\n static [$parallelTraverseThreeScene](sceneOne, sceneTwo, callback) {\n const traverse = (a, b) => {\n callback(a, b);\n if (a.isObject3D) {\n const meshA = a;\n const meshB = b;\n if (meshA.material) {\n if (Array.isArray(meshA.material)) {\n for (let i = 0; i < meshA.material.length; ++i) {\n callback(meshA.material[i], meshB.material[i]);\n }\n }\n else {\n callback(meshA.material, meshB.material);\n }\n }\n for (let i = 0; i < a.children.length; ++i) {\n traverse(a.children[i], b.children[i]);\n }\n }\n };\n traverse(sceneOne, sceneTwo);\n }\n /**\n * The source Three.js GLTF result given to us by a Three.js GLTFLoader.\n */\n get threeGLTF() {\n return this[$threeGLTF];\n }\n /**\n * The in-memory deserialized source glTF.\n */\n get gltf() {\n return this[$gltf];\n }\n /**\n * A Map of glTF element references to arrays of corresponding Three.js\n * object references. Three.js objects are kept in arrays to account for\n * cases where more than one Three.js object corresponds to a single glTF\n * element.\n */\n get gltfElementMap() {\n return this[$gltfElementMap];\n }\n /**\n * A map of individual Three.js objects to corresponding elements in the\n * source glTF.\n */\n get threeObjectMap() {\n return this[$threeObjectMap];\n }\n constructor(threeGLTF, gltf, threeObjectMap, gltfElementMap) {\n this[$threeGLTF] = threeGLTF;\n this[$gltf] = gltf;\n this[$gltfElementMap] = gltfElementMap;\n this[$threeObjectMap] = threeObjectMap;\n }\n}\n//# sourceMappingURL=correlated-scene-graph.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { FrontSide, Sphere } from 'three';\nimport { $clone, $prepare, $preparedGLTF, GLTFInstance } from '../GLTFInstance.js';\nimport { CorrelatedSceneGraph } from './correlated-scene-graph.js';\nconst $correlatedSceneGraph = Symbol('correlatedSceneGraph');\n/**\n * This specialization of GLTFInstance collects all of the processing needed\n * to prepare a model and to clone it making special considerations for\n * use cases.\n */\nexport class ModelViewerGLTFInstance extends GLTFInstance {\n /**\n * @override\n */\n static [$prepare](source) {\n const prepared = super[$prepare](source);\n if (prepared[$correlatedSceneGraph] == null) {\n prepared[$correlatedSceneGraph] = CorrelatedSceneGraph.from(prepared);\n }\n const { scene } = prepared;\n const nullSphere = new Sphere(undefined, Infinity);\n scene.traverse((node) => {\n // Set a high renderOrder while we're here to ensure the model\n // always renders on top of the sky sphere\n node.renderOrder = 1000;\n // Three.js seems to cull some animated models incorrectly. Since we\n // expect to view our whole scene anyway, we turn off the frustum\n // culling optimization here.\n node.frustumCulled = false;\n // Animations for objects without names target their UUID instead. When\n // objects are cloned, they get new UUIDs which the animation can't\n // find. To fix this, we assign their UUID as their name.\n if (!node.name) {\n node.name = node.uuid;\n }\n const mesh = node;\n if (mesh.material) {\n const { geometry } = mesh;\n mesh.castShadow = true;\n if (mesh.isSkinnedMesh) {\n // Akin to disabling frustum culling above, we have to also manually\n // disable the bounds to make raycasting correct for skinned meshes.\n geometry.boundingSphere = nullSphere;\n // The bounding box is set in GLTFLoader by the accessor bounds, which\n // are not updated with animation.\n geometry.boundingBox = null;\n }\n const material = mesh.material;\n if (material.isMeshBasicMaterial === true) {\n material.toneMapped = false;\n }\n // This makes shadows better for non-manifold meshes\n material.shadowSide = FrontSide;\n // Fixes an edge case with unused extra UV-coords being incorrectly\n // referenced by three.js; remove when\n // https://github.com/mrdoob/three.js/pull/23974 is merged.\n if (material.aoMap) {\n const { gltf, threeObjectMap } = prepared[$correlatedSceneGraph];\n const gltfRef = threeObjectMap.get(material);\n if (gltf.materials != null && gltfRef != null &&\n gltfRef.materials != null) {\n const gltfMaterial = gltf.materials[gltfRef.materials];\n if (gltfMaterial.occlusionTexture &&\n gltfMaterial.occlusionTexture.texCoord === 0 &&\n geometry.attributes.uv != null) {\n geometry.setAttribute('uv2', geometry.attributes.uv);\n }\n }\n }\n }\n });\n return prepared;\n }\n get correlatedSceneGraph() {\n return this[$preparedGLTF][$correlatedSceneGraph];\n }\n /**\n * @override\n */\n [$clone]() {\n const clone = super[$clone]();\n const sourceUUIDToClonedMaterial = new Map();\n clone.scene.traverse((node) => {\n // Materials aren't cloned when cloning meshes; geometry\n // and materials are copied by reference. This is necessary\n // for the same model to be used twice with different\n // scene-graph operations.\n const mesh = node;\n if (mesh.material) {\n const material = mesh.material;\n if (material != null) {\n if (sourceUUIDToClonedMaterial.has(material.uuid)) {\n mesh.material = sourceUUIDToClonedMaterial.get(material.uuid);\n return;\n }\n mesh.material = material.clone();\n sourceUUIDToClonedMaterial.set(material.uuid, mesh.material);\n }\n }\n const light = node;\n if (light.target !== undefined) {\n // The target's parent is lost in the cloning process, but in\n // GLTFLoader, all light targets are children of their light.\n light.add(light.target);\n }\n });\n // Cross-correlate the scene graph by relying on information in the\n // current scene graph; without this step, relationships between the\n // Three.js object graph and the glTF scene graph will be lost.\n clone[$correlatedSceneGraph] =\n CorrelatedSceneGraph.from(clone, this.correlatedSceneGraph);\n return clone;\n }\n}\n//# sourceMappingURL=ModelViewerGLTFInstance.js.map","/**\n * @monogrid/gainmap-js v3.1.0\n * With ❤️, by MONOGRID \n */\n\nimport { RGBAFormat, LinearFilter, ClampToEdgeWrapping, Scene, OrthographicCamera, HalfFloatType, FloatType, Mesh, PlaneGeometry, WebGLRenderTarget, UVMapping, WebGLRenderer, DataTexture, LinearSRGBColorSpace, ShaderMaterial, Texture, IntType, ShortType, ByteType, UnsignedIntType, UnsignedByteType, MeshBasicMaterial } from 'three';\n\nconst getBufferForType = (type, width, height) => {\n let out;\n switch (type) {\n case UnsignedByteType:\n out = new Uint8ClampedArray(width * height * 4);\n break;\n case HalfFloatType:\n out = new Uint16Array(width * height * 4);\n break;\n case UnsignedIntType:\n out = new Uint32Array(width * height * 4);\n break;\n case ByteType:\n out = new Int8Array(width * height * 4);\n break;\n case ShortType:\n out = new Int16Array(width * height * 4);\n break;\n case IntType:\n out = new Int32Array(width * height * 4);\n break;\n case FloatType:\n out = new Float32Array(width * height * 4);\n break;\n default:\n throw new Error('Unsupported data type');\n }\n return out;\n};\nlet _canReadPixelsResult;\n/**\n * Test if this browser implementation can correctly read pixels from the specified\n * Render target type.\n *\n * Runs only once\n *\n * @param type\n * @param renderer\n * @param camera\n * @param renderTargetOptions\n * @returns\n */\nconst canReadPixels = (type, renderer, camera, renderTargetOptions) => {\n if (_canReadPixelsResult !== undefined)\n return _canReadPixelsResult;\n const testRT = new WebGLRenderTarget(1, 1, renderTargetOptions);\n renderer.setRenderTarget(testRT);\n const mesh = new Mesh(new PlaneGeometry(), new MeshBasicMaterial({ color: 0xffffff }));\n renderer.render(mesh, camera);\n renderer.setRenderTarget(null);\n const out = getBufferForType(type, testRT.width, testRT.height);\n renderer.readRenderTargetPixels(testRT, 0, 0, testRT.width, testRT.height, out);\n testRT.dispose();\n mesh.geometry.dispose();\n mesh.material.dispose();\n _canReadPixelsResult = out[0] !== 0;\n return _canReadPixelsResult;\n};\n/**\n * Utility class used for rendering a texture with a material\n *\n * @category Core\n * @group Core\n */\nclass QuadRenderer {\n /**\n * Constructs a new QuadRenderer\n *\n * @param options Parameters for this QuadRenderer\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;\n this._rendererIsDisposable = false;\n this._supportsReadPixels = true;\n /**\n * Renders the input texture using the specified material\n */\n this.render = () => {\n this._renderer.setRenderTarget(this._renderTarget);\n try {\n this._renderer.render(this._scene, this._camera);\n }\n catch (e) {\n this._renderer.setRenderTarget(null);\n throw e;\n }\n this._renderer.setRenderTarget(null);\n };\n this._width = options.width;\n this._height = options.height;\n this._type = options.type;\n this._colorSpace = options.colorSpace;\n const rtOptions = {\n // fixed options\n format: RGBAFormat,\n depthBuffer: false,\n stencilBuffer: false,\n // user options\n type: this._type, // set in class property\n colorSpace: this._colorSpace, // set in class property\n anisotropy: ((_a = options.renderTargetOptions) === null || _a === void 0 ? void 0 : _a.anisotropy) !== undefined ? (_b = options.renderTargetOptions) === null || _b === void 0 ? void 0 : _b.anisotropy : 1,\n generateMipmaps: ((_c = options.renderTargetOptions) === null || _c === void 0 ? void 0 : _c.generateMipmaps) !== undefined ? (_d = options.renderTargetOptions) === null || _d === void 0 ? void 0 : _d.generateMipmaps : false,\n magFilter: ((_e = options.renderTargetOptions) === null || _e === void 0 ? void 0 : _e.magFilter) !== undefined ? (_f = options.renderTargetOptions) === null || _f === void 0 ? void 0 : _f.magFilter : LinearFilter,\n minFilter: ((_g = options.renderTargetOptions) === null || _g === void 0 ? void 0 : _g.minFilter) !== undefined ? (_h = options.renderTargetOptions) === null || _h === void 0 ? void 0 : _h.minFilter : LinearFilter,\n samples: ((_j = options.renderTargetOptions) === null || _j === void 0 ? void 0 : _j.samples) !== undefined ? (_k = options.renderTargetOptions) === null || _k === void 0 ? void 0 : _k.samples : undefined,\n wrapS: ((_l = options.renderTargetOptions) === null || _l === void 0 ? void 0 : _l.wrapS) !== undefined ? (_m = options.renderTargetOptions) === null || _m === void 0 ? void 0 : _m.wrapS : ClampToEdgeWrapping,\n wrapT: ((_o = options.renderTargetOptions) === null || _o === void 0 ? void 0 : _o.wrapT) !== undefined ? (_p = options.renderTargetOptions) === null || _p === void 0 ? void 0 : _p.wrapT : ClampToEdgeWrapping\n };\n this._material = options.material;\n if (options.renderer) {\n this._renderer = options.renderer;\n }\n else {\n this._renderer = QuadRenderer.instantiateRenderer();\n this._rendererIsDisposable = true;\n }\n this._scene = new Scene();\n this._camera = new OrthographicCamera();\n this._camera.position.set(0, 0, 10);\n this._camera.left = -0.5;\n this._camera.right = 0.5;\n this._camera.top = 0.5;\n this._camera.bottom = -0.5;\n this._camera.updateProjectionMatrix();\n if (!canReadPixels(this._type, this._renderer, this._camera, rtOptions)) {\n let alternativeType;\n switch (this._type) {\n case HalfFloatType:\n alternativeType = this._renderer.extensions.has('EXT_color_buffer_float') ? FloatType : undefined;\n break;\n }\n if (alternativeType !== undefined) {\n console.warn(`This browser does not support reading pixels from ${this._type} RenderTargets, switching to ${FloatType}`);\n this._type = alternativeType;\n }\n else {\n this._supportsReadPixels = false;\n console.warn('This browser dos not support toArray or toDataTexture, calls to those methods will result in an error thrown');\n }\n }\n this._quad = new Mesh(new PlaneGeometry(), this._material);\n this._quad.geometry.computeBoundingBox();\n this._scene.add(this._quad);\n this._renderTarget = new WebGLRenderTarget(this.width, this.height, rtOptions);\n this._renderTarget.texture.mapping = ((_q = options.renderTargetOptions) === null || _q === void 0 ? void 0 : _q.mapping) !== undefined ? (_r = options.renderTargetOptions) === null || _r === void 0 ? void 0 : _r.mapping : UVMapping;\n }\n /**\n * Instantiates a temporary renderer\n *\n * @returns\n */\n static instantiateRenderer() {\n const renderer = new WebGLRenderer();\n renderer.setSize(128, 128);\n // renderer.outputColorSpace = SRGBColorSpace\n // renderer.toneMapping = LinearToneMapping\n // renderer.debug.checkShaderErrors = false\n // this._rendererIsDisposable = true\n return renderer;\n }\n /**\n * Obtains a Buffer containing the rendered texture.\n *\n * @throws Error if the browser cannot read pixels from this RenderTarget type.\n * @returns a TypedArray containing RGBA values from this renderer\n */\n toArray() {\n if (!this._supportsReadPixels)\n throw new Error('Can\\'t read pixels in this browser');\n const out = getBufferForType(this._type, this._width, this._height);\n this._renderer.readRenderTargetPixels(this._renderTarget, 0, 0, this._width, this._height, out);\n return out;\n }\n /**\n * Performs a readPixel operation in the renderTarget\n * and returns a DataTexture containing the read data\n *\n * @param options options\n * @returns\n */\n toDataTexture(options) {\n const returnValue = new DataTexture(\n // fixed values\n this.toArray(), this.width, this.height, RGBAFormat, this._type, \n // user values\n (options === null || options === void 0 ? void 0 : options.mapping) || UVMapping, (options === null || options === void 0 ? void 0 : options.wrapS) || ClampToEdgeWrapping, (options === null || options === void 0 ? void 0 : options.wrapT) || ClampToEdgeWrapping, (options === null || options === void 0 ? void 0 : options.magFilter) || LinearFilter, (options === null || options === void 0 ? void 0 : options.minFilter) || LinearFilter, (options === null || options === void 0 ? void 0 : options.anisotropy) || 1, \n // fixed value\n LinearSRGBColorSpace);\n // set this afterwards, we can't set it in constructor\n returnValue.generateMipmaps = (options === null || options === void 0 ? void 0 : options.generateMipmaps) !== undefined ? options === null || options === void 0 ? void 0 : options.generateMipmaps : false;\n return returnValue;\n }\n /**\n * If using a disposable renderer, it will dispose it.\n */\n disposeOnDemandRenderer() {\n this._renderer.setRenderTarget(null);\n if (this._rendererIsDisposable) {\n this._renderer.dispose();\n this._renderer.forceContextLoss();\n }\n }\n /**\n * Will dispose of **all** assets used by this renderer.\n *\n *\n * @param disposeRenderTarget will dispose of the renderTarget which will not be usable later\n * set this to true if you passed the `renderTarget.texture` to a `PMREMGenerator`\n * or are otherwise done with it.\n *\n * @example\n * ```js\n * const loader = new HDRJPGLoader(renderer)\n * const result = await loader.loadAsync('gainmap.jpeg')\n * const mesh = new Mesh(geometry, new MeshBasicMaterial({ map: result.renderTarget.texture }) )\n * // DO NOT dispose the renderTarget here,\n * // it is used directly in the material\n * result.dispose()\n * ```\n *\n * @example\n * ```js\n * const loader = new HDRJPGLoader(renderer)\n * const pmremGenerator = new PMREMGenerator( renderer );\n * const result = await loader.loadAsync('gainmap.jpeg')\n * const envMap = pmremGenerator.fromEquirectangular(result.renderTarget.texture)\n * const mesh = new Mesh(geometry, new MeshStandardMaterial({ envMap }) )\n * // renderTarget can be disposed here\n * // because it was used to generate a PMREM texture\n * result.dispose(true)\n * ```\n */\n dispose(disposeRenderTarget) {\n this.disposeOnDemandRenderer();\n if (disposeRenderTarget) {\n this.renderTarget.dispose();\n }\n // dispose shader material texture uniforms\n if (this.material instanceof ShaderMaterial) {\n Object.values(this.material.uniforms).forEach(v => {\n if (v.value instanceof Texture)\n v.value.dispose();\n });\n }\n // dispose other material properties\n Object.values(this.material).forEach(value => {\n if (value instanceof Texture)\n value.dispose();\n });\n this.material.dispose();\n this._quad.geometry.dispose();\n }\n /**\n * Width of the texture\n */\n get width() { return this._width; }\n set width(value) {\n this._width = value;\n this._renderTarget.setSize(this._width, this._height);\n }\n /**\n * Height of the texture\n */\n get height() { return this._height; }\n set height(value) {\n this._height = value;\n this._renderTarget.setSize(this._width, this._height);\n }\n /**\n * The renderer used\n */\n get renderer() { return this._renderer; }\n /**\n * The `WebGLRenderTarget` used.\n */\n get renderTarget() { return this._renderTarget; }\n set renderTarget(value) {\n this._renderTarget = value;\n this._width = value.width;\n this._height = value.height;\n // this._type = value.texture.type\n }\n /**\n * The `Material` used.\n */\n get material() { return this._material; }\n /**\n *\n */\n get type() { return this._type; }\n get colorSpace() { return this._colorSpace; }\n}\n\nexport { QuadRenderer as Q };\n","/**\n * @monogrid/gainmap-js v3.1.0\n * With ❤️, by MONOGRID \n */\n\nimport { Q as QuadRenderer } from './QuadRenderer-DuOPRGA4.js';\nimport { ShaderMaterial, Vector3, NoBlending, SRGBColorSpace, LinearSRGBColorSpace, HalfFloatType, Loader, LoadingManager, Texture, UVMapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, FileLoader } from 'three';\n\nconst vertexShader = /* glsl */ `\nvarying vec2 vUv;\n\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\nconst fragmentShader = /* glsl */ `\n// min half float value\n#define HALF_FLOAT_MIN vec3( -65504, -65504, -65504 )\n// max half float value\n#define HALF_FLOAT_MAX vec3( 65504, 65504, 65504 )\n\nuniform sampler2D sdr;\nuniform sampler2D gainMap;\nuniform vec3 gamma;\nuniform vec3 offsetHdr;\nuniform vec3 offsetSdr;\nuniform vec3 gainMapMin;\nuniform vec3 gainMapMax;\nuniform float weightFactor;\n\nvarying vec2 vUv;\n\nvoid main() {\n vec3 rgb = texture2D( sdr, vUv ).rgb;\n vec3 recovery = texture2D( gainMap, vUv ).rgb;\n vec3 logRecovery = pow( recovery, gamma );\n vec3 logBoost = gainMapMin * ( 1.0 - logRecovery ) + gainMapMax * logRecovery;\n vec3 hdrColor = (rgb + offsetSdr) * exp2( logBoost * weightFactor ) - offsetHdr;\n vec3 clampedHdrColor = max( HALF_FLOAT_MIN, min( HALF_FLOAT_MAX, hdrColor ));\n gl_FragColor = vec4( clampedHdrColor , 1.0 );\n}\n`;\n/**\n * A Material which is able to decode the Gainmap into a full HDR Representation\n *\n * @category Materials\n * @group Materials\n */\nclass GainMapDecoderMaterial extends ShaderMaterial {\n /**\n *\n * @param params\n */\n constructor({ gamma, offsetHdr, offsetSdr, gainMapMin, gainMapMax, maxDisplayBoost, hdrCapacityMin, hdrCapacityMax, sdr, gainMap }) {\n super({\n name: 'GainMapDecoderMaterial',\n vertexShader,\n fragmentShader,\n uniforms: {\n sdr: { value: sdr },\n gainMap: { value: gainMap },\n gamma: { value: new Vector3(1.0 / gamma[0], 1.0 / gamma[1], 1.0 / gamma[2]) },\n offsetHdr: { value: new Vector3().fromArray(offsetHdr) },\n offsetSdr: { value: new Vector3().fromArray(offsetSdr) },\n gainMapMin: { value: new Vector3().fromArray(gainMapMin) },\n gainMapMax: { value: new Vector3().fromArray(gainMapMax) },\n weightFactor: {\n value: (Math.log2(maxDisplayBoost) - hdrCapacityMin) / (hdrCapacityMax - hdrCapacityMin)\n }\n },\n blending: NoBlending,\n depthTest: false,\n depthWrite: false\n });\n this._maxDisplayBoost = maxDisplayBoost;\n this._hdrCapacityMin = hdrCapacityMin;\n this._hdrCapacityMax = hdrCapacityMax;\n this.needsUpdate = true;\n this.uniformsNeedUpdate = true;\n }\n get sdr() { return this.uniforms.sdr.value; }\n set sdr(value) { this.uniforms.sdr.value = value; }\n get gainMap() { return this.uniforms.gainMap.value; }\n set gainMap(value) { this.uniforms.gainMap.value = value; }\n /**\n * @see {@link GainMapMetadata.offsetHdr}\n */\n get offsetHdr() { return this.uniforms.offsetHdr.value.toArray(); }\n set offsetHdr(value) { this.uniforms.offsetHdr.value.fromArray(value); }\n /**\n * @see {@link GainMapMetadata.offsetSdr}\n */\n get offsetSdr() { return this.uniforms.offsetSdr.value.toArray(); }\n set offsetSdr(value) { this.uniforms.offsetSdr.value.fromArray(value); }\n /**\n * @see {@link GainMapMetadata.gainMapMin}\n */\n get gainMapMin() { return this.uniforms.gainMapMin.value.toArray(); }\n set gainMapMin(value) { this.uniforms.gainMapMin.value.fromArray(value); }\n /**\n * @see {@link GainMapMetadata.gainMapMax}\n */\n get gainMapMax() { return this.uniforms.gainMapMax.value.toArray(); }\n set gainMapMax(value) { this.uniforms.gainMapMax.value.fromArray(value); }\n /**\n * @see {@link GainMapMetadata.gamma}\n */\n get gamma() {\n const g = this.uniforms.gamma.value;\n return [1 / g.x, 1 / g.y, 1 / g.z];\n }\n set gamma(value) {\n const g = this.uniforms.gamma.value;\n g.x = 1.0 / value[0];\n g.y = 1.0 / value[1];\n g.z = 1.0 / value[2];\n }\n /**\n * @see {@link GainMapMetadata.hdrCapacityMin}\n * @remarks Logarithmic space\n */\n get hdrCapacityMin() { return this._hdrCapacityMin; }\n set hdrCapacityMin(value) {\n this._hdrCapacityMin = value;\n this.calculateWeight();\n }\n /**\n * @see {@link GainMapMetadata.hdrCapacityMin}\n * @remarks Logarithmic space\n */\n get hdrCapacityMax() { return this._hdrCapacityMax; }\n set hdrCapacityMax(value) {\n this._hdrCapacityMax = value;\n this.calculateWeight();\n }\n /**\n * @see {@link GainmapDecodingParameters.maxDisplayBoost}\n * @remarks Non Logarithmic space\n */\n get maxDisplayBoost() { return this._maxDisplayBoost; }\n set maxDisplayBoost(value) {\n this._maxDisplayBoost = Math.max(1, Math.min(65504, value));\n this.calculateWeight();\n }\n calculateWeight() {\n const val = (Math.log2(this._maxDisplayBoost) - this._hdrCapacityMin) / (this._hdrCapacityMax - this._hdrCapacityMin);\n this.uniforms.weightFactor.value = Math.max(0, Math.min(1, val));\n }\n}\n\n/**\n * Decodes a gain map using a WebGLRenderTarget\n *\n * @category Decoding Functions\n * @group Decoding Functions\n * @example\n * import { decode } from '@monogrid/gainmap-js'\n * import {\n * Mesh,\n * MeshBasicMaterial,\n * PerspectiveCamera,\n * PlaneGeometry,\n * Scene,\n * TextureLoader,\n * WebGLRenderer\n * } from 'three'\n *\n * const renderer = new WebGLRenderer()\n *\n * const textureLoader = new TextureLoader()\n *\n * // load SDR Representation\n * const sdr = await textureLoader.loadAsync('sdr.jpg')\n * // load Gain map recovery image\n * const gainMap = await textureLoader.loadAsync('gainmap.jpg')\n * // load metadata\n * const metadata = await (await fetch('metadata.json')).json()\n *\n * const result = await decode({\n * sdr,\n * gainMap,\n * // this allows to use `result.renderTarget.texture` directly\n * renderer,\n * // this will restore the full HDR range\n * maxDisplayBoost: Math.pow(2, metadata.hdrCapacityMax),\n * ...metadata\n * })\n *\n * const scene = new Scene()\n * // `result` can be used to populate a Texture\n * const mesh = new Mesh(\n * new PlaneGeometry(),\n * new MeshBasicMaterial({ map: result.renderTarget.texture })\n * )\n * scene.add(mesh)\n * renderer.render(scene, new PerspectiveCamera())\n *\n * // result must be manually disposed\n * // when you are done using it\n * result.dispose()\n *\n * @param params\n * @returns\n * @throws {Error} if the WebGLRenderer fails to render the gain map\n */\nconst decode = (params) => {\n const { sdr, gainMap, renderer } = params;\n if (sdr.colorSpace !== SRGBColorSpace) {\n console.warn('SDR Colorspace needs to be *SRGBColorSpace*, setting it automatically');\n sdr.colorSpace = SRGBColorSpace;\n }\n sdr.needsUpdate = true;\n if (gainMap.colorSpace !== LinearSRGBColorSpace) {\n console.warn('Gainmap Colorspace needs to be *LinearSRGBColorSpace*, setting it automatically');\n gainMap.colorSpace = LinearSRGBColorSpace;\n }\n gainMap.needsUpdate = true;\n const material = new GainMapDecoderMaterial({\n ...params,\n sdr,\n gainMap\n });\n const quadRenderer = new QuadRenderer({\n // TODO: three types are generic, eslint complains here, see how we can solve\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n width: sdr.image.width,\n // TODO: three types are generic, eslint complains here, see how we can solve\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n height: sdr.image.height,\n type: HalfFloatType,\n colorSpace: LinearSRGBColorSpace,\n material,\n renderer,\n renderTargetOptions: params.renderTargetOptions\n });\n try {\n quadRenderer.render();\n }\n catch (e) {\n quadRenderer.disposeOnDemandRenderer();\n throw e;\n }\n return quadRenderer;\n};\n\nclass GainMapNotFoundError extends Error {\n}\n\nclass XMPMetadataNotFoundError extends Error {\n}\n\nconst getXMLValue = (xml, tag, defaultValue) => {\n // Check for attribute format first: tag=\"value\"\n const attributeMatch = new RegExp(`${tag}=\"([^\"]*)\"`, 'i').exec(xml);\n if (attributeMatch)\n return attributeMatch[1];\n // Check for tag format: value or value...\n const tagMatch = new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)`, 'i').exec(xml);\n if (tagMatch) {\n // Check if it contains rdf:li elements\n const liValues = tagMatch[1].match(/([^<]*)<\\/rdf:li>/g);\n if (liValues && liValues.length === 3) {\n return liValues.map(v => v.replace(/<\\/?rdf:li>/g, ''));\n }\n return tagMatch[1].trim();\n }\n if (defaultValue !== undefined)\n return defaultValue;\n throw new Error(`Can't find ${tag} in gainmap metadata`);\n};\nconst extractXMP = (input) => {\n let str;\n // support node test environment\n if (typeof TextDecoder !== 'undefined')\n str = new TextDecoder().decode(input);\n else\n str = input.toString();\n let start = str.indexOf('', start);\n const xmpBlock = str.slice(start, end + 10);\n try {\n const gainMapMin = getXMLValue(xmpBlock, 'hdrgm:GainMapMin', '0');\n const gainMapMax = getXMLValue(xmpBlock, 'hdrgm:GainMapMax');\n const gamma = getXMLValue(xmpBlock, 'hdrgm:Gamma', '1');\n const offsetSDR = getXMLValue(xmpBlock, 'hdrgm:OffsetSDR', '0.015625');\n const offsetHDR = getXMLValue(xmpBlock, 'hdrgm:OffsetHDR', '0.015625');\n // These are always attributes, so we can use a simpler regex\n const hdrCapacityMinMatch = /hdrgm:HDRCapacityMin=\"([^\"]*)\"/.exec(xmpBlock);\n const hdrCapacityMin = hdrCapacityMinMatch ? hdrCapacityMinMatch[1] : '0';\n const hdrCapacityMaxMatch = /hdrgm:HDRCapacityMax=\"([^\"]*)\"/.exec(xmpBlock);\n if (!hdrCapacityMaxMatch)\n throw new Error('Incomplete gainmap metadata');\n const hdrCapacityMax = hdrCapacityMaxMatch[1];\n return {\n gainMapMin: Array.isArray(gainMapMin) ? gainMapMin.map(v => parseFloat(v)) : [parseFloat(gainMapMin), parseFloat(gainMapMin), parseFloat(gainMapMin)],\n gainMapMax: Array.isArray(gainMapMax) ? gainMapMax.map(v => parseFloat(v)) : [parseFloat(gainMapMax), parseFloat(gainMapMax), parseFloat(gainMapMax)],\n gamma: Array.isArray(gamma) ? gamma.map(v => parseFloat(v)) : [parseFloat(gamma), parseFloat(gamma), parseFloat(gamma)],\n offsetSdr: Array.isArray(offsetSDR) ? offsetSDR.map(v => parseFloat(v)) : [parseFloat(offsetSDR), parseFloat(offsetSDR), parseFloat(offsetSDR)],\n offsetHdr: Array.isArray(offsetHDR) ? offsetHDR.map(v => parseFloat(v)) : [parseFloat(offsetHDR), parseFloat(offsetHDR), parseFloat(offsetHDR)],\n hdrCapacityMin: parseFloat(hdrCapacityMin),\n hdrCapacityMax: parseFloat(hdrCapacityMax)\n };\n }\n catch (e) {\n // Continue searching for another xmpmeta block if this one fails\n }\n start = str.indexOf(' {\n const debug = this.options.debug;\n const dataView = new DataView(imageArrayBuffer.buffer);\n // If you're executing this line on a big endian machine, it'll be reversed.\n // bigEnd further down though, refers to the endianness of the image itself.\n if (dataView.getUint16(0) !== 0xffd8) {\n reject(new Error('Not a valid jpeg'));\n return;\n }\n const length = dataView.byteLength;\n let offset = 2;\n let loops = 0;\n let marker; // APP# marker\n while (offset < length) {\n if (++loops > 250) {\n reject(new Error(`Found no marker after ${loops} loops 😵`));\n return;\n }\n if (dataView.getUint8(offset) !== 0xff) {\n reject(new Error(`Not a valid marker at offset 0x${offset.toString(16)}, found: 0x${dataView.getUint8(offset).toString(16)}`));\n return;\n }\n marker = dataView.getUint8(offset + 1);\n if (debug)\n console.log(`Marker: ${marker.toString(16)}`);\n if (marker === 0xe2) {\n if (debug)\n console.log('Found APP2 marker (0xffe2)');\n // Works for iPhone 8 Plus, X, and XSMax. Or any photos of MPF format.\n // Great way to visualize image information in html is using Exiftool. E.g.:\n // ./exiftool.exe -htmldump -wantTrailer photo.jpg > photo.html\n const formatPt = offset + 4;\n /*\n * Structure of the MP Format Identifier\n *\n * Offset Addr. | Code (Hex) | Description\n * +00 ff Marker Prefix <-- offset\n * +01 e2 APP2\n * +02 #n APP2 Field Length\n * +03 #n APP2 Field Length\n * +04 4d 'M' <-- formatPt\n * +05 50 'P'\n * +06 46 'F'\n * +07 00 NULL\n * <-- tiffOffset\n */\n if (dataView.getUint32(formatPt) === 0x4d504600) {\n // Found MPF tag, so we start dig out sub images\n const tiffOffset = formatPt + 4;\n let bigEnd; // Endianness from TIFF header\n // Test for TIFF validity and endianness\n // 0x4949 and 0x4D4D ('II' and 'MM') marks Little Endian and Big Endian\n if (dataView.getUint16(tiffOffset) === 0x4949) {\n bigEnd = false;\n }\n else if (dataView.getUint16(tiffOffset) === 0x4d4d) {\n bigEnd = true;\n }\n else {\n reject(new Error('No valid endianness marker found in TIFF header'));\n return;\n }\n if (dataView.getUint16(tiffOffset + 2, !bigEnd) !== 0x002a) {\n reject(new Error('Not valid TIFF data! (no 0x002A marker)'));\n return;\n }\n // 32 bit number stating the offset from the start of the 8 Byte MP Header\n // to MP Index IFD Least possible value is thus 8 (means 0 offset)\n const firstIFDOffset = dataView.getUint32(tiffOffset + 4, !bigEnd);\n if (firstIFDOffset < 0x00000008) {\n reject(new Error('Not valid TIFF data! (First offset less than 8)'));\n return;\n }\n // Move ahead to MP Index IFD\n // Assume we're at the first IFD, so firstIFDOffset points to\n // MP Index IFD and not MP Attributes IFD. (If we try extract from a sub image,\n // we fail silently here due to this assumption)\n // Count (2 Byte) | MP Index Fields a.k.a. MP Entries (count * 12 Byte) | Offset of Next IFD (4 Byte)\n const dirStart = tiffOffset + firstIFDOffset; // Start of IFD (Image File Directory)\n const count = dataView.getUint16(dirStart, !bigEnd); // Count of MPEntries (2 Byte)\n // Extract info from MPEntries (starting after Count)\n const entriesStart = dirStart + 2;\n let numberOfImages = 0;\n for (let i = entriesStart; i < entriesStart + 12 * count; i += 12) {\n // Each entry is 12 Bytes long\n // Check MP Index IFD tags, here we only take tag 0xb001 = Number of images\n if (dataView.getUint16(i, !bigEnd) === 0xb001) {\n // stored in Last 4 bytes of its 12 Byte entry.\n numberOfImages = dataView.getUint32(i + 8, !bigEnd);\n }\n }\n const nextIFDOffsetLen = 4; // 4 Byte offset field that appears after MP Index IFD tags\n const MPImageListValPt = dirStart + 2 + count * 12 + nextIFDOffsetLen;\n const images = [];\n for (let i = MPImageListValPt; i < MPImageListValPt + numberOfImages * 16; i += 16) {\n const image = {\n MPType: dataView.getUint32(i, !bigEnd),\n size: dataView.getUint32(i + 4, !bigEnd),\n // This offset is specified relative to the address of the MP Endian\n // field in the MP Header, unless the image is a First Individual Image,\n // in which case the value of the offset shall be NULL (0x00000000).\n dataOffset: dataView.getUint32(i + 8, !bigEnd),\n dependantImages: dataView.getUint32(i + 12, !bigEnd),\n start: -1,\n end: -1,\n isFII: false\n };\n if (!image.dataOffset) {\n // dataOffset is 0x00000000 for First Individual Image\n image.start = 0;\n image.isFII = true;\n }\n else {\n image.start = tiffOffset + image.dataOffset;\n image.isFII = false;\n }\n image.end = image.start + image.size;\n images.push(image);\n }\n if (this.options.extractNonFII && images.length) {\n const bufferBlob = new Blob([dataView]);\n const imgs = [];\n for (const image of images) {\n if (image.isFII && !this.options.extractFII) {\n continue; // Skip FII\n }\n const imageBlob = bufferBlob.slice(image.start, image.end + 1, 'image/jpeg');\n // we don't need this\n // const imageUrl = URL.createObjectURL(imageBlob)\n // image.img = document.createElement('img')\n // image.img.src = imageUrl\n imgs.push(imageBlob);\n }\n resolve(imgs);\n }\n }\n }\n offset += 2 + dataView.getUint16(offset + 2);\n }\n });\n }\n}\n\n/**\n * Extracts XMP Metadata and the gain map recovery image\n * from a single JPEG file.\n *\n * @category Decoding Functions\n * @group Decoding Functions\n * @param jpegFile an `Uint8Array` containing and encoded JPEG file\n * @returns an sdr `Uint8Array` compressed in JPEG, a gainMap `Uint8Array` compressed in JPEG and the XMP parsed XMP metadata\n * @throws Error if XMP Metadata is not found\n * @throws Error if Gain map image is not found\n * @example\n * import { FileLoader } from 'three'\n * import { extractGainmapFromJPEG } from '@monogrid/gainmap-js'\n *\n * const jpegFile = await new FileLoader()\n * .setResponseType('arraybuffer')\n * .loadAsync('image.jpg')\n *\n * const { sdr, gainMap, metadata } = extractGainmapFromJPEG(jpegFile)\n */\nconst extractGainmapFromJPEG = async (jpegFile) => {\n const metadata = extractXMP(jpegFile);\n if (!metadata)\n throw new XMPMetadataNotFoundError('Gain map XMP metadata not found');\n const mpfExtractor = new MPFExtractor({ extractFII: true, extractNonFII: true });\n const images = await mpfExtractor.extract(jpegFile);\n if (images.length !== 2)\n throw new GainMapNotFoundError('Gain map recovery image not found');\n return {\n sdr: new Uint8Array(await images[0].arrayBuffer()),\n gainMap: new Uint8Array(await images[1].arrayBuffer()),\n metadata\n };\n};\n\n/**\n * private function, async get image from blob\n *\n * @param blob\n * @returns\n */\nconst getHTMLImageFromBlob = (blob) => {\n return new Promise((resolve, reject) => {\n const img = document.createElement('img');\n img.onload = () => { resolve(img); };\n img.onerror = (e) => { reject(e); };\n img.src = URL.createObjectURL(blob);\n });\n};\n\nclass LoaderBase extends Loader {\n /**\n *\n * @param renderer\n * @param manager\n */\n constructor(renderer, manager) {\n super(manager);\n if (renderer)\n this._renderer = renderer;\n this._internalLoadingManager = new LoadingManager();\n }\n /**\n * Specify the renderer to use when rendering the gain map\n *\n * @param renderer\n * @returns\n */\n setRenderer(renderer) {\n this._renderer = renderer;\n return this;\n }\n /**\n * Specify the renderTarget options to use when rendering the gain map\n *\n * @param options\n * @returns\n */\n setRenderTargetOptions(options) {\n this._renderTargetOptions = options;\n return this;\n }\n /**\n * @private\n * @returns\n */\n prepareQuadRenderer() {\n if (!this._renderer)\n console.warn('WARNING: An existing WebGL Renderer was not passed to this Loader constructor or in setRenderer, the result of this Loader will need to be converted to a Data Texture with toDataTexture() before you can use it in your renderer.');\n // temporary values\n const material = new GainMapDecoderMaterial({\n gainMapMax: [1, 1, 1],\n gainMapMin: [0, 0, 0],\n gamma: [1, 1, 1],\n offsetHdr: [1, 1, 1],\n offsetSdr: [1, 1, 1],\n hdrCapacityMax: 1,\n hdrCapacityMin: 0,\n maxDisplayBoost: 1,\n gainMap: new Texture(),\n sdr: new Texture()\n });\n return new QuadRenderer({\n width: 16,\n height: 16,\n type: HalfFloatType,\n colorSpace: LinearSRGBColorSpace,\n material,\n renderer: this._renderer,\n renderTargetOptions: this._renderTargetOptions\n });\n }\n /**\n * @private\n * @param quadRenderer\n * @param metadata\n * @param sdrBuffer\n * @param gainMapBuffer\n */\n async render(quadRenderer, metadata, sdrBuffer, gainMapBuffer) {\n // this is optional, will render a black gain-map if not present\n const gainMapBlob = gainMapBuffer ? new Blob([gainMapBuffer], { type: 'image/jpeg' }) : undefined;\n const sdrBlob = new Blob([sdrBuffer], { type: 'image/jpeg' });\n let sdrImage;\n let gainMapImage;\n let needsFlip = false;\n if (typeof createImageBitmap === 'undefined') {\n const res = await Promise.all([\n gainMapBlob ? getHTMLImageFromBlob(gainMapBlob) : Promise.resolve(undefined),\n getHTMLImageFromBlob(sdrBlob)\n ]);\n gainMapImage = res[0];\n sdrImage = res[1];\n needsFlip = true;\n }\n else {\n const res = await Promise.all([\n gainMapBlob ? createImageBitmap(gainMapBlob, { imageOrientation: 'flipY' }) : Promise.resolve(undefined),\n createImageBitmap(sdrBlob, { imageOrientation: 'flipY' })\n ]);\n gainMapImage = res[0];\n sdrImage = res[1];\n }\n const gainMap = new Texture(gainMapImage || new ImageData(2, 2), UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, 1, LinearSRGBColorSpace);\n gainMap.flipY = needsFlip;\n gainMap.needsUpdate = true;\n const sdr = new Texture(sdrImage, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, 1, SRGBColorSpace);\n sdr.flipY = needsFlip;\n sdr.needsUpdate = true;\n quadRenderer.width = sdrImage.width;\n quadRenderer.height = sdrImage.height;\n quadRenderer.material.gainMap = gainMap;\n quadRenderer.material.sdr = sdr;\n quadRenderer.material.gainMapMin = metadata.gainMapMin;\n quadRenderer.material.gainMapMax = metadata.gainMapMax;\n quadRenderer.material.offsetHdr = metadata.offsetHdr;\n quadRenderer.material.offsetSdr = metadata.offsetSdr;\n quadRenderer.material.gamma = metadata.gamma;\n quadRenderer.material.hdrCapacityMin = metadata.hdrCapacityMin;\n quadRenderer.material.hdrCapacityMax = metadata.hdrCapacityMax;\n quadRenderer.material.maxDisplayBoost = Math.pow(2, metadata.hdrCapacityMax);\n quadRenderer.material.needsUpdate = true;\n quadRenderer.render();\n }\n}\n\n/**\n * A Three.js Loader for the gain map format.\n *\n * @category Loaders\n * @group Loaders\n *\n * @example\n * import { GainMapLoader } from '@monogrid/gainmap-js'\n * import {\n * EquirectangularReflectionMapping,\n * LinearFilter,\n * Mesh,\n * MeshBasicMaterial,\n * PerspectiveCamera,\n * PlaneGeometry,\n * Scene,\n * WebGLRenderer\n * } from 'three'\n *\n * const renderer = new WebGLRenderer()\n *\n * const loader = new GainMapLoader(renderer)\n *\n * const result = await loader.loadAsync(['sdr.jpeg', 'gainmap.jpeg', 'metadata.json'])\n * // `result` can be used to populate a Texture\n *\n * const scene = new Scene()\n * const mesh = new Mesh(\n * new PlaneGeometry(),\n * new MeshBasicMaterial({ map: result.renderTarget.texture })\n * )\n * scene.add(mesh)\n * renderer.render(scene, new PerspectiveCamera())\n *\n * // Starting from three.js r159\n * // `result.renderTarget.texture` can\n * // also be used as Equirectangular scene background\n * //\n * // it was previously needed to convert it\n * // to a DataTexture with `result.toDataTexture()`\n * scene.background = result.renderTarget.texture\n * scene.background.mapping = EquirectangularReflectionMapping\n *\n * // result must be manually disposed\n * // when you are done using it\n * result.dispose()\n *\n */\nclass GainMapLoader extends LoaderBase {\n /**\n * Loads a gainmap using separate data\n * * sdr image\n * * gain map image\n * * metadata json\n *\n * useful for webp gain maps\n *\n * @param urls An array in the form of [sdr.jpg, gainmap.jpg, metadata.json]\n * @param onLoad Load complete callback, will receive the result\n * @param onProgress Progress callback, will receive a {@link ProgressEvent}\n * @param onError Error callback\n * @returns\n */\n load([sdrUrl, gainMapUrl, metadataUrl], onLoad, onProgress, onError) {\n const quadRenderer = this.prepareQuadRenderer();\n let sdr;\n let gainMap;\n let metadata;\n const loadCheck = async () => {\n if (sdr && gainMap && metadata) {\n // solves #16\n try {\n await this.render(quadRenderer, metadata, sdr, gainMap);\n }\n catch (error) {\n this.manager.itemError(sdrUrl);\n this.manager.itemError(gainMapUrl);\n this.manager.itemError(metadataUrl);\n if (typeof onError === 'function')\n onError(error);\n quadRenderer.disposeOnDemandRenderer();\n return;\n }\n if (typeof onLoad === 'function')\n onLoad(quadRenderer);\n this.manager.itemEnd(sdrUrl);\n this.manager.itemEnd(gainMapUrl);\n this.manager.itemEnd(metadataUrl);\n quadRenderer.disposeOnDemandRenderer();\n }\n };\n let sdrLengthComputable = true;\n let sdrTotal = 0;\n let sdrLoaded = 0;\n let gainMapLengthComputable = true;\n let gainMapTotal = 0;\n let gainMapLoaded = 0;\n let metadataLengthComputable = true;\n let metadataTotal = 0;\n let metadataLoaded = 0;\n const progressHandler = () => {\n if (typeof onProgress === 'function') {\n const total = sdrTotal + gainMapTotal + metadataTotal;\n const loaded = sdrLoaded + gainMapLoaded + metadataLoaded;\n const lengthComputable = sdrLengthComputable && gainMapLengthComputable && metadataLengthComputable;\n onProgress(new ProgressEvent('progress', { lengthComputable, loaded, total }));\n }\n };\n this.manager.itemStart(sdrUrl);\n this.manager.itemStart(gainMapUrl);\n this.manager.itemStart(metadataUrl);\n const sdrLoader = new FileLoader(this._internalLoadingManager);\n sdrLoader.setResponseType('arraybuffer');\n sdrLoader.setRequestHeader(this.requestHeader);\n sdrLoader.setPath(this.path);\n sdrLoader.setWithCredentials(this.withCredentials);\n sdrLoader.load(sdrUrl, async (buffer) => {\n /* istanbul ignore if\n this condition exists only because of three.js types + strict mode\n */\n if (typeof buffer === 'string')\n throw new Error('Invalid sdr buffer');\n sdr = buffer;\n await loadCheck();\n }, (e) => {\n sdrLengthComputable = e.lengthComputable;\n sdrLoaded = e.loaded;\n sdrTotal = e.total;\n progressHandler();\n }, (error) => {\n this.manager.itemError(sdrUrl);\n if (typeof onError === 'function')\n onError(error);\n });\n const gainMapLoader = new FileLoader(this._internalLoadingManager);\n gainMapLoader.setResponseType('arraybuffer');\n gainMapLoader.setRequestHeader(this.requestHeader);\n gainMapLoader.setPath(this.path);\n gainMapLoader.setWithCredentials(this.withCredentials);\n gainMapLoader.load(gainMapUrl, async (buffer) => {\n /* istanbul ignore if\n this condition exists only because of three.js types + strict mode\n */\n if (typeof buffer === 'string')\n throw new Error('Invalid gainmap buffer');\n gainMap = buffer;\n await loadCheck();\n }, (e) => {\n gainMapLengthComputable = e.lengthComputable;\n gainMapLoaded = e.loaded;\n gainMapTotal = e.total;\n progressHandler();\n }, (error) => {\n this.manager.itemError(gainMapUrl);\n if (typeof onError === 'function')\n onError(error);\n });\n const metadataLoader = new FileLoader(this._internalLoadingManager);\n // metadataLoader.setResponseType('json')\n metadataLoader.setRequestHeader(this.requestHeader);\n metadataLoader.setPath(this.path);\n metadataLoader.setWithCredentials(this.withCredentials);\n metadataLoader.load(metadataUrl, async (json) => {\n /* istanbul ignore if\n this condition exists only because of three.js types + strict mode\n */\n if (typeof json !== 'string')\n throw new Error('Invalid metadata string');\n // TODO: implement check on JSON file and remove this eslint disable\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n metadata = JSON.parse(json);\n await loadCheck();\n }, (e) => {\n metadataLengthComputable = e.lengthComputable;\n metadataLoaded = e.loaded;\n metadataTotal = e.total;\n progressHandler();\n }, (error) => {\n this.manager.itemError(metadataUrl);\n if (typeof onError === 'function')\n onError(error);\n });\n return quadRenderer;\n }\n}\n\n/**\n * A Three.js Loader for a JPEG with embedded gainmap metadata.\n *\n * @category Loaders\n * @group Loaders\n *\n * @example\n * import { HDRJPGLoader } from '@monogrid/gainmap-js'\n * import {\n * EquirectangularReflectionMapping,\n * LinearFilter,\n * Mesh,\n * MeshBasicMaterial,\n * PerspectiveCamera,\n * PlaneGeometry,\n * Scene,\n * WebGLRenderer\n * } from 'three'\n *\n * const renderer = new WebGLRenderer()\n *\n * const loader = new HDRJPGLoader(renderer)\n *\n * const result = await loader.loadAsync('gainmap.jpeg')\n * // `result` can be used to populate a Texture\n *\n * const scene = new Scene()\n * const mesh = new Mesh(\n * new PlaneGeometry(),\n * new MeshBasicMaterial({ map: result.renderTarget.texture })\n * )\n * scene.add(mesh)\n * renderer.render(scene, new PerspectiveCamera())\n *\n * // Starting from three.js r159\n * // `result.renderTarget.texture` can\n * // also be used as Equirectangular scene background\n * //\n * // it was previously needed to convert it\n * // to a DataTexture with `result.toDataTexture()`\n * scene.background = result.renderTarget.texture\n * scene.background.mapping = EquirectangularReflectionMapping\n *\n * // result must be manually disposed\n * // when you are done using it\n * result.dispose()\n *\n */\nclass HDRJPGLoader extends LoaderBase {\n /**\n * Loads a JPEG containing gain map metadata\n * Renders a normal SDR image if gainmap data is not found\n *\n * @param url An array in the form of [sdr.jpg, gainmap.jpg, metadata.json]\n * @param onLoad Load complete callback, will receive the result\n * @param onProgress Progress callback, will receive a {@link ProgressEvent}\n * @param onError Error callback\n * @returns\n */\n load(url, onLoad, onProgress, onError) {\n const quadRenderer = this.prepareQuadRenderer();\n const loader = new FileLoader(this._internalLoadingManager);\n loader.setResponseType('arraybuffer');\n loader.setRequestHeader(this.requestHeader);\n loader.setPath(this.path);\n loader.setWithCredentials(this.withCredentials);\n this.manager.itemStart(url);\n loader.load(url, async (jpeg) => {\n /* istanbul ignore if\n this condition exists only because of three.js types + strict mode\n */\n if (typeof jpeg === 'string')\n throw new Error('Invalid buffer, received [string], was expecting [ArrayBuffer]');\n const jpegBuffer = new Uint8Array(jpeg);\n let sdrJPEG;\n let gainMapJPEG;\n let metadata;\n try {\n const extractionResult = await extractGainmapFromJPEG(jpegBuffer);\n // gain map is successfully reconstructed\n sdrJPEG = extractionResult.sdr;\n gainMapJPEG = extractionResult.gainMap;\n metadata = extractionResult.metadata;\n }\n catch (e) {\n // render the SDR version if this is not a gainmap\n if (e instanceof XMPMetadataNotFoundError || e instanceof GainMapNotFoundError) {\n console.warn(`Failure to reconstruct an HDR image from ${url}: Gain map metadata not found in the file, HDRJPGLoader will render the SDR jpeg`);\n metadata = {\n gainMapMin: [0, 0, 0],\n gainMapMax: [1, 1, 1],\n gamma: [1, 1, 1],\n hdrCapacityMin: 0,\n hdrCapacityMax: 1,\n offsetHdr: [0, 0, 0],\n offsetSdr: [0, 0, 0]\n };\n sdrJPEG = jpegBuffer;\n }\n else {\n throw e;\n }\n }\n // solves #16\n try {\n await this.render(quadRenderer, metadata, sdrJPEG, gainMapJPEG);\n }\n catch (error) {\n this.manager.itemError(url);\n if (typeof onError === 'function')\n onError(error);\n quadRenderer.disposeOnDemandRenderer();\n return;\n }\n if (typeof onLoad === 'function')\n onLoad(quadRenderer);\n this.manager.itemEnd(url);\n quadRenderer.disposeOnDemandRenderer();\n }, onProgress, (error) => {\n this.manager.itemError(url);\n if (typeof onError === 'function')\n onError(error);\n });\n return quadRenderer;\n }\n}\n\nexport { GainMapDecoderMaterial, GainMapLoader, HDRJPGLoader, HDRJPGLoader as JPEGRLoader, MPFExtractor, QuadRenderer, decode, extractGainmapFromJPEG, extractXMP };\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearSRGBColorSpace\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* default error routine. change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: throw new Error( 'THREE.RGBELoader: Read Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_write_error: throw new Error( 'THREE.RGBELoader: Write Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_format_error: throw new Error( 'THREE.RGBELoader: Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: throw new Error( 'THREE.RGBELoader: Memory Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading. modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\trgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tconst w = rgbe_header_info.width,\n\t\t\th = rgbe_header_info.height,\n\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\n\t\tlet data, type;\n\t\tlet numElements;\n\n\t\tswitch ( this.type ) {\n\n\t\t\tcase FloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = floatArray;\n\t\t\t\ttype = FloatType;\n\t\t\t\tbreak;\n\n\t\t\tcase HalfFloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = halfArray;\n\t\t\t\ttype = HalfFloatType;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tthrow new Error( 'THREE.RGBELoader: Unsupported type: ' + this.type );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn {\n\t\t\twidth: w, height: h,\n\t\t\tdata: data,\n\t\t\theader: rgbe_header_info.string,\n\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\texposure: rgbe_header_info.exposure,\n\t\t\ttype: type\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","/* @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { BackSide, BoxGeometry, Mesh, MeshBasicMaterial, MeshStandardMaterial, PointLight, Scene } from 'three';\nconst legacy = {\n topLight: {\n intensity: 500,\n position: [0.418, 16.199, 0.300],\n },\n room: {\n position: [-0.757, 13.219, 0.717],\n scale: [31.713, 28.305, 28.591],\n },\n boxes: [\n {\n position: [-10.906, 2.009, 1.846],\n rotation: -0.195,\n scale: [2.328, 7.905, 4.651],\n },\n {\n position: [-5.607, -0.754, -0.758],\n rotation: 0.994,\n scale: [1.970, 1.534, 3.955],\n },\n {\n position: [6.167, 0.857, 7.803],\n rotation: 0.561,\n scale: [3.927, 6.285, 3.687],\n },\n {\n position: [-2.017, 0.018, 6.124],\n rotation: 0.333,\n scale: [2.002, 4.566, 2.064],\n },\n {\n position: [2.291, -0.756, -2.621],\n rotation: -0.286,\n scale: [1.546, 1.552, 1.496],\n },\n {\n position: [-2.193, -0.369, -5.547],\n rotation: 0.516,\n scale: [3.875, 3.487, 2.986],\n },\n ],\n lights: [\n {\n intensity: 50,\n position: [-16.116, 14.37, 8.208],\n scale: [0.1, 2.428, 2.739],\n },\n {\n intensity: 50,\n position: [-16.109, 18.021, -8.207],\n scale: [0.1, 2.425, 2.751],\n },\n {\n intensity: 17,\n position: [14.904, 12.198, -1.832],\n scale: [0.15, 4.265, 6.331],\n },\n {\n intensity: 43,\n position: [-0.462, 8.89, 14.520],\n scale: [4.38, 5.441, 0.088],\n },\n {\n intensity: 20,\n position: [3.235, 11.486, -12.541],\n scale: [2.5, 2.0, 0.1],\n },\n {\n intensity: 100,\n position: [0.0, 20.0, 0.0],\n scale: [1.0, 0.1, 1.0],\n },\n ]\n};\nconst neutral = {\n topLight: {\n intensity: 400,\n position: [0.5, 14.0, 0.5],\n },\n room: {\n position: [0.0, 13.2, 0.0],\n scale: [31.5, 28.5, 31.5],\n },\n boxes: [\n {\n position: [-10.906, -1.0, 1.846],\n rotation: -0.195,\n scale: [2.328, 7.905, 4.651],\n },\n {\n position: [-5.607, -0.754, -0.758],\n rotation: 0.994,\n scale: [1.970, 1.534, 3.955],\n },\n {\n position: [6.167, -0.16, 7.803],\n rotation: 0.561,\n scale: [3.927, 6.285, 3.687],\n },\n {\n position: [-2.017, 0.018, 6.124],\n rotation: 0.333,\n scale: [2.002, 4.566, 2.064],\n },\n {\n position: [2.291, -0.756, -2.621],\n rotation: -0.286,\n scale: [1.546, 1.552, 1.496],\n },\n {\n position: [-2.193, -0.369, -5.547],\n rotation: 0.516,\n scale: [3.875, 3.487, 2.986],\n },\n ],\n lights: [\n {\n intensity: 80,\n position: [-14.0, 10.0, 8.0],\n scale: [0.1, 2.5, 2.5],\n },\n {\n intensity: 80,\n position: [-14.0, 14.0, -4.0],\n scale: [0.1, 2.5, 2.5],\n },\n {\n intensity: 23,\n position: [14.0, 12.0, 0.0],\n scale: [0.1, 5.0, 5.0],\n },\n {\n intensity: 16,\n position: [0.0, 9.0, 14.0],\n scale: [5.0, 5.0, 0.1],\n },\n {\n intensity: 80,\n position: [7.0, 8.0, -14.0],\n scale: [2.5, 2.5, 0.1],\n },\n {\n intensity: 80,\n position: [-7.0, 16.0, -14.0],\n scale: [2.5, 2.5, 0.1],\n },\n {\n intensity: 1,\n position: [0.0, 20.0, 0.0],\n scale: [0.1, 0.1, 0.1],\n },\n ]\n};\nexport default class EnvironmentScene extends Scene {\n constructor(name) {\n super();\n this.position.y = -3.5;\n const geometry = new BoxGeometry();\n geometry.deleteAttribute('uv');\n const roomMaterial = new MeshStandardMaterial({ metalness: 0, side: BackSide });\n const boxMaterial = new MeshStandardMaterial({ metalness: 0 });\n const data = name == 'legacy' ? legacy : neutral;\n const mainLight = new PointLight(0xffffff, data.topLight.intensity, 28, 2);\n mainLight.position.set(...data.topLight.position);\n this.add(mainLight);\n const room = new Mesh(geometry, roomMaterial);\n room.position.set(...data.room.position);\n room.scale.set(...data.room.scale);\n this.add(room);\n for (const box of data.boxes) {\n const box1 = new Mesh(geometry, boxMaterial);\n box1.position.set(...box.position);\n box1.rotation.set(0, box.rotation, 0);\n box1.scale.set(...box.scale);\n this.add(box1);\n }\n for (const light of data.lights) {\n const light1 = new Mesh(geometry, this.createAreaLightMaterial(light.intensity));\n light1.position.set(...light.position);\n light1.scale.set(...light.scale);\n this.add(light1);\n }\n }\n createAreaLightMaterial(intensity) {\n const material = new MeshBasicMaterial();\n material.color.setScalar(intensity);\n return material;\n }\n}\n//# sourceMappingURL=EnvironmentScene.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { HDRJPGLoader } from '@monogrid/gainmap-js';\nimport { BackSide, BoxGeometry, CubeCamera, EquirectangularReflectionMapping, HalfFloatType, LinearSRGBColorSpace, Mesh, NoBlending, NoToneMapping, RGBAFormat, Scene, ShaderMaterial, SRGBColorSpace, TextureLoader, Vector3, WebGLCubeRenderTarget } from 'three';\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\nimport { deserializeUrl, timePasses } from '../utilities.js';\nimport EnvironmentScene from './EnvironmentScene.js';\nconst GENERATED_SIGMA = 0.04;\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\nconst HDR_FILE_RE = /\\.hdr(\\.js)?$/;\nexport default class TextureUtils {\n constructor(threeRenderer) {\n this.threeRenderer = threeRenderer;\n this.lottieLoaderUrl = '';\n this._ldrLoader = null;\n this._imageLoader = null;\n this._hdrLoader = null;\n this._lottieLoader = null;\n this.generatedEnvironmentMap = null;\n this.generatedEnvironmentMapAlt = null;\n this.skyboxCache = new Map();\n this.blurMaterial = null;\n this.blurScene = null;\n }\n ldrLoader(withCredentials) {\n if (this._ldrLoader == null) {\n this._ldrLoader = new TextureLoader();\n }\n this._ldrLoader.setWithCredentials(withCredentials);\n return this._ldrLoader;\n }\n imageLoader(withCredentials) {\n if (this._imageLoader == null) {\n this._imageLoader = new HDRJPGLoader(this.threeRenderer);\n }\n this._imageLoader.setWithCredentials(withCredentials);\n return this._imageLoader;\n }\n hdrLoader(withCredentials) {\n if (this._hdrLoader == null) {\n this._hdrLoader = new RGBELoader();\n this._hdrLoader.setDataType(HalfFloatType);\n }\n this._hdrLoader.setWithCredentials(withCredentials);\n return this._hdrLoader;\n }\n async getLottieLoader(withCredentials) {\n if (this._lottieLoader == null) {\n const { LottieLoader } = await import(/* webpackIgnore: true */ this.lottieLoaderUrl);\n this._lottieLoader = new LottieLoader();\n }\n this._lottieLoader.setWithCredentials(withCredentials);\n return this._lottieLoader;\n }\n async loadImage(url, withCredentials) {\n const texture = await new Promise((resolve, reject) => this.ldrLoader(withCredentials)\n .load(url, resolve, () => { }, reject));\n texture.name = url;\n texture.flipY = false;\n return texture;\n }\n async loadLottie(url, quality, withCredentials) {\n const loader = await this.getLottieLoader(withCredentials);\n loader.setQuality(quality);\n const texture = await new Promise((resolve, reject) => loader.load(url, resolve, () => { }, reject));\n texture.name = url;\n return texture;\n }\n async loadEquirect(url, withCredentials = false, progressCallback = () => { }) {\n try {\n const isHDR = HDR_FILE_RE.test(url);\n const loader = isHDR ? this.hdrLoader(withCredentials) :\n this.imageLoader(withCredentials);\n const texture = await new Promise((resolve, reject) => loader.load(url, (result) => {\n const { renderTarget } = result;\n if (renderTarget != null) {\n const { texture } = renderTarget;\n result.dispose(false);\n resolve(texture);\n }\n else {\n resolve(result);\n }\n }, (event) => {\n progressCallback(event.loaded / event.total * 0.9);\n }, reject));\n progressCallback(1.0);\n texture.name = url;\n texture.mapping = EquirectangularReflectionMapping;\n if (!isHDR) {\n texture.colorSpace = SRGBColorSpace;\n }\n return texture;\n }\n finally {\n if (progressCallback) {\n progressCallback(1);\n }\n }\n }\n /**\n * Returns a { skybox, environmentMap } object with the targets/textures\n * accordingly. `skybox` is a WebGLRenderCubeTarget, and `environmentMap`\n * is a Texture from a WebGLRenderCubeTarget.\n */\n async generateEnvironmentMapAndSkybox(skyboxUrl = null, environmentMapUrl = null, progressCallback = () => { }, withCredentials = false) {\n const useAltEnvironment = environmentMapUrl !== 'legacy';\n if (environmentMapUrl === 'legacy' || environmentMapUrl === 'neutral') {\n environmentMapUrl = null;\n }\n environmentMapUrl = deserializeUrl(environmentMapUrl);\n let skyboxLoads = Promise.resolve(null);\n let environmentMapLoads;\n // If we have a skybox URL, attempt to load it as a cubemap\n if (!!skyboxUrl) {\n skyboxLoads = this.loadEquirectFromUrl(skyboxUrl, withCredentials, progressCallback);\n }\n if (!!environmentMapUrl) {\n // We have an available environment map URL\n environmentMapLoads = this.loadEquirectFromUrl(environmentMapUrl, withCredentials, progressCallback);\n }\n else if (!!skyboxUrl) {\n // Fallback to deriving the environment map from an available skybox\n environmentMapLoads = this.loadEquirectFromUrl(skyboxUrl, withCredentials, progressCallback);\n }\n else {\n // Fallback to generating the environment map\n environmentMapLoads = useAltEnvironment ?\n this.loadGeneratedEnvironmentMapAlt() :\n this.loadGeneratedEnvironmentMap();\n }\n const [environmentMap, skybox] = await Promise.all([environmentMapLoads, skyboxLoads]);\n if (environmentMap == null) {\n throw new Error('Failed to load environment map.');\n }\n return { environmentMap, skybox };\n }\n /**\n * Loads an equirect Texture from a given URL, for use as a skybox.\n */\n async loadEquirectFromUrl(url, withCredentials, progressCallback) {\n if (!this.skyboxCache.has(url)) {\n const skyboxMapLoads = this.loadEquirect(url, withCredentials, progressCallback);\n this.skyboxCache.set(url, skyboxMapLoads);\n }\n return this.skyboxCache.get(url);\n }\n async GenerateEnvironmentMap(scene, name) {\n await timePasses();\n const renderer = this.threeRenderer;\n const cubeTarget = new WebGLCubeRenderTarget(256, {\n generateMipmaps: false,\n type: HalfFloatType,\n format: RGBAFormat,\n colorSpace: LinearSRGBColorSpace,\n depthBuffer: true\n });\n const cubeCamera = new CubeCamera(0.1, 100, cubeTarget);\n const generatedEnvironmentMap = cubeCamera.renderTarget.texture;\n generatedEnvironmentMap.name = name;\n const outputColorSpace = renderer.outputColorSpace;\n const toneMapping = renderer.toneMapping;\n renderer.toneMapping = NoToneMapping;\n renderer.outputColorSpace = LinearSRGBColorSpace;\n cubeCamera.update(renderer, scene);\n this.blurCubemap(cubeTarget, GENERATED_SIGMA);\n renderer.toneMapping = toneMapping;\n renderer.outputColorSpace = outputColorSpace;\n return generatedEnvironmentMap;\n }\n /**\n * Loads a dynamically generated environment map.\n */\n async loadGeneratedEnvironmentMap() {\n if (this.generatedEnvironmentMap == null) {\n this.generatedEnvironmentMap =\n this.GenerateEnvironmentMap(new EnvironmentScene('legacy'), 'legacy');\n }\n return this.generatedEnvironmentMap;\n }\n /**\n * Loads a dynamically generated environment map, designed to be neutral and\n * color-preserving. Shows less contrast around the different sides of the\n * object.\n */\n async loadGeneratedEnvironmentMapAlt() {\n if (this.generatedEnvironmentMapAlt == null) {\n this.generatedEnvironmentMapAlt = this.GenerateEnvironmentMap(new EnvironmentScene('neutral'), 'neutral');\n }\n return this.generatedEnvironmentMapAlt;\n }\n blurCubemap(cubeTarget, sigma) {\n if (this.blurMaterial == null) {\n this.blurMaterial = this.getBlurShader(MAX_SAMPLES);\n const box = new BoxGeometry();\n const blurMesh = new Mesh(box, this.blurMaterial);\n this.blurScene = new Scene();\n this.blurScene.add(blurMesh);\n }\n const tempTarget = cubeTarget.clone();\n this.halfblur(cubeTarget, tempTarget, sigma, 'latitudinal');\n this.halfblur(tempTarget, cubeTarget, sigma, 'longitudinal');\n // Disposing this target after we're done with it somehow corrupts Safari's\n // whole graphics driver. It's random, but occurs more frequently on\n // lower-powered GPUs (macbooks with intel graphics, older iPhones). It goes\n // beyond just messing up the PMREM, as it also occasionally causes\n // visible corruption on the canvas and even on the rest of the page.\n /** tempTarget.dispose(); */\n }\n halfblur(targetIn, targetOut, sigmaRadians, direction) {\n // Number of standard deviations at which to cut off the discrete\n // approximation.\n const STANDARD_DEVIATIONS = 3;\n const pixels = targetIn.width;\n const radiansPerPixel = isFinite(sigmaRadians) ?\n Math.PI / (2 * pixels) :\n 2 * Math.PI / (2 * MAX_SAMPLES - 1);\n const sigmaPixels = sigmaRadians / radiansPerPixel;\n const samples = isFinite(sigmaRadians) ?\n 1 + Math.floor(STANDARD_DEVIATIONS * sigmaPixels) :\n MAX_SAMPLES;\n if (samples > MAX_SAMPLES) {\n console.warn(`sigmaRadians, ${sigmaRadians}, is too large and will clip, as it requested ${samples} samples when the maximum is set to ${MAX_SAMPLES}`);\n }\n const weights = [];\n let sum = 0;\n for (let i = 0; i < MAX_SAMPLES; ++i) {\n const x = i / sigmaPixels;\n const weight = Math.exp(-x * x / 2);\n weights.push(weight);\n if (i == 0) {\n sum += weight;\n }\n else if (i < samples) {\n sum += 2 * weight;\n }\n }\n for (let i = 0; i < weights.length; i++) {\n weights[i] = weights[i] / sum;\n }\n const blurUniforms = this.blurMaterial.uniforms;\n blurUniforms['envMap'].value = targetIn.texture;\n blurUniforms['samples'].value = samples;\n blurUniforms['weights'].value = weights;\n blurUniforms['latitudinal'].value = direction === 'latitudinal';\n blurUniforms['dTheta'].value = radiansPerPixel;\n const cubeCamera = new CubeCamera(0.1, 100, targetOut);\n cubeCamera.update(this.threeRenderer, this.blurScene);\n }\n getBlurShader(maxSamples) {\n const weights = new Float32Array(maxSamples);\n const poleAxis = new Vector3(0, 1, 0);\n const shaderMaterial = new ShaderMaterial({\n name: 'SphericalGaussianBlur',\n defines: { 'n': maxSamples },\n uniforms: {\n 'envMap': { value: null },\n 'samples': { value: 1 },\n 'weights': { value: weights },\n 'latitudinal': { value: false },\n 'dTheta': { value: 0 },\n 'poleAxis': { value: poleAxis }\n },\n vertexShader: /* glsl */ `\n \n varying vec3 vOutputDirection;\n \n void main() {\n \n vOutputDirection = vec3( position );\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n \n }\n `,\n fragmentShader: /* glsl */ `\n varying vec3 vOutputDirection;\n \n uniform samplerCube envMap;\n uniform int samples;\n uniform float weights[ n ];\n uniform bool latitudinal;\n uniform float dTheta;\n uniform vec3 poleAxis;\n \n vec3 getSample( float theta, vec3 axis ) {\n \n float cosTheta = cos( theta );\n // Rodrigues' axis-angle rotation\n vec3 sampleDirection = vOutputDirection * cosTheta\n + cross( axis, vOutputDirection ) * sin( theta )\n + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n \n return vec3( textureCube( envMap, sampleDirection ) );\n \n }\n \n void main() {\n \n vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n \n if ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n \n axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n \n }\n \n axis = normalize( axis );\n \n gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n \n for ( int i = 1; i < n; i++ ) {\n \n if ( i >= samples ) {\n \n break;\n \n }\n \n float theta = dTheta * float( i );\n gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n gl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n \n }\n }\n `,\n blending: NoBlending,\n depthTest: false,\n depthWrite: false,\n side: BackSide\n });\n return shaderMaterial;\n }\n async dispose() {\n for (const [, promise] of this.skyboxCache) {\n const skybox = await promise;\n skybox.dispose();\n }\n if (this.generatedEnvironmentMap != null) {\n (await this.generatedEnvironmentMap).dispose();\n this.generatedEnvironmentMap = null;\n }\n if (this.generatedEnvironmentMapAlt != null) {\n (await this.generatedEnvironmentMapAlt).dispose();\n this.generatedEnvironmentMapAlt = null;\n }\n if (this.blurMaterial != null) {\n this.blurMaterial.dispose();\n }\n }\n}\n//# sourceMappingURL=TextureUtils.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { EventDispatcher, NeutralToneMapping, Vector2, WebGLRenderer } from 'three';\nimport { $updateEnvironment } from '../features/environment.js';\nimport { $canvas, $tick, $updateSize } from '../model-viewer-base.js';\nimport { clamp, isDebugMode } from '../utilities.js';\nimport { ARRenderer } from './ARRenderer.js';\nimport { CachingGLTFLoader } from './CachingGLTFLoader.js';\nimport { ModelViewerGLTFInstance } from './gltf-instance/ModelViewerGLTFInstance.js';\nimport TextureUtils from './TextureUtils.js';\n// Between 0 and 1: larger means the average responds faster and is less smooth.\nconst DURATION_DECAY = 0.2;\nconst LOW_FRAME_DURATION_MS = 40;\nconst HIGH_FRAME_DURATION_MS = 60;\nconst MAX_AVG_CHANGE_MS = 5;\nconst SCALE_STEPS = [1, 0.79, 0.62, 0.5, 0.4, 0.31, 0.25];\nconst DEFAULT_LAST_STEP = 3;\nexport const DEFAULT_POWER_PREFERENCE = 'high-performance';\nconst COMMERCE_EXPOSURE = 1.3;\n/**\n * Registers canvases with Canvas2DRenderingContexts and renders them\n * all in the same WebGLRenderingContext, spitting out textures to apply\n * to the canvases. Creates a fullscreen WebGL canvas that is not added\n * to the DOM, and on each frame, renders each registered canvas on a portion\n * of the WebGL canvas, and applies the texture on the registered canvas.\n *\n * In the future, can use ImageBitmapRenderingContext instead of\n * Canvas2DRenderingContext if supported for cheaper transferring of\n * the texture.\n */\nexport class Renderer extends EventDispatcher {\n static get singleton() {\n if (!this._singleton) {\n this._singleton = new Renderer({\n powerPreference: (self.ModelViewerElement || {})\n .powerPreference ||\n DEFAULT_POWER_PREFERENCE,\n debug: isDebugMode()\n });\n }\n return this._singleton;\n }\n static resetSingleton() {\n const elements = this._singleton.dispose();\n for (const element of elements) {\n element.disconnectedCallback();\n }\n this._singleton = new Renderer({\n powerPreference: (self.ModelViewerElement || {})\n .powerPreference ||\n DEFAULT_POWER_PREFERENCE,\n debug: isDebugMode()\n });\n for (const element of elements) {\n element.connectedCallback();\n }\n }\n get canRender() {\n return this.threeRenderer != null;\n }\n get scaleFactor() {\n return SCALE_STEPS[this.scaleStep];\n }\n set minScale(scale) {\n let i = 1;\n while (i < SCALE_STEPS.length) {\n if (SCALE_STEPS[i] < scale) {\n break;\n }\n ++i;\n }\n this.lastStep = i - 1;\n }\n constructor(options) {\n super();\n this.loader = new CachingGLTFLoader(ModelViewerGLTFInstance);\n this.width = 0;\n this.height = 0;\n this.dpr = 1;\n this.scenes = new Set();\n this.multipleScenesVisible = false;\n this.lastTick = performance.now();\n this.renderedLastFrame = false;\n this.scaleStep = 0;\n this.lastStep = DEFAULT_LAST_STEP;\n this.avgFrameDuration = (HIGH_FRAME_DURATION_MS + LOW_FRAME_DURATION_MS) / 2;\n this.onWebGLContextLost = (event) => {\n this.dispatchEvent({ type: 'contextlost', sourceEvent: event });\n };\n this.onWebGLContextRestored = () => {\n var _a;\n (_a = this.textureUtils) === null || _a === void 0 ? void 0 : _a.dispose();\n this.textureUtils = new TextureUtils(this.threeRenderer);\n for (const scene of this.scenes) {\n scene.element[$updateEnvironment]();\n }\n };\n this.dpr = window.devicePixelRatio;\n this.canvas3D = document.createElement('canvas');\n this.canvas3D.id = 'webgl-canvas';\n this.canvas3D.classList.add('show');\n try {\n this.threeRenderer = new WebGLRenderer({\n canvas: this.canvas3D,\n alpha: true,\n antialias: true,\n powerPreference: options.powerPreference,\n preserveDrawingBuffer: true,\n });\n this.threeRenderer.autoClear = true;\n this.threeRenderer.setPixelRatio(1); // handle pixel ratio externally\n this.threeRenderer.debug = {\n checkShaderErrors: !!options.debug,\n onShaderError: null\n };\n // ACESFilmicToneMapping appears to be the most \"saturated\",\n // and similar to Filament's gltf-viewer.\n this.threeRenderer.toneMapping = NeutralToneMapping;\n }\n catch (error) {\n console.warn(error);\n }\n this.arRenderer = new ARRenderer(this);\n this.textureUtils =\n this.canRender ? new TextureUtils(this.threeRenderer) : null;\n CachingGLTFLoader.initializeKTX2Loader(this.threeRenderer);\n this.canvas3D.addEventListener('webglcontextlost', this.onWebGLContextLost);\n this.canvas3D.addEventListener('webglcontextrestored', this.onWebGLContextRestored);\n this.updateRendererSize();\n }\n registerScene(scene) {\n this.scenes.add(scene);\n scene.forceRescale();\n const size = new Vector2();\n this.threeRenderer.getSize(size);\n scene.canvas.width = size.x;\n scene.canvas.height = size.y;\n if (this.canRender && this.scenes.size > 0) {\n this.threeRenderer.setAnimationLoop((time, frame) => this.render(time, frame));\n }\n }\n unregisterScene(scene) {\n this.scenes.delete(scene);\n if (this.canvas3D.parentElement === scene.canvas.parentElement) {\n scene.canvas.parentElement.removeChild(this.canvas3D);\n }\n if (this.canRender && this.scenes.size === 0) {\n this.threeRenderer.setAnimationLoop(null);\n }\n }\n displayCanvas(scene) {\n return scene.element.modelIsVisible && !this.multipleScenesVisible ?\n this.canvas3D :\n scene.element[$canvas];\n }\n /**\n * The function enables an optimization, where when there is only a single\n * element, we can use the renderer's 3D canvas directly for\n * display. Otherwise we need to use the element's 2D canvas and copy the\n * renderer's result into it.\n */\n countVisibleScenes() {\n const { canvas3D } = this;\n let visibleScenes = 0;\n let canvas3DScene = null;\n for (const scene of this.scenes) {\n const { element } = scene;\n if (element.modelIsVisible && scene.externalRenderer == null) {\n ++visibleScenes;\n }\n if (canvas3D.parentElement === scene.canvas.parentElement) {\n canvas3DScene = scene;\n }\n }\n const multipleScenesVisible = visibleScenes > 1;\n if (canvas3DScene != null) {\n const newlyMultiple = multipleScenesVisible && !this.multipleScenesVisible;\n const disappearing = !canvas3DScene.element.modelIsVisible;\n if (newlyMultiple || disappearing) {\n const { width, height } = this.sceneSize(canvas3DScene);\n this.copyPixels(canvas3DScene, width, height);\n canvas3D.parentElement.removeChild(canvas3D);\n }\n }\n this.multipleScenesVisible = multipleScenesVisible;\n }\n /**\n * Updates the renderer's size based on the largest scene and any changes to\n * device pixel ratio.\n */\n updateRendererSize() {\n var _a;\n const dpr = window.devicePixelRatio;\n if (dpr !== this.dpr) {\n // If the device pixel ratio has changed due to page zoom, elements\n // specified by % width do not fire a resize event even though their CSS\n // pixel dimensions change, so we force them to update their size here.\n for (const scene of this.scenes) {\n const { element } = scene;\n element[$updateSize](element.getBoundingClientRect());\n }\n }\n // Make the renderer the size of the largest scene\n let width = 0;\n let height = 0;\n for (const scene of this.scenes) {\n width = Math.max(width, scene.width);\n height = Math.max(height, scene.height);\n }\n if (width === this.width && height === this.height && dpr === this.dpr) {\n return;\n }\n this.width = width;\n this.height = height;\n this.dpr = dpr;\n width = Math.ceil(width * dpr);\n height = Math.ceil(height * dpr);\n if (this.canRender) {\n this.threeRenderer.setSize(width, height, false);\n }\n // Each scene's canvas must match the renderer size. In general they can be\n // larger than the element that contains them, but the overflow is hidden\n // and only the portion that is shown is copied over.\n for (const scene of this.scenes) {\n const { canvas } = scene;\n canvas.width = width;\n canvas.height = height;\n scene.forceRescale();\n (_a = scene.effectRenderer) === null || _a === void 0 ? void 0 : _a.setSize(width, height);\n }\n }\n updateRendererScale(delta) {\n const scaleStep = this.scaleStep;\n this.avgFrameDuration += clamp(DURATION_DECAY * (delta - this.avgFrameDuration), -MAX_AVG_CHANGE_MS, MAX_AVG_CHANGE_MS);\n if (this.avgFrameDuration > HIGH_FRAME_DURATION_MS) {\n ++this.scaleStep;\n }\n else if (this.avgFrameDuration < LOW_FRAME_DURATION_MS && this.scaleStep > 0) {\n --this.scaleStep;\n }\n this.scaleStep = Math.min(this.scaleStep, this.lastStep);\n if (scaleStep !== this.scaleStep) {\n this.avgFrameDuration =\n (HIGH_FRAME_DURATION_MS + LOW_FRAME_DURATION_MS) / 2;\n }\n }\n shouldRender(scene) {\n if (!scene.shouldRender()) {\n // The first frame we stop rendering the scene (because it stops moving),\n // trigger one extra render at full scale.\n if (scene.scaleStep != 0) {\n scene.scaleStep = 0;\n this.rescaleCanvas(scene);\n }\n else {\n return false;\n }\n }\n else if (scene.scaleStep != this.scaleStep) {\n // Update render scale\n scene.scaleStep = this.scaleStep;\n this.rescaleCanvas(scene);\n }\n return true;\n }\n rescaleCanvas(scene) {\n const scale = SCALE_STEPS[scene.scaleStep];\n const width = Math.ceil(this.width / scale);\n const height = Math.ceil(this.height / scale);\n const { style } = scene.canvas;\n style.width = `${width}px`;\n style.height = `${height}px`;\n this.canvas3D.style.width = `${width}px`;\n this.canvas3D.style.height = `${height}px`;\n const renderedDpr = this.dpr * scale;\n const reason = scale < 1 ? 'GPU throttling' :\n this.dpr !== window.devicePixelRatio ? 'No meta viewport tag' :\n '';\n scene.element.dispatchEvent(new CustomEvent('render-scale', {\n detail: {\n reportedDpr: window.devicePixelRatio,\n renderedDpr: renderedDpr,\n minimumDpr: this.dpr * SCALE_STEPS[this.lastStep],\n pixelWidth: Math.ceil(scene.width * renderedDpr),\n pixelHeight: Math.ceil(scene.height * renderedDpr),\n reason: reason\n }\n }));\n }\n sceneSize(scene) {\n const { dpr } = this;\n const scaleFactor = SCALE_STEPS[scene.scaleStep];\n // We avoid using the Three.js PixelRatio and handle it ourselves here so\n // that we can do proper rounding and avoid white boundary pixels.\n const width = Math.min(Math.ceil(scene.width * scaleFactor * dpr), this.canvas3D.width);\n const height = Math.min(Math.ceil(scene.height * scaleFactor * dpr), this.canvas3D.height);\n return { width, height };\n }\n copyPixels(scene, width, height) {\n const context2D = scene.context;\n if (context2D == null) {\n console.log('could not acquire 2d context');\n return;\n }\n context2D.clearRect(0, 0, width, height);\n context2D.drawImage(this.canvas3D, 0, 0, width, height, 0, 0, width, height);\n scene.canvas.classList.add('show');\n }\n /**\n * Returns an array version of this.scenes where the non-visible ones are\n * first. This allows eager scenes to be rendered before they are visible,\n * without needing the multi-canvas render path.\n */\n orderedScenes() {\n const scenes = [];\n for (const visible of [false, true]) {\n for (const scene of this.scenes) {\n if (scene.element.modelIsVisible === visible) {\n scenes.push(scene);\n }\n }\n }\n return scenes;\n }\n get isPresenting() {\n return this.arRenderer.isPresenting;\n }\n /**\n * This method takes care of updating the element and renderer state based on\n * the time that has passed since the last rendered frame.\n */\n preRender(scene, t, delta) {\n const { element, exposure, toneMapping } = scene;\n element[$tick](t, delta);\n const exposureIsNumber = typeof exposure === 'number' && !Number.isNaN(exposure);\n const env = element.environmentImage;\n const sky = element.skyboxImage;\n const compensateExposure = toneMapping === NeutralToneMapping &&\n (env === 'neutral' || env === 'legacy' || (!env && !sky));\n this.threeRenderer.toneMappingExposure =\n (exposureIsNumber ? exposure : 1.0) *\n (compensateExposure ? COMMERCE_EXPOSURE : 1.0);\n }\n render(t, frame) {\n if (frame != null) {\n this.arRenderer.onWebXRFrame(t, frame);\n return;\n }\n const delta = t - this.lastTick;\n this.lastTick = t;\n if (!this.canRender || this.isPresenting) {\n return;\n }\n this.countVisibleScenes();\n this.updateRendererSize();\n if (this.renderedLastFrame) {\n this.updateRendererScale(delta);\n this.renderedLastFrame = false;\n }\n const { canvas3D } = this;\n for (const scene of this.orderedScenes()) {\n const { element } = scene;\n if (!element.loaded ||\n (!element.modelIsVisible && scene.renderCount > 0)) {\n continue;\n }\n this.preRender(scene, t, delta);\n if (!this.shouldRender(scene)) {\n continue;\n }\n if (scene.externalRenderer != null) {\n const camera = scene.getCamera();\n camera.updateMatrix();\n const { matrix, projectionMatrix } = camera;\n const viewMatrix = matrix.elements.slice();\n const target = scene.getTarget();\n viewMatrix[12] += target.x;\n viewMatrix[13] += target.y;\n viewMatrix[14] += target.z;\n scene.externalRenderer.render({\n viewMatrix: viewMatrix,\n projectionMatrix: projectionMatrix.elements\n });\n continue;\n }\n if (!element.modelIsVisible && !this.multipleScenesVisible) {\n // Here we are pre-rendering on the visible canvas, so we must mark the\n // visible scene dirty to ensure it overwrites us.\n for (const visibleScene of this.scenes) {\n if (visibleScene.element.modelIsVisible) {\n visibleScene.queueRender();\n }\n }\n }\n const { width, height } = this.sceneSize(scene);\n scene.renderShadow(this.threeRenderer);\n // Need to set the render target in order to prevent\n // clearing the depth from a different buffer\n this.threeRenderer.setRenderTarget(null);\n this.threeRenderer.setViewport(0, Math.ceil(this.height * this.dpr) - height, width, height);\n if (scene.effectRenderer != null) {\n scene.effectRenderer.render(delta);\n }\n else {\n this.threeRenderer.autoClear =\n true; // this might get reset by the effectRenderer\n this.threeRenderer.toneMapping = scene.toneMapping;\n this.threeRenderer.render(scene, scene.camera);\n }\n if (this.multipleScenesVisible ||\n (!scene.element.modelIsVisible && scene.renderCount === 0)) {\n this.copyPixels(scene, width, height);\n }\n else if (canvas3D.parentElement !== scene.canvas.parentElement) {\n scene.canvas.parentElement.appendChild(canvas3D);\n scene.canvas.classList.remove('show');\n }\n scene.hasRendered();\n ++scene.renderCount;\n this.renderedLastFrame = true;\n }\n }\n dispose() {\n if (this.textureUtils != null) {\n this.textureUtils.dispose();\n }\n if (this.threeRenderer != null) {\n this.threeRenderer.dispose();\n }\n this.textureUtils = null;\n this.threeRenderer = null;\n const elements = [];\n for (const scene of this.scenes) {\n elements.push(scene.element);\n }\n this.canvas3D.removeEventListener('webglcontextlost', this.onWebGLContextLost);\n this.canvas3D.removeEventListener('webglcontextrestored', this.onWebGLContextRestored);\n return elements;\n }\n}\n//# sourceMappingURL=Renderer.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const $correlatedObjects = Symbol('correlatedObjects');\nexport const $onUpdate = Symbol('onUpdate');\n/**\n * A SerializableThreeDOMElement is the common primitive of all scene graph\n * elements that have been facaded in the host execution context. It adds\n * a common interface to these elements in support of convenient\n * serializability.\n */\nexport class ThreeDOMElement {\n constructor(onUpdate, correlatedObjects) {\n this[$onUpdate] = onUpdate;\n this[$correlatedObjects] = correlatedObjects;\n }\n}\n//# sourceMappingURL=three-dom-element.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Mesh, MeshBasicMaterial, OrthographicCamera, PlaneGeometry, Scene, WebGLRenderTarget } from 'three';\nimport { blobCanvas } from '../../model-viewer-base.js';\nimport { Renderer } from '../../three-components/Renderer.js';\nimport { $correlatedObjects, $onUpdate, ThreeDOMElement } from './three-dom-element.js';\nconst quadMaterial = new MeshBasicMaterial();\nconst quad = new PlaneGeometry(2, 2);\nlet adhocNum = 0;\nexport const $threeTexture = Symbol('threeTexture');\nexport const $threeTextures = Symbol('threeTextures');\nexport const $applyTexture = Symbol('applyTexture');\n/**\n * Image facade implementation for Three.js textures\n */\nexport class Image extends ThreeDOMElement {\n get [$threeTexture]() {\n var _a;\n return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value;\n }\n get [$threeTextures]() {\n return this[$correlatedObjects];\n }\n constructor(onUpdate, texture) {\n super(onUpdate, new Set(texture ? [texture] : []));\n if (!this[$threeTexture].image.src) {\n this[$threeTexture].image.src =\n texture.name ? texture.name : 'adhoc_image' + adhocNum++;\n }\n if (!this[$threeTexture].image.name) {\n this[$threeTexture].image.name =\n (texture && texture.image && texture.image.src) ?\n texture.image.src.split('/').pop() :\n 'adhoc_image';\n }\n }\n get name() {\n return this[$threeTexture].image.name || '';\n }\n get uri() {\n return this[$threeTexture].image.src;\n }\n get bufferView() {\n return this[$threeTexture].image.bufferView;\n }\n get element() {\n const texture = this[$threeTexture];\n if (texture && (texture.isCanvasTexture || texture.isVideoTexture)) {\n return texture.image;\n }\n return;\n }\n get animation() {\n const texture = this[$threeTexture];\n if (texture && texture.isCanvasTexture && texture.animation) {\n return texture.animation;\n }\n return;\n }\n get type() {\n return this.uri != null ? 'external' : 'embedded';\n }\n set name(name) {\n for (const texture of this[$threeTextures]) {\n texture.image.name = name;\n }\n }\n update() {\n const texture = this[$threeTexture];\n // Applies to non-Lottie canvas textures only\n if (texture && texture.isCanvasTexture && !texture.animation) {\n this[$threeTexture].needsUpdate = true;\n this[$onUpdate]();\n }\n }\n async createThumbnail(width, height) {\n const scene = new Scene();\n quadMaterial.map = this[$threeTexture];\n const mesh = new Mesh(quad, quadMaterial);\n scene.add(mesh);\n const camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1);\n const { threeRenderer } = Renderer.singleton;\n const renderTarget = new WebGLRenderTarget(width, height);\n threeRenderer.setRenderTarget(renderTarget);\n threeRenderer.render(scene, camera);\n threeRenderer.setRenderTarget(null);\n const buffer = new Uint8Array(width * height * 4);\n threeRenderer.readRenderTargetPixels(renderTarget, 0, 0, width, height, buffer);\n blobCanvas.width = width;\n blobCanvas.height = height;\n const blobContext = blobCanvas.getContext('2d');\n const imageData = blobContext.createImageData(width, height);\n imageData.data.set(buffer);\n blobContext.putImageData(imageData, 0, 0);\n return new Promise(async (resolve, reject) => {\n blobCanvas.toBlob(blob => {\n if (!blob) {\n return reject('Failed to capture thumbnail.');\n }\n resolve(URL.createObjectURL(blob));\n }, 'image/png');\n });\n }\n}\n//# sourceMappingURL=image.js.map","export var Filter;\n(function (Filter) {\n Filter[Filter[\"Nearest\"] = 9728] = \"Nearest\";\n Filter[Filter[\"Linear\"] = 9729] = \"Linear\";\n Filter[Filter[\"NearestMipmapNearest\"] = 9984] = \"NearestMipmapNearest\";\n Filter[Filter[\"LinearMipmapNearest\"] = 9985] = \"LinearMipmapNearest\";\n Filter[Filter[\"NearestMipmapLinear\"] = 9986] = \"NearestMipmapLinear\";\n Filter[Filter[\"LinearMipmapLinear\"] = 9987] = \"LinearMipmapLinear\";\n})(Filter || (Filter = {}));\nexport var Wrap;\n(function (Wrap) {\n Wrap[Wrap[\"ClampToEdge\"] = 33071] = \"ClampToEdge\";\n Wrap[Wrap[\"MirroredRepeat\"] = 33648] = \"MirroredRepeat\";\n Wrap[Wrap[\"Repeat\"] = 10497] = \"Repeat\";\n})(Wrap || (Wrap = {}));\n//# sourceMappingURL=gltf-2.0.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClampToEdgeWrapping, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, MirroredRepeatWrapping, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RepeatWrapping, Vector2 } from 'three';\nimport { toVector2D } from '../../model-viewer-base.js';\nimport { Filter, Wrap } from '../../three-components/gltf-instance/gltf-2.0.js';\nimport { $correlatedObjects, $onUpdate, ThreeDOMElement } from './three-dom-element.js';\n// Convertion between gltf standards and threejs standards.\nconst wrapModeToWrapping = new Map([\n [Wrap.Repeat, RepeatWrapping],\n [Wrap.ClampToEdge, ClampToEdgeWrapping],\n [Wrap.MirroredRepeat, MirroredRepeatWrapping]\n]);\nconst wrappingToWrapMode = new Map([\n [RepeatWrapping, Wrap.Repeat],\n [ClampToEdgeWrapping, Wrap.ClampToEdge],\n [MirroredRepeatWrapping, Wrap.MirroredRepeat]\n]);\nconst minFilterToMinification = new Map([\n [Filter.Nearest, NearestFilter],\n [Filter.Linear, LinearFilter],\n [Filter.NearestMipmapNearest, NearestMipmapNearestFilter],\n [Filter.LinearMipmapNearest, LinearMipmapNearestFilter],\n [Filter.NearestMipmapLinear, NearestMipmapLinearFilter],\n [Filter.LinearMipmapLinear, LinearMipmapLinearFilter]\n]);\nconst minificationToMinFilter = new Map([\n [NearestFilter, Filter.Nearest],\n [LinearFilter, Filter.Linear],\n [NearestMipmapNearestFilter, Filter.NearestMipmapNearest],\n [LinearMipmapNearestFilter, Filter.LinearMipmapNearest],\n [NearestMipmapLinearFilter, Filter.NearestMipmapLinear],\n [LinearMipmapLinearFilter, Filter.LinearMipmapLinear]\n]);\nconst magFilterToMagnification = new Map([[Filter.Nearest, NearestFilter], [Filter.Linear, LinearFilter]]);\nconst magnificationToMagFilter = new Map([[NearestFilter, Filter.Nearest], [LinearFilter, Filter.Linear]]);\n// Checks for threejs standards.\nconst isMinFilter = (() => {\n return (value) => minificationToMinFilter.has(value);\n})();\nconst isMagFilter = (() => {\n return (value) => magnificationToMagFilter.has(value);\n})();\nconst isWrapping = (() => {\n return (value) => wrappingToWrapMode.has(value);\n})();\nconst isValidSamplerValue = (property, value) => {\n switch (property) {\n case 'minFilter':\n return isMinFilter(value);\n case 'magFilter':\n return isMagFilter(value);\n case 'wrapS':\n case 'wrapT':\n return isWrapping(value);\n case 'rotation':\n case 'repeat':\n case 'offset':\n return true;\n default:\n throw new Error(`Cannot configure property \"${property}\" on Sampler`);\n }\n};\nconst $threeTexture = Symbol('threeTexture');\nconst $threeTextures = Symbol('threeTextures');\nconst $setProperty = Symbol('setProperty');\n/**\n * Sampler facade implementation for Three.js textures\n */\nexport class Sampler extends ThreeDOMElement {\n get [$threeTexture]() {\n var _a;\n return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value;\n }\n get [$threeTextures]() {\n return this[$correlatedObjects];\n }\n constructor(onUpdate, texture) {\n super(onUpdate, new Set(texture ? [texture] : []));\n }\n get name() {\n return this[$threeTexture].name || '';\n }\n get minFilter() {\n return minificationToMinFilter.get(this[$threeTexture].minFilter);\n }\n get magFilter() {\n return magnificationToMagFilter.get(this[$threeTexture].magFilter);\n }\n get wrapS() {\n return wrappingToWrapMode.get(this[$threeTexture].wrapS);\n }\n get wrapT() {\n return wrappingToWrapMode.get(this[$threeTexture].wrapT);\n }\n get rotation() {\n return this[$threeTexture].rotation;\n }\n get scale() {\n return toVector2D(this[$threeTexture].repeat);\n }\n get offset() {\n return toVector2D(this[$threeTexture].offset);\n }\n setMinFilter(filter) {\n this[$setProperty]('minFilter', minFilterToMinification.get(filter));\n }\n setMagFilter(filter) {\n this[$setProperty]('magFilter', magFilterToMagnification.get(filter));\n }\n setWrapS(mode) {\n this[$setProperty]('wrapS', wrapModeToWrapping.get(mode));\n }\n setWrapT(mode) {\n this[$setProperty]('wrapT', wrapModeToWrapping.get(mode));\n }\n setRotation(rotation) {\n if (rotation == null) {\n // Reset rotation.\n rotation = 0;\n }\n this[$setProperty]('rotation', rotation);\n }\n setScale(scale) {\n if (scale == null) {\n // Reset scale.\n scale = { u: 1, v: 1 };\n }\n this[$setProperty]('repeat', new Vector2(scale.u, scale.v));\n }\n setOffset(offset) {\n if (offset == null) {\n // Reset offset.\n offset = { u: 0, v: 0 };\n }\n this[$setProperty]('offset', new Vector2(offset.u, offset.v));\n }\n [$setProperty](property, value) {\n if (isValidSamplerValue(property, value)) {\n for (const texture of this[$threeTextures]) {\n texture[property] = value;\n texture.needsUpdate = true;\n }\n }\n this[$onUpdate]();\n }\n}\n//# sourceMappingURL=sampler.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Image } from './image.js';\nimport { Sampler } from './sampler.js';\nimport { $correlatedObjects, ThreeDOMElement } from './three-dom-element.js';\nconst $image = Symbol('image');\nconst $sampler = Symbol('sampler');\nconst $threeTexture = Symbol('threeTexture');\n/**\n * Material facade implementation for Three.js materials\n */\nexport class Texture extends ThreeDOMElement {\n get [$threeTexture]() {\n var _a;\n return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value;\n }\n constructor(onUpdate, threeTexture) {\n super(onUpdate, new Set(threeTexture ? [threeTexture] : []));\n this[$sampler] = new Sampler(onUpdate, threeTexture);\n this[$image] = new Image(onUpdate, threeTexture);\n }\n get name() {\n return this[$threeTexture].name || '';\n }\n set name(name) {\n for (const texture of this[$correlatedObjects]) {\n texture.name = name;\n }\n }\n get sampler() {\n return this[$sampler];\n }\n get source() {\n return this[$image];\n }\n}\n//# sourceMappingURL=texture.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b, _c;\nimport { LinearSRGBColorSpace, SRGBColorSpace, Vector2 } from 'three';\nimport { $threeTexture } from './image.js';\nimport { Texture } from './texture.js';\nconst $texture = Symbol('texture');\nconst $transform = Symbol('transform');\nexport const $materials = Symbol('materials');\nexport const $usage = Symbol('usage');\nconst $onUpdate = Symbol('onUpdate');\nconst $activeVideo = Symbol('activeVideo');\n// Defines what a texture will be used for.\nexport var TextureUsage;\n(function (TextureUsage) {\n TextureUsage[TextureUsage[\"Base\"] = 0] = \"Base\";\n TextureUsage[TextureUsage[\"MetallicRoughness\"] = 1] = \"MetallicRoughness\";\n TextureUsage[TextureUsage[\"Normal\"] = 2] = \"Normal\";\n TextureUsage[TextureUsage[\"Occlusion\"] = 3] = \"Occlusion\";\n TextureUsage[TextureUsage[\"Emissive\"] = 4] = \"Emissive\";\n TextureUsage[TextureUsage[\"Clearcoat\"] = 5] = \"Clearcoat\";\n TextureUsage[TextureUsage[\"ClearcoatRoughness\"] = 6] = \"ClearcoatRoughness\";\n TextureUsage[TextureUsage[\"ClearcoatNormal\"] = 7] = \"ClearcoatNormal\";\n TextureUsage[TextureUsage[\"SheenColor\"] = 8] = \"SheenColor\";\n TextureUsage[TextureUsage[\"SheenRoughness\"] = 9] = \"SheenRoughness\";\n TextureUsage[TextureUsage[\"Transmission\"] = 10] = \"Transmission\";\n TextureUsage[TextureUsage[\"Thickness\"] = 11] = \"Thickness\";\n TextureUsage[TextureUsage[\"Specular\"] = 12] = \"Specular\";\n TextureUsage[TextureUsage[\"SpecularColor\"] = 13] = \"SpecularColor\";\n TextureUsage[TextureUsage[\"Iridescence\"] = 14] = \"Iridescence\";\n TextureUsage[TextureUsage[\"IridescenceThickness\"] = 15] = \"IridescenceThickness\";\n TextureUsage[TextureUsage[\"Anisotropy\"] = 16] = \"Anisotropy\";\n})(TextureUsage || (TextureUsage = {}));\n/**\n * TextureInfo facade implementation for Three.js materials\n */\nexport class TextureInfo {\n constructor(onUpdate, usage, threeTexture, material) {\n this[_a] = null;\n this[_b] = {\n rotation: 0,\n scale: new Vector2(1, 1),\n offset: new Vector2(0, 0)\n };\n this[_c] = false;\n // Creates image, sampler, and texture if valid texture info is provided.\n if (threeTexture) {\n this[$transform].rotation = threeTexture.rotation;\n this[$transform].scale.copy(threeTexture.repeat);\n this[$transform].offset.copy(threeTexture.offset);\n this[$texture] = new Texture(onUpdate, threeTexture);\n }\n this[$onUpdate] = onUpdate;\n this[$materials] = material;\n this[$usage] = usage;\n }\n get texture() {\n return this[$texture];\n }\n setTexture(texture) {\n var _d, _e;\n const threeTexture = texture != null ? texture.source[$threeTexture] : null;\n const oldTexture = (_d = this[$texture]) === null || _d === void 0 ? void 0 : _d.source[$threeTexture];\n if (oldTexture != null && oldTexture.isVideoTexture) {\n this[$activeVideo] = false;\n }\n else if ((_e = this[$texture]) === null || _e === void 0 ? void 0 : _e.source.animation) {\n this[$texture].source.animation.removeEventListener('enterFrame', this[$onUpdate]);\n }\n this[$texture] = texture;\n if (threeTexture != null && threeTexture.isVideoTexture) {\n const element = threeTexture.image;\n this[$activeVideo] = true;\n if (element.requestVideoFrameCallback != null) {\n const update = () => {\n if (!this[$activeVideo]) {\n return;\n }\n this[$onUpdate]();\n element.requestVideoFrameCallback(update);\n };\n element.requestVideoFrameCallback(update);\n }\n else {\n const update = () => {\n if (!this[$activeVideo]) {\n return;\n }\n this[$onUpdate]();\n requestAnimationFrame(update);\n };\n requestAnimationFrame(update);\n }\n }\n else if ((texture === null || texture === void 0 ? void 0 : texture.source.animation) != null) {\n texture.source.animation.addEventListener('enterFrame', this[$onUpdate]);\n }\n let colorSpace = SRGBColorSpace;\n if (this[$materials]) {\n for (const material of this[$materials]) {\n switch (this[$usage]) {\n case TextureUsage.Base:\n material.map = threeTexture;\n break;\n case TextureUsage.MetallicRoughness:\n colorSpace = LinearSRGBColorSpace;\n material.metalnessMap = threeTexture;\n material.roughnessMap = threeTexture;\n break;\n case TextureUsage.Normal:\n colorSpace = LinearSRGBColorSpace;\n material.normalMap = threeTexture;\n break;\n case TextureUsage.Occlusion:\n colorSpace = LinearSRGBColorSpace;\n material.aoMap = threeTexture;\n break;\n case TextureUsage.Emissive:\n material.emissiveMap = threeTexture;\n break;\n case TextureUsage.Clearcoat:\n material.clearcoatMap = threeTexture;\n break;\n case TextureUsage.ClearcoatRoughness:\n material.clearcoatRoughnessMap = threeTexture;\n break;\n case TextureUsage.ClearcoatNormal:\n material.clearcoatNormalMap = threeTexture;\n break;\n case TextureUsage.SheenColor:\n material.sheenColorMap = threeTexture;\n break;\n case TextureUsage.SheenRoughness:\n material.sheenRoughnessMap = threeTexture;\n break;\n case TextureUsage.Transmission:\n material.transmissionMap = threeTexture;\n break;\n case TextureUsage.Thickness:\n material.thicknessMap = threeTexture;\n break;\n case TextureUsage.Specular:\n material.specularIntensityMap = threeTexture;\n break;\n case TextureUsage.SpecularColor:\n material.specularColorMap = threeTexture;\n break;\n case TextureUsage.Iridescence:\n material.iridescenceMap = threeTexture;\n break;\n case TextureUsage.IridescenceThickness:\n material.iridescenceThicknessMap = threeTexture;\n break;\n case TextureUsage.Anisotropy:\n material.anisotropyMap = threeTexture;\n break;\n default:\n }\n material.needsUpdate = true;\n }\n }\n if (threeTexture) {\n // Updates the colorSpace for the texture, affects all references.\n threeTexture.colorSpace = colorSpace;\n threeTexture.rotation = this[$transform].rotation;\n threeTexture.repeat = this[$transform].scale;\n threeTexture.offset = this[$transform].offset;\n }\n this[$onUpdate]();\n }\n}\n_a = $texture, _b = $transform, _c = $activeVideo;\n//# sourceMappingURL=texture-info.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Color } from 'three';\nimport { TextureInfo, TextureUsage } from './texture-info.js';\nimport { $correlatedObjects, $onUpdate, ThreeDOMElement } from './three-dom-element.js';\nconst $threeMaterial = Symbol('threeMaterial');\nconst $threeMaterials = Symbol('threeMaterials');\nconst $baseColorTexture = Symbol('baseColorTexture');\nconst $metallicRoughnessTexture = Symbol('metallicRoughnessTexture');\n/**\n * PBR material properties facade implementation for Three.js materials\n */\nexport class PBRMetallicRoughness extends ThreeDOMElement {\n get [$threeMaterials]() {\n return this[$correlatedObjects];\n }\n get [$threeMaterial]() {\n var _a;\n return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value;\n }\n constructor(onUpdate, correlatedMaterials) {\n super(onUpdate, correlatedMaterials);\n const { map, metalnessMap } = correlatedMaterials.values().next().value;\n this[$baseColorTexture] =\n new TextureInfo(onUpdate, TextureUsage.Base, map, correlatedMaterials);\n this[$metallicRoughnessTexture] = new TextureInfo(onUpdate, TextureUsage.MetallicRoughness, metalnessMap, correlatedMaterials);\n }\n get baseColorFactor() {\n const rgba = [0, 0, 0, this[$threeMaterial].opacity];\n this[$threeMaterial].color.toArray(rgba);\n return rgba;\n }\n get metallicFactor() {\n return this[$threeMaterial].metalness;\n }\n get roughnessFactor() {\n return this[$threeMaterial].roughness;\n }\n get baseColorTexture() {\n return this[$baseColorTexture];\n }\n get metallicRoughnessTexture() {\n return this[$metallicRoughnessTexture];\n }\n setBaseColorFactor(rgba) {\n const color = new Color();\n if (rgba instanceof Array) {\n color.fromArray(rgba);\n }\n else {\n color.set(rgba);\n }\n for (const material of this[$threeMaterials]) {\n material.color.set(color);\n if (rgba instanceof Array && rgba.length > 3) {\n material.opacity = rgba[3];\n }\n else {\n rgba = [0, 0, 0, material.opacity];\n color.toArray(rgba);\n }\n }\n this[$onUpdate]();\n }\n setMetallicFactor(value) {\n for (const material of this[$threeMaterials]) {\n material.metalness = value;\n }\n this[$onUpdate]();\n }\n setRoughnessFactor(value) {\n for (const material of this[$threeMaterials]) {\n material.roughness = value;\n }\n this[$onUpdate]();\n }\n}\n//# sourceMappingURL=pbr-metallic-roughness.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b;\nimport { Color, DoubleSide, FrontSide, Vector2 } from 'three';\nimport { PBRMetallicRoughness } from './pbr-metallic-roughness.js';\nimport { TextureInfo, TextureUsage } from './texture-info.js';\nimport { $correlatedObjects, $onUpdate, ThreeDOMElement } from './three-dom-element.js';\nconst $pbrMetallicRoughness = Symbol('pbrMetallicRoughness');\nconst $normalTexture = Symbol('normalTexture');\nconst $occlusionTexture = Symbol('occlusionTexture');\nconst $emissiveTexture = Symbol('emissiveTexture');\nconst $backingThreeMaterial = Symbol('backingThreeMaterial');\nconst $applyAlphaCutoff = Symbol('applyAlphaCutoff');\nconst $getAlphaMode = Symbol('getAlphaMode');\nexport const $lazyLoadGLTFInfo = Symbol('lazyLoadGLTFInfo');\nconst $initialize = Symbol('initialize');\nexport const $getLoadedMaterial = Symbol('getLoadedMaterial');\nexport const $ensureMaterialIsLoaded = Symbol('ensureMaterialIsLoaded');\nexport const $gltfIndex = Symbol('gltfIndex');\nexport const $setActive = Symbol('setActive');\nexport const $variantIndices = Symbol('variantIndices');\nconst $isActive = Symbol('isActive');\nconst $modelVariants = Symbol('modelVariants');\nconst $name = Symbol('name');\nconst $pbrTextures = Symbol('pbrTextures');\n/**\n * Material facade implementation for Three.js materials\n */\nexport class Material extends ThreeDOMElement {\n get [(_a = $variantIndices, _b = $pbrTextures, $backingThreeMaterial)]() {\n return this[$correlatedObjects]\n .values()\n .next()\n .value;\n }\n constructor(onUpdate, gltfIndex, isActive, modelVariants, correlatedMaterials, name, lazyLoadInfo = undefined) {\n super(onUpdate, correlatedMaterials);\n this[_a] = new Set();\n this[_b] = new Map();\n this[$gltfIndex] = gltfIndex;\n this[$isActive] = isActive;\n this[$modelVariants] = modelVariants;\n this[$name] = name;\n if (lazyLoadInfo == null) {\n this[$initialize]();\n }\n else {\n this[$lazyLoadGLTFInfo] = lazyLoadInfo;\n }\n }\n [$initialize]() {\n const onUpdate = this[$onUpdate];\n const correlatedMaterials = this[$correlatedObjects];\n this[$pbrMetallicRoughness] =\n new PBRMetallicRoughness(onUpdate, correlatedMaterials);\n const { normalMap, aoMap, emissiveMap } = correlatedMaterials.values().next().value;\n this[$normalTexture] = new TextureInfo(onUpdate, TextureUsage.Normal, normalMap, correlatedMaterials);\n this[$occlusionTexture] = new TextureInfo(onUpdate, TextureUsage.Occlusion, aoMap, correlatedMaterials);\n this[$emissiveTexture] = new TextureInfo(onUpdate, TextureUsage.Emissive, emissiveMap, correlatedMaterials);\n const createTextureInfo = (usage) => {\n this[$pbrTextures].set(usage, new TextureInfo(onUpdate, usage, null, correlatedMaterials));\n };\n createTextureInfo(TextureUsage.Clearcoat);\n createTextureInfo(TextureUsage.ClearcoatRoughness);\n createTextureInfo(TextureUsage.ClearcoatNormal);\n createTextureInfo(TextureUsage.SheenColor);\n createTextureInfo(TextureUsage.SheenRoughness);\n createTextureInfo(TextureUsage.Transmission);\n createTextureInfo(TextureUsage.Thickness);\n createTextureInfo(TextureUsage.Specular);\n createTextureInfo(TextureUsage.SpecularColor);\n createTextureInfo(TextureUsage.Iridescence);\n createTextureInfo(TextureUsage.IridescenceThickness);\n createTextureInfo(TextureUsage.Anisotropy);\n }\n async [$getLoadedMaterial]() {\n if (this[$lazyLoadGLTFInfo] != null) {\n const material = await this[$lazyLoadGLTFInfo].doLazyLoad();\n this[$initialize]();\n // Releases lazy load info.\n this[$lazyLoadGLTFInfo] = undefined;\n // Redefines the method as a noop method.\n this.ensureLoaded = async () => { };\n return material;\n }\n return null;\n }\n colorFromRgb(rgb) {\n const color = new Color();\n if (rgb instanceof Array) {\n color.fromArray(rgb);\n }\n else {\n color.set(rgb);\n }\n return color;\n }\n [$ensureMaterialIsLoaded]() {\n if (this[$lazyLoadGLTFInfo] == null) {\n return;\n }\n throw new Error(`Material \"${this.name}\" has not been loaded, call 'await\n myMaterial.ensureLoaded()' before using an unloaded material.`);\n }\n async ensureLoaded() {\n await this[$getLoadedMaterial]();\n }\n get isLoaded() {\n return this[$lazyLoadGLTFInfo] == null;\n }\n get isActive() {\n return this[$isActive];\n }\n [$setActive](isActive) {\n this[$isActive] = isActive;\n }\n get name() {\n return this[$name] || '';\n }\n set name(name) {\n this[$name] = name;\n if (this[$correlatedObjects] != null) {\n for (const threeMaterial of this[$correlatedObjects]) {\n threeMaterial.name = name;\n }\n }\n }\n get pbrMetallicRoughness() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrMetallicRoughness];\n }\n get normalTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$normalTexture];\n }\n get occlusionTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$occlusionTexture];\n }\n get emissiveTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$emissiveTexture];\n }\n get emissiveFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].emissive.toArray();\n }\n get index() {\n return this[$gltfIndex];\n }\n hasVariant(name) {\n const variantData = this[$modelVariants].get(name);\n return variantData != null && this[$variantIndices].has(variantData.index);\n }\n setEmissiveFactor(rgb) {\n this[$ensureMaterialIsLoaded]();\n const color = this.colorFromRgb(rgb);\n for (const material of this[$correlatedObjects]) {\n material.emissive.set(color);\n }\n this[$onUpdate]();\n }\n [$getAlphaMode]() {\n // Follows implementation of GLTFExporter from three.js\n if (this[$backingThreeMaterial].transparent) {\n return 'BLEND';\n }\n else {\n if (this[$backingThreeMaterial].alphaTest > 0.0) {\n return 'MASK';\n }\n }\n return 'OPAQUE';\n }\n [$applyAlphaCutoff]() {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n if (this[$getAlphaMode]() === 'MASK') {\n if (material.alphaTest == undefined) {\n material.alphaTest = 0.5;\n }\n }\n else {\n material.alphaTest = undefined;\n }\n material.needsUpdate = true;\n }\n }\n setAlphaCutoff(cutoff) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.alphaTest = cutoff;\n material.needsUpdate = true;\n }\n // Set AlphaCutoff to undefined if AlphaMode is not MASK.\n this[$applyAlphaCutoff]();\n this[$onUpdate]();\n }\n getAlphaCutoff() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].alphaTest;\n }\n setDoubleSided(doubleSided) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n // When double-sided is disabled gltf spec dictates that Back-Face culling\n // must be disabled, in three.js parlance that would mean FrontSide\n // rendering only.\n // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#double-sided\n material.side = doubleSided ? DoubleSide : FrontSide;\n material.needsUpdate = true;\n }\n this[$onUpdate]();\n }\n getDoubleSided() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].side == DoubleSide;\n }\n setAlphaMode(alphaMode) {\n this[$ensureMaterialIsLoaded]();\n const enableTransparency = (material, enabled) => {\n material.transparent = enabled;\n material.depthWrite = !enabled;\n };\n for (const material of this[$correlatedObjects]) {\n enableTransparency(material, alphaMode === 'BLEND');\n if (alphaMode === 'MASK') {\n material.alphaTest = 0.5;\n }\n else {\n material.alphaTest = undefined;\n }\n material.needsUpdate = true;\n }\n this[$onUpdate]();\n }\n getAlphaMode() {\n this[$ensureMaterialIsLoaded]();\n return this[$getAlphaMode]();\n }\n /**\n * PBR Next properties.\n */\n // KHR_materials_emissive_strength\n get emissiveStrength() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].emissiveIntensity;\n }\n setEmissiveStrength(emissiveStrength) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.emissiveIntensity = emissiveStrength;\n }\n this[$onUpdate]();\n }\n // KHR_materials_clearcoat\n get clearcoatFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].clearcoat;\n }\n get clearcoatRoughnessFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].clearcoatRoughness;\n }\n get clearcoatTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Clearcoat);\n }\n get clearcoatRoughnessTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.ClearcoatRoughness);\n }\n get clearcoatNormalTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.ClearcoatNormal);\n }\n get clearcoatNormalScale() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].clearcoatNormalScale.x;\n }\n setClearcoatFactor(clearcoatFactor) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.clearcoat = clearcoatFactor;\n }\n this[$onUpdate]();\n }\n setClearcoatRoughnessFactor(clearcoatRoughnessFactor) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.clearcoatRoughness = clearcoatRoughnessFactor;\n }\n this[$onUpdate]();\n }\n setClearcoatNormalScale(clearcoatNormalScale) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.clearcoatNormalScale =\n new Vector2(clearcoatNormalScale, clearcoatNormalScale);\n }\n this[$onUpdate]();\n }\n // KHR_materials_ior\n get ior() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].ior;\n }\n setIor(ior) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.ior = ior;\n }\n this[$onUpdate]();\n }\n // KHR_materials_sheen\n get sheenColorFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].sheenColor.toArray();\n }\n get sheenColorTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.SheenColor);\n }\n get sheenRoughnessFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].sheenRoughness;\n }\n get sheenRoughnessTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.SheenRoughness);\n }\n setSheenColorFactor(rgb) {\n this[$ensureMaterialIsLoaded]();\n const color = this.colorFromRgb(rgb);\n for (const material of this[$correlatedObjects]) {\n material.sheenColor.set(color);\n // Three.js GLTFExporter checks for internal sheen value.\n material.sheen = 1;\n }\n this[$onUpdate]();\n }\n setSheenRoughnessFactor(roughness) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.sheenRoughness = roughness;\n // Three.js GLTFExporter checks for internal sheen value.\n material.sheen = 1;\n }\n this[$onUpdate]();\n }\n // KHR_materials_transmission\n get transmissionFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].transmission;\n }\n get transmissionTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Transmission);\n }\n setTransmissionFactor(transmission) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.transmission = transmission;\n }\n this[$onUpdate]();\n }\n // KHR_materials_volume\n get thicknessFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].thickness;\n }\n get thicknessTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Thickness);\n }\n get attenuationDistance() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].attenuationDistance;\n }\n get attenuationColor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].attenuationColor.toArray();\n }\n setThicknessFactor(thickness) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.thickness = thickness;\n }\n this[$onUpdate]();\n }\n setAttenuationDistance(attenuationDistance) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.attenuationDistance = attenuationDistance;\n }\n this[$onUpdate]();\n }\n setAttenuationColor(rgb) {\n this[$ensureMaterialIsLoaded]();\n const color = this.colorFromRgb(rgb);\n for (const material of this[$correlatedObjects]) {\n material.attenuationColor.set(color);\n }\n this[$onUpdate]();\n }\n // KHR_materials_specular\n get specularFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].specularIntensity;\n }\n get specularTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Specular);\n }\n get specularColorFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].specularColor.toArray();\n }\n get specularColorTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.SheenColor);\n }\n setSpecularFactor(specularFactor) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.specularIntensity = specularFactor;\n }\n this[$onUpdate]();\n }\n setSpecularColorFactor(rgb) {\n this[$ensureMaterialIsLoaded]();\n const color = this.colorFromRgb(rgb);\n for (const material of this[$correlatedObjects]) {\n material.specularColor.set(color);\n }\n this[$onUpdate]();\n }\n // KHR_materials_iridescence\n get iridescenceFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].iridescence;\n }\n get iridescenceTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Iridescence);\n }\n get iridescenceIor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].iridescenceIOR;\n }\n get iridescenceThicknessMinimum() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].iridescenceThicknessRange[0];\n }\n get iridescenceThicknessMaximum() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].iridescenceThicknessRange[1];\n }\n get iridescenceThicknessTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.IridescenceThickness);\n }\n setIridescenceFactor(iridescence) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.iridescence = iridescence;\n }\n this[$onUpdate]();\n }\n setIridescenceIor(ior) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.iridescenceIOR = ior;\n }\n this[$onUpdate]();\n }\n setIridescenceThicknessMinimum(thicknessMin) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.iridescenceThicknessRange[0] = thicknessMin;\n }\n this[$onUpdate]();\n }\n setIridescenceThicknessMaximum(thicknessMax) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.iridescenceThicknessRange[1] = thicknessMax;\n }\n this[$onUpdate]();\n }\n // KHR_materials_anisotropy\n get anisotropyStrength() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].anisotropy;\n }\n get anisotropyRotation() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].anisotropyRotation;\n }\n get anisotropyTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Anisotropy);\n }\n setAnisotropyStrength(strength) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.anisotropy = strength;\n }\n this[$onUpdate]();\n }\n setAnisotropyRotation(rotation) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.anisotropyRotation = rotation;\n }\n this[$onUpdate]();\n }\n}\n//# sourceMappingURL=material.js.map","import { $getLoadedMaterial, $variantIndices } from '../material.js';\nimport { $correlatedObjects } from '../three-dom-element.js';\n// Defines the base level node methods and data.\nexport class Node {\n constructor(name) {\n this.name = '';\n this.children = new Array();\n this.name = name;\n }\n}\n// Represents a primitive in a glTF mesh.\nexport class PrimitiveNode extends Node {\n constructor(mesh, mvMaterials, modelVariants, correlatedSceneGraph) {\n super(mesh.name);\n // Maps glTF material index number to a material that this primitive supports.\n this.materials = new Map();\n // Maps variant index to material.\n this.variantToMaterialMap = new Map();\n this.initialMaterialIdx = 0;\n this.activeMaterialIdx = 0;\n this.mesh = mesh;\n const { gltf, threeGLTF, threeObjectMap } = correlatedSceneGraph;\n this.parser = threeGLTF.parser;\n this.modelVariants = modelVariants;\n this.mesh.userData.variantData = modelVariants;\n // Captures the primitive's initial material.\n const materialMappings = threeObjectMap.get(mesh.material);\n if (materialMappings.materials != null) {\n this.initialMaterialIdx = this.activeMaterialIdx =\n materialMappings.materials;\n }\n else {\n console.error(`Primitive (${mesh.name}) missing initial material reference.`);\n }\n // Gets the mesh index from the node.\n const associations = mesh.userData.associations ||\n {};\n if (associations.meshes == null) {\n console.error('Mesh is missing primitive index association');\n return;\n }\n // The gltf mesh array to sample from.\n const meshElementArray = gltf['meshes'] || [];\n // List of primitives under the mesh.\n const gltfPrimitives = (meshElementArray[associations.meshes].primitives || []);\n const gltfPrimitive = gltfPrimitives[associations.primitives];\n if (gltfPrimitive == null) {\n console.error('Mesh primitive definition is missing.');\n return;\n }\n // Maps the gltfPrimitive default to a material.\n if (gltfPrimitive.material != null) {\n this.materials.set(gltfPrimitive.material, mvMaterials[gltfPrimitive.material]);\n }\n else {\n const defaultIdx = mvMaterials.findIndex((mat) => {\n return mat.name === 'Default';\n });\n if (defaultIdx >= 0) {\n this.materials.set(defaultIdx, mvMaterials[defaultIdx]);\n }\n else {\n console.warn('gltfPrimitive has no material!');\n }\n }\n if (gltfPrimitive.extensions &&\n gltfPrimitive.extensions['KHR_materials_variants']) {\n const variantsExtension = gltfPrimitive.extensions['KHR_materials_variants'];\n const extensions = threeGLTF.parser.json.extensions;\n const variantNames = extensions['KHR_materials_variants'].variants;\n // Provides definition now that we know there are variants to\n // support.\n for (const mapping of variantsExtension.mappings) {\n const mvMaterial = mvMaterials[mapping.material];\n // Maps variant indices to Materials.\n this.materials.set(mapping.material, mvMaterial);\n for (const variant of mapping.variants) {\n const { name } = variantNames[variant];\n this.variantToMaterialMap.set(variant, mvMaterial);\n // Provides variant info for material self lookup.\n mvMaterial[$variantIndices].add(variant);\n // Updates the models variant data.\n if (!modelVariants.has(name)) {\n modelVariants.set(name, { name, index: variant });\n }\n }\n }\n }\n }\n async setActiveMaterial(material) {\n const mvMaterial = this.materials.get(material);\n if (material !== this.activeMaterialIdx) {\n const backingMaterials = mvMaterial[$correlatedObjects];\n const baseMaterial = await mvMaterial[$getLoadedMaterial]();\n if (baseMaterial != null) {\n this.mesh.material = baseMaterial;\n }\n else {\n this.mesh.material = backingMaterials.values().next().value;\n }\n this.parser.assignFinalMaterial(this.mesh);\n backingMaterials.add(this.mesh.material);\n this.activeMaterialIdx = material;\n }\n return this.mesh.material;\n }\n getActiveMaterial() {\n return this.materials.get(this.activeMaterialIdx);\n }\n getMaterial(index) {\n return this.materials.get(index);\n }\n async enableVariant(name) {\n if (name == null) {\n return this.setActiveMaterial(this.initialMaterialIdx);\n }\n if (this.variantToMaterialMap != null && this.modelVariants.has(name)) {\n const modelVariants = this.modelVariants.get(name);\n return this.enableVariantHelper(modelVariants.index);\n }\n return null;\n }\n async enableVariantHelper(index) {\n if (this.variantToMaterialMap != null && index != null) {\n const material = this.variantToMaterialMap.get(index);\n if (material != null) {\n return this.setActiveMaterial(material.index);\n }\n }\n return null;\n }\n async instantiateVariants() {\n if (this.variantToMaterialMap == null) {\n return;\n }\n for (const index of this.variantToMaterialMap.keys()) {\n const variantMaterial = this.mesh.userData.variantMaterials.get(index);\n if (variantMaterial.material != null) {\n continue;\n }\n const threeMaterial = await this.enableVariantHelper(index);\n if (threeMaterial != null) {\n variantMaterial.material = threeMaterial;\n }\n }\n }\n get variantInfo() {\n return this.variantToMaterialMap;\n }\n addVariant(materialVariant, variantName) {\n if (!this.ensureVariantIsUnused(variantName)) {\n return false;\n }\n // Adds the variant to the model variants if needed.\n if (!this.modelVariants.has(variantName)) {\n this.modelVariants.set(variantName, { name: variantName, index: this.modelVariants.size });\n }\n const modelVariantData = this.modelVariants.get(variantName);\n const variantIndex = modelVariantData.index;\n // Updates materials mapped to the variant.\n materialVariant[$variantIndices].add(variantIndex);\n // Updates internal mappings.\n this.variantToMaterialMap.set(variantIndex, materialVariant);\n this.materials.set(materialVariant.index, materialVariant);\n this.updateVariantUserData(variantIndex, materialVariant);\n return true;\n }\n deleteVariant(variantIndex) {\n if (this.variantInfo.has(variantIndex)) {\n this.variantInfo.delete(variantIndex);\n const userDataMap = this.mesh.userData.variantMaterials;\n if (userDataMap != null) {\n userDataMap.delete(variantIndex);\n }\n }\n }\n updateVariantUserData(variantIndex, materialVariant) {\n // Adds variants name to material variants set.\n materialVariant[$variantIndices].add(variantIndex);\n this.mesh.userData.variantData = this.modelVariants;\n // Updates import data (see VariantMaterialLoaderPlugin.ts).\n this.mesh.userData.variantMaterials = this.mesh.userData.variantMaterials ||\n new Map();\n const map = this.mesh.userData.variantMaterials;\n map.set(variantIndex, {\n material: materialVariant[$correlatedObjects].values().next().value,\n gltfMaterialIndex: materialVariant.index,\n });\n }\n ensureVariantIsUnused(variantName) {\n const modelVariants = this.modelVariants.get(variantName);\n if (modelVariants != null && this.variantInfo.has(modelVariants.index)) {\n console.warn(`Primitive cannot add variant '${variantName}' for this material, it already exists.`);\n return false;\n }\n return true;\n }\n}\n//# sourceMappingURL=primitive-node.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b, _c, _d, _e, _f;\nimport { Mesh } from 'three';\nimport { $setActive, $variantIndices, Material } from './material.js';\nimport { Node, PrimitiveNode } from './nodes/primitive-node.js';\nimport { $correlatedObjects } from './three-dom-element.js';\nexport const $materials = Symbol('materials');\nconst $hierarchy = Symbol('hierarchy');\nconst $roots = Symbol('roots');\nexport const $primitivesList = Symbol('primitives');\nexport const $loadVariant = Symbol('loadVariant');\nexport const $prepareVariantsForExport = Symbol('prepareVariantsForExport');\nexport const $switchVariant = Symbol('switchVariant');\nexport const $materialFromPoint = Symbol('materialFromPoint');\nexport const $nodeFromPoint = Symbol('nodeFromPoint');\nexport const $nodeFromIndex = Symbol('nodeFromIndex');\nexport const $variantData = Symbol('variantData');\nexport const $availableVariants = Symbol('availableVariants');\nconst $modelOnUpdate = Symbol('modelOnUpdate');\nconst $cloneMaterial = Symbol('cloneMaterial');\n// Holds onto temporary scene context information needed to perform lazy loading\n// of a resource.\nexport class LazyLoader {\n constructor(gltf, gltfElementMap, mapKey, doLazyLoad) {\n this.gltf = gltf;\n this.gltfElementMap = gltfElementMap;\n this.mapKey = mapKey;\n this.doLazyLoad = doLazyLoad;\n }\n}\n/**\n * A Model facades the top-level GLTF object returned by Three.js' GLTFLoader.\n * Currently, the model only bothers itself with the materials in the Three.js\n * scene graph.\n */\nexport class Model {\n constructor(correlatedSceneGraph, onUpdate = () => { }) {\n this[_a] = new Array();\n this[_b] = new Array();\n this[_c] = new Array();\n this[_d] = new Array();\n this[_e] = () => { };\n this[_f] = new Map();\n this[$modelOnUpdate] = onUpdate;\n const { gltf, threeGLTF, gltfElementMap } = correlatedSceneGraph;\n for (const [i, material] of gltf.materials.entries()) {\n const correlatedMaterial = gltfElementMap.get(material);\n if (correlatedMaterial != null) {\n this[$materials].push(new Material(onUpdate, i, true, this[$variantData], correlatedMaterial, material.name));\n }\n else {\n const elementArray = gltf['materials'] || [];\n const gltfMaterialDef = elementArray[i];\n const threeMaterialSet = new Set();\n gltfElementMap.set(gltfMaterialDef, threeMaterialSet);\n const materialLoadCallback = async () => {\n const threeMaterial = await threeGLTF.parser.getDependency('material', i);\n threeMaterialSet.add(threeMaterial);\n return threeMaterial;\n };\n // Configures the material for lazy loading.\n this[$materials].push(new Material(onUpdate, i, false, this[$variantData], threeMaterialSet, material.name, new LazyLoader(gltf, gltfElementMap, gltfMaterialDef, materialLoadCallback)));\n }\n }\n // Creates a hierarchy of Nodes. Allows not just for switching which\n // material is applied to a mesh but also exposes a way to provide API\n // for switching materials and general assignment/modification.\n // Prepares for scene iteration.\n const parentMap = new Map();\n const nodeStack = new Array();\n for (const object of threeGLTF.scene.children) {\n nodeStack.push(object);\n }\n // Walks the hierarchy and creates a node tree.\n while (nodeStack.length > 0) {\n const object = nodeStack.pop();\n let node = null;\n if (object instanceof Mesh) {\n node = new PrimitiveNode(object, this.materials, this[$variantData], correlatedSceneGraph);\n this[$primitivesList].push(node);\n }\n else {\n node = new Node(object.name);\n }\n const parent = parentMap.get(object);\n if (parent != null) {\n parent.children.push(node);\n }\n else {\n this[$roots].push(node);\n }\n this[$hierarchy].push(node);\n for (const child of object.children) {\n nodeStack.push(child);\n parentMap.set(object, node);\n }\n }\n }\n /**\n * Materials are listed in the order of the GLTF materials array, plus a\n * default material at the end if one is used.\n *\n * TODO(#1003): How do we handle non-active scenes?\n */\n get materials() {\n return this[$materials];\n }\n [(_a = $materials, _b = $hierarchy, _c = $roots, _d = $primitivesList, _e = $modelOnUpdate, _f = $variantData, $availableVariants)]() {\n const variants = Array.from(this[$variantData].values());\n variants.sort((a, b) => {\n return a.index - b.index;\n });\n return variants.map((data) => {\n return data.name;\n });\n }\n getMaterialByName(name) {\n const matches = this[$materials].filter(material => {\n return material.name === name;\n });\n if (matches.length > 0) {\n return matches[0];\n }\n return null;\n }\n [$nodeFromIndex](mesh, primitive) {\n const found = this[$hierarchy].find((node) => {\n if (node instanceof PrimitiveNode) {\n const { meshes, primitives } = node.mesh.userData.associations;\n if (meshes == mesh && primitives == primitive) {\n return true;\n }\n }\n return false;\n });\n return found == null ? null : found;\n }\n [$nodeFromPoint](hit) {\n return this[$hierarchy].find((node) => {\n if (node instanceof PrimitiveNode) {\n const primitive = node;\n if (primitive.mesh === hit.object) {\n return true;\n }\n }\n return false;\n });\n }\n /**\n * Intersects a ray with the Model and returns the first material whose\n * object was intersected.\n */\n [$materialFromPoint](hit) {\n return this[$nodeFromPoint](hit).getActiveMaterial();\n }\n /**\n * Switches model variant to the variant name provided, or switches to\n * default/initial materials if 'null' is provided.\n */\n async [$switchVariant](variantName) {\n for (const primitive of this[$primitivesList]) {\n await primitive.enableVariant(variantName);\n }\n for (const material of this.materials) {\n material[$setActive](false);\n }\n // Marks the materials that are now in use after the variant switch.\n for (const primitive of this[$primitivesList]) {\n this.materials[primitive.getActiveMaterial().index][$setActive](true);\n }\n }\n async [$prepareVariantsForExport]() {\n const promises = new Array();\n for (const primitive of this[$primitivesList]) {\n promises.push(primitive.instantiateVariants());\n }\n await Promise.all(promises);\n }\n [$cloneMaterial](index, newMaterialName) {\n const material = this.materials[index];\n if (!material.isLoaded) {\n console.error(`Cloning an unloaded material,\n call 'material.ensureLoaded() before cloning the material.`);\n }\n const threeMaterialSet = material[$correlatedObjects];\n const clonedSet = new Set();\n for (const [i, threeMaterial] of threeMaterialSet.entries()) {\n const clone = threeMaterial.clone();\n clone.name =\n newMaterialName + (threeMaterialSet.size > 1 ? '_inst' + i : '');\n clonedSet.add(clone);\n }\n const clonedMaterial = new Material(this[$modelOnUpdate], this[$materials].length, false, // Cloned as inactive.\n this[$variantData], clonedSet, newMaterialName);\n this[$materials].push(clonedMaterial);\n return clonedMaterial;\n }\n createMaterialInstanceForVariant(originalMaterialIndex, newMaterialName, variantName, activateVariant = true) {\n let variantMaterialInstance = null;\n for (const primitive of this[$primitivesList]) {\n const variantData = this[$variantData].get(variantName);\n // Skips the primitive if the variant already exists.\n if (variantData != null && primitive.variantInfo.has(variantData.index)) {\n continue;\n }\n // Skips the primitive if the source/original material does not exist.\n if (primitive.getMaterial(originalMaterialIndex) == null) {\n continue;\n }\n if (!this.hasVariant(variantName)) {\n this.createVariant(variantName);\n }\n if (variantMaterialInstance == null) {\n variantMaterialInstance =\n this[$cloneMaterial](originalMaterialIndex, newMaterialName);\n }\n primitive.addVariant(variantMaterialInstance, variantName);\n }\n if (activateVariant && variantMaterialInstance != null) {\n variantMaterialInstance[$setActive](true);\n this.materials[originalMaterialIndex][$setActive](false);\n for (const primitive of this[$primitivesList]) {\n primitive.enableVariant(variantName);\n }\n }\n return variantMaterialInstance;\n }\n createVariant(variantName) {\n if (!this[$variantData].has(variantName)) {\n // Adds the name if it's not already in the list.\n this[$variantData].set(variantName, { name: variantName, index: this[$variantData].size });\n }\n else {\n console.warn(`Variant '${variantName}'' already exists`);\n }\n }\n hasVariant(variantName) {\n return this[$variantData].has(variantName);\n }\n setMaterialToVariant(materialIndex, targetVariantName) {\n if (this[$availableVariants]().find(name => name === targetVariantName) ==\n null) {\n console.warn(`Can't add material to '${targetVariantName}', the variant does not exist.'`);\n return;\n }\n if (materialIndex < 0 || materialIndex >= this.materials.length) {\n console.error(`setMaterialToVariant(): materialIndex is out of bounds.`);\n return;\n }\n for (const primitive of this[$primitivesList]) {\n const material = primitive.getMaterial(materialIndex);\n // Ensures the material exists on the primitive before setting it to a\n // variant.\n if (material != null) {\n primitive.addVariant(material, targetVariantName);\n }\n }\n }\n updateVariantName(currentName, newName) {\n const variantData = this[$variantData].get(currentName);\n if (variantData == null) {\n return;\n }\n variantData.name = newName;\n this[$variantData].set(newName, variantData);\n this[$variantData].delete(currentName);\n }\n deleteVariant(variantName) {\n const variant = this[$variantData].get(variantName);\n if (variant == null) {\n return;\n }\n for (const material of this.materials) {\n if (material.hasVariant(variantName)) {\n material[$variantIndices].delete(variant.index);\n }\n }\n for (const primitive of this[$primitivesList]) {\n primitive.deleteVariant(variant.index);\n }\n this[$variantData].delete(variantName);\n }\n}\n//# sourceMappingURL=model.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { CanvasTexture, RepeatWrapping, SRGBColorSpace, VideoTexture } from 'three';\nimport { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';\nimport { $needsRender, $onModelLoad, $progressTracker, $renderer, $scene } from '../model-viewer-base.js';\nimport GLTFExporterMaterialsVariantsExtension from '../three-components/gltf-instance/VariantMaterialExporterPlugin.js';\nimport { $availableVariants, $materialFromPoint, $prepareVariantsForExport, $switchVariant, Model } from './scene-graph/model.js';\nimport { Texture as ModelViewerTexture } from './scene-graph/texture.js';\nexport const $currentGLTF = Symbol('currentGLTF');\nexport const $originalGltfJson = Symbol('originalGltfJson');\nexport const $model = Symbol('model');\nconst $getOnUpdateMethod = Symbol('getOnUpdateMethod');\nconst $buildTexture = Symbol('buildTexture');\n/**\n * SceneGraphMixin manages exposes a model API in order to support operations on\n * the scene graph.\n */\nexport const SceneGraphMixin = (ModelViewerElement) => {\n var _a, _b, _c;\n class SceneGraphModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this[_a] = undefined;\n this[_b] = null;\n this[_c] = null;\n this.variantName = null;\n this.orientation = '0 0 0';\n this.scale = '1 1 1';\n }\n // Scene-graph API:\n /** @export */\n get model() {\n return this[$model];\n }\n get availableVariants() {\n return this.model ? this.model[$availableVariants]() : [];\n }\n /**\n * Returns a deep copy of the gltf JSON as loaded. It will not reflect\n * changes to the scene-graph, nor will editing it have any effect.\n */\n get originalGltfJson() {\n return this[$originalGltfJson];\n }\n [(_a = $model, _b = $currentGLTF, _c = $originalGltfJson, $getOnUpdateMethod)]() {\n return () => {\n this[$needsRender]();\n };\n }\n [$buildTexture](texture) {\n // Applies glTF default settings.\n texture.colorSpace = SRGBColorSpace;\n texture.wrapS = RepeatWrapping;\n texture.wrapT = RepeatWrapping;\n return new ModelViewerTexture(this[$getOnUpdateMethod](), texture);\n }\n async createTexture(uri, type = 'image/png') {\n const { textureUtils } = this[$renderer];\n const texture = await textureUtils.loadImage(uri, this.withCredentials);\n texture.userData.mimeType = type;\n return this[$buildTexture](texture);\n }\n async createLottieTexture(uri, quality = 1) {\n const { textureUtils } = this[$renderer];\n const texture = await textureUtils.loadLottie(uri, quality, this.withCredentials);\n return this[$buildTexture](texture);\n }\n createVideoTexture(uri) {\n const video = document.createElement('video');\n video.crossOrigin =\n this.withCredentials ? 'use-credentials' : 'anonymous';\n video.src = uri;\n video.muted = true;\n video.playsInline = true;\n video.loop = true;\n video.play();\n const texture = new VideoTexture(video);\n return this[$buildTexture](texture);\n }\n createCanvasTexture() {\n const canvas = document.createElement('canvas');\n const texture = new CanvasTexture(canvas);\n return this[$buildTexture](texture);\n }\n async updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('variantName')) {\n const updateVariantProgress = this[$progressTracker].beginActivity('variant-update');\n updateVariantProgress(0.1);\n const model = this[$model];\n const { variantName } = this;\n if (model != null) {\n await model[$switchVariant](variantName);\n this[$needsRender]();\n this.dispatchEvent(new CustomEvent('variant-applied'));\n }\n updateVariantProgress(1.0);\n }\n if (changedProperties.has('orientation') ||\n changedProperties.has('scale')) {\n if (!this.loaded) {\n return;\n }\n const scene = this[$scene];\n scene.applyTransform();\n scene.updateBoundingBox();\n scene.updateShadow();\n this[$renderer].arRenderer.onUpdateScene();\n this[$needsRender]();\n }\n }\n [$onModelLoad]() {\n super[$onModelLoad]();\n const { currentGLTF } = this[$scene];\n if (currentGLTF != null) {\n const { correlatedSceneGraph } = currentGLTF;\n if (correlatedSceneGraph != null &&\n currentGLTF !== this[$currentGLTF]) {\n this[$model] =\n new Model(correlatedSceneGraph, this[$getOnUpdateMethod]());\n this[$originalGltfJson] =\n JSON.parse(JSON.stringify(correlatedSceneGraph.gltf));\n }\n // KHR_materials_variants extension spec:\n // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_variants\n if ('variants' in currentGLTF.userData) {\n this.requestUpdate('variantName');\n }\n }\n this[$currentGLTF] = currentGLTF;\n }\n /** @export */\n async exportScene(options) {\n const scene = this[$scene];\n return new Promise(async (resolve, reject) => {\n // Defaults\n const opts = {\n binary: true,\n onlyVisible: true,\n maxTextureSize: Infinity,\n includeCustomExtensions: false,\n forceIndices: false\n };\n Object.assign(opts, options);\n // Not configurable\n opts.animations = scene.animations;\n opts.truncateDrawRange = true;\n const shadow = scene.shadow;\n let visible = false;\n // Remove shadow from export\n if (shadow != null) {\n visible = shadow.visible;\n shadow.visible = false;\n }\n await this[$model][$prepareVariantsForExport]();\n const exporter = new GLTFExporter()\n .register((writer) => new GLTFExporterMaterialsVariantsExtension(writer));\n exporter.parse(scene.model, (gltf) => {\n return resolve(new Blob([opts.binary ? gltf : JSON.stringify(gltf)], {\n type: opts.binary ? 'application/octet-stream' :\n 'application/json'\n }));\n }, () => {\n return reject('glTF export failed');\n }, opts);\n if (shadow != null) {\n shadow.visible = visible;\n }\n });\n }\n materialFromPoint(pixelX, pixelY) {\n const model = this[$model];\n if (model == null) {\n return null;\n }\n const scene = this[$scene];\n const ndcCoords = scene.getNDC(pixelX, pixelY);\n const hit = scene.hitFromPoint(ndcCoords);\n if (hit == null || hit.face == null) {\n return null;\n }\n return model[$materialFromPoint](hit);\n }\n }\n __decorate([\n property({ type: String, attribute: 'variant-name' })\n ], SceneGraphModelViewerElement.prototype, \"variantName\", void 0);\n __decorate([\n property({ type: String, attribute: 'orientation' })\n ], SceneGraphModelViewerElement.prototype, \"orientation\", void 0);\n __decorate([\n property({ type: String, attribute: 'scale' })\n ], SceneGraphModelViewerElement.prototype, \"scale\", void 0);\n return SceneGraphModelViewerElement;\n};\n//# sourceMappingURL=scene-graph.js.map","/* @license\n * Copyright 2023 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Mesh, MeshBasicMaterial, SphereGeometry, Vector3 } from 'three';\nexport class GroundedSkybox extends Mesh {\n constructor() {\n super(undefined, new MeshBasicMaterial({ depthWrite: false }));\n this.height = 0;\n this.radius = 0;\n this.resolution = 0;\n this.userData.noHit = true;\n }\n get map() {\n return this.material.map;\n }\n set map(skybox) {\n this.material.map = skybox;\n }\n isUsable() {\n return this.height > 0 && this.radius > 0 && this.geometry != null &&\n this.map != null;\n }\n updateGeometry(height = this.height, radius = this.radius, resolution = 128) {\n if (height != this.height || radius != this.radius ||\n resolution != this.resolution) {\n this.height = height;\n this.radius = radius;\n this.resolution = resolution;\n if (height > 0 && radius > 0) {\n this.geometry.dispose();\n this.geometry = makeGeometry(height, radius, resolution);\n }\n }\n }\n}\nfunction makeGeometry(height, radius, resolution) {\n const geometry = new SphereGeometry(radius, 2 * resolution, resolution);\n geometry.scale(1, 1, -1);\n const pos = geometry.getAttribute('position');\n const tmp = new Vector3();\n for (let i = 0; i < pos.count; ++i) {\n tmp.fromBufferAttribute(pos, i);\n if (tmp.y < 0) {\n // Smooth out the transition from flat floor to sphere:\n const y1 = -height * 3 / 2;\n const f = tmp.y < y1 ? -height / tmp.y : (1 - tmp.y * tmp.y / (3 * y1 * y1));\n tmp.multiplyScalar(f);\n tmp.toArray(pos.array, 3 * i);\n }\n }\n pos.needsUpdate = true;\n return geometry;\n}\n//# sourceMappingURL=GroundedSkybox.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Matrix3, Quaternion, Triangle, Vector3 } from 'three';\nimport { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\nimport { normalizeUnit } from '../styles/conversions.js';\nimport { parseExpressions } from '../styles/parsers.js';\nconst a = new Vector3();\nconst b = new Vector3();\nconst c = new Vector3();\nconst mat = new Matrix3();\nconst triangle = new Triangle();\nconst quat = new Quaternion();\n/**\n * The Hotspot object is a reference-counted slot. If decrement() returns true,\n * it should be removed from the tree so it can be garbage-collected.\n */\nexport class Hotspot extends CSS2DObject {\n constructor(config) {\n super(document.createElement('div'));\n this.normal = new Vector3(0, 1, 0);\n this.initialized = false;\n this.referenceCount = 1;\n this.pivot = document.createElement('div');\n this.slot = document.createElement('slot');\n this.element.classList.add('annotation-wrapper');\n this.slot.name = config.name;\n this.element.appendChild(this.pivot);\n this.pivot.appendChild(this.slot);\n this.updatePosition(config.position);\n this.updateNormal(config.normal);\n this.surface = config.surface;\n }\n get facingCamera() {\n return !this.element.classList.contains('hide');\n }\n /**\n * Sets the hotspot to be in the highly visible foreground state.\n */\n show() {\n if (!this.facingCamera || !this.initialized) {\n this.updateVisibility(true);\n }\n }\n /**\n * Sets the hotspot to be in the diminished background state.\n */\n hide() {\n if (this.facingCamera || !this.initialized) {\n this.updateVisibility(false);\n }\n }\n /**\n * Call this when adding elements to the same slot to keep track.\n */\n increment() {\n this.referenceCount++;\n }\n /**\n * Call this when removing elements from the slot; returns true when the slot\n * is unused.\n */\n decrement() {\n if (this.referenceCount > 0) {\n --this.referenceCount;\n }\n return this.referenceCount === 0;\n }\n /**\n * Change the position of the hotspot to the input string, in the same format\n * as the data-position attribute.\n */\n updatePosition(position) {\n if (position == null)\n return;\n const positionNodes = parseExpressions(position)[0].terms;\n for (let i = 0; i < 3; ++i) {\n this.position.setComponent(i, normalizeUnit(positionNodes[i]).number);\n }\n this.updateMatrixWorld();\n }\n /**\n * Change the hotspot's normal to the input string, in the same format as the\n * data-normal attribute.\n */\n updateNormal(normal) {\n if (normal == null)\n return;\n const normalNodes = parseExpressions(normal)[0].terms;\n for (let i = 0; i < 3; ++i) {\n this.normal.setComponent(i, normalNodes[i].number);\n }\n }\n updateSurface() {\n const { mesh, tri, bary } = this;\n if (mesh == null || tri == null || bary == null) {\n return;\n }\n mesh.getVertexPosition(tri.x, a);\n mesh.getVertexPosition(tri.y, b);\n mesh.getVertexPosition(tri.z, c);\n a.toArray(mat.elements, 0);\n b.toArray(mat.elements, 3);\n c.toArray(mat.elements, 6);\n this.position.copy(bary).applyMatrix3(mat);\n const target = this.parent;\n target.worldToLocal(mesh.localToWorld(this.position));\n triangle.set(a, b, c);\n triangle.getNormal(this.normal).transformDirection(mesh.matrixWorld);\n const pivot = target.parent;\n quat.setFromAxisAngle(a.set(0, 1, 0), -pivot.rotation.y);\n this.normal.applyQuaternion(quat);\n }\n orient(radians) {\n this.pivot.style.transform = `rotate(${radians}rad)`;\n }\n updateVisibility(show) {\n this.element.classList.toggle('hide', !show);\n // NOTE: ShadyDOM doesn't support slot.assignedElements, otherwise we could\n // use that here.\n this.slot.assignedNodes().forEach((node) => {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return;\n }\n const element = node;\n // Visibility attribute can be configured per-node in the hotspot:\n const visibilityAttribute = element.dataset.visibilityAttribute;\n if (visibilityAttribute != null) {\n const attributeName = `data-${visibilityAttribute}`;\n element.toggleAttribute(attributeName, show);\n }\n element.dispatchEvent(new CustomEvent('hotspot-visibility', {\n detail: {\n visible: show,\n },\n }));\n });\n this.initialized = true;\n }\n}\n//# sourceMappingURL=Hotspot.js.map","/**\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders)\n * - see http://www.cake23.de/traveling-wavefronts-lit-up.html\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n */\n\nconst HorizontalBlurShader = {\n\n\tname: 'HorizontalBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'h': { value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float h;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { HorizontalBlurShader };\n","/**\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders)\n * - see http://www.cake23.de/traveling-wavefronts-lit-up.html\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n */\n\nconst VerticalBlurShader = {\n\n\tname: 'VerticalBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'v': { value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float v;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { VerticalBlurShader };\n","const _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID]{@link https://en.wikipedia.org/wiki/Universally_unique_identifier}\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `` to range ``\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp]{@link http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/}.\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep]{@link http://en.wikipedia.org/wiki/Smoothstep} for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep]{@link https://en.wikipedia.org/wiki/Smoothstep#Variations}\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles]{@link https://en.wikipedia.org/wiki/Euler_angles}\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, - 1.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n\tnormalize,\n\tdenormalize,\n\tMathUtils\n};\n","/* @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { BackSide, DoubleSide, Box3, Mesh, MeshBasicMaterial, MeshDepthMaterial, Object3D, OrthographicCamera, PlaneGeometry, RGBAFormat, ShaderMaterial, Vector3, WebGLRenderTarget } from 'three';\nimport { HorizontalBlurShader } from 'three/examples/jsm/shaders/HorizontalBlurShader.js';\nimport { VerticalBlurShader } from 'three/examples/jsm/shaders/VerticalBlurShader.js';\nimport { lerp } from 'three/src/math/MathUtils.js';\n// The softness [0, 1] of the shadow is mapped to a resolution between\n// 2^LOG_MAX_RESOLUTION and 2^LOG_MIN_RESOLUTION.\nconst LOG_MAX_RESOLUTION = 9;\nconst LOG_MIN_RESOLUTION = 6;\n// Animated models are not in general contained in their bounding box, as this\n// is calculated only for their resting pose. We create a cubic shadow volume\n// for animated models sized to their largest bounding box dimension multiplied\n// by this scale factor.\nconst ANIMATION_SCALING = 2;\n// Since hard shadows are not lightened by blurring and depth, set a lower\n// default intensity to make them more perceptually similar to the intensity of\n// the soft shadows.\nconst DEFAULT_HARD_INTENSITY = 0.3;\n/**\n * The Shadow class creates a shadow that fits a given scene and follows a\n * target. This shadow will follow the scene without any updates needed so long\n * as the shadow and scene are both parented to the same object (call it the\n * scene) and this scene is passed as the target parameter to the shadow's\n * constructor. We also must constrain the scene to motion within the horizontal\n * plane and call the setRotation() method whenever the scene's Y-axis rotation\n * changes. For motion outside of the horizontal plane, this.needsUpdate must be\n * set to true.\n *\n * The softness of the shadow is controlled by changing its resolution, making\n * softer shadows faster, but less precise.\n */\nexport class Shadow extends Object3D {\n constructor(scene, softness, side) {\n super();\n this.camera = new OrthographicCamera();\n // private cameraHelper = new CameraHelper(this.camera);\n this.renderTarget = null;\n this.renderTargetBlur = null;\n this.depthMaterial = new MeshDepthMaterial();\n this.horizontalBlurMaterial = new ShaderMaterial(HorizontalBlurShader);\n this.verticalBlurMaterial = new ShaderMaterial(VerticalBlurShader);\n this.intensity = 0;\n this.softness = 1;\n this.boundingBox = new Box3;\n this.size = new Vector3;\n this.maxDimension = 0;\n this.isAnimated = false;\n this.needsUpdate = false;\n const { camera } = this;\n camera.rotation.x = Math.PI / 2;\n camera.left = -0.5;\n camera.right = 0.5;\n camera.bottom = -0.5;\n camera.top = 0.5;\n this.add(camera);\n // this.add(this.cameraHelper);\n // this.cameraHelper.updateMatrixWorld = function() {\n // this.matrixWorld = this.camera.matrixWorld;\n // };\n const plane = new PlaneGeometry();\n const shadowMaterial = new MeshBasicMaterial({\n // color: new Color(1, 0, 0),\n opacity: 1,\n transparent: true,\n side: BackSide,\n });\n this.floor = new Mesh(plane, shadowMaterial);\n this.floor.userData.noHit = true;\n camera.add(this.floor);\n // the plane onto which to blur the texture\n this.blurPlane = new Mesh(plane);\n this.blurPlane.visible = false;\n camera.add(this.blurPlane);\n scene.target.add(this);\n // like MeshDepthMaterial, but goes from black to transparent\n this.depthMaterial.onBeforeCompile = function (shader) {\n shader.fragmentShader = shader.fragmentShader.replace('gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );', 'gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * opacity );');\n };\n // Render both sides, back sides face the light source and\n // front sides supply depth information for soft shadows\n this.depthMaterial.side = DoubleSide;\n this.horizontalBlurMaterial.depthTest = false;\n this.verticalBlurMaterial.depthTest = false;\n this.setScene(scene, softness, side);\n }\n /**\n * Update the shadow's size and position for a new scene. Softness is also\n * needed, as this controls the shadow's resolution.\n */\n setScene(scene, softness, side) {\n const { boundingBox, size, rotation, position } = this;\n this.isAnimated = scene.animationNames.length > 0;\n this.boundingBox.copy(scene.boundingBox);\n this.size.copy(scene.size);\n this.maxDimension = Math.max(size.x, size.y, size.z) *\n (this.isAnimated ? ANIMATION_SCALING : 1);\n this.boundingBox.getCenter(position);\n if (side === 'back') {\n const { min, max } = boundingBox;\n [min.y, min.z] = [min.z, min.y];\n [max.y, max.z] = [max.z, max.y];\n [size.y, size.z] = [size.z, size.y];\n rotation.x = Math.PI / 2;\n rotation.y = Math.PI;\n }\n else {\n rotation.x = 0;\n rotation.y = 0;\n }\n if (this.isAnimated) {\n const minY = boundingBox.min.y;\n const maxY = boundingBox.max.y;\n size.y = this.maxDimension;\n boundingBox.expandByVector(size.subScalar(this.maxDimension).multiplyScalar(-0.5));\n boundingBox.min.y = minY;\n boundingBox.max.y = maxY;\n size.set(this.maxDimension, maxY - minY, this.maxDimension);\n }\n if (side === 'bottom') {\n position.y = boundingBox.min.y;\n }\n else {\n position.z = boundingBox.min.y;\n }\n this.setSoftness(softness);\n }\n /**\n * Update the shadow's resolution based on softness (between 0 and 1). Should\n * not be called frequently, as this results in reallocation.\n */\n setSoftness(softness) {\n this.softness = softness;\n const { size, camera } = this;\n const scaleY = (this.isAnimated ? ANIMATION_SCALING : 1);\n const resolution = scaleY *\n Math.pow(2, LOG_MAX_RESOLUTION -\n softness * (LOG_MAX_RESOLUTION - LOG_MIN_RESOLUTION));\n this.setMapSize(resolution);\n const softFar = size.y / 2;\n const hardFar = size.y * scaleY;\n camera.near = 0;\n camera.far = lerp(hardFar, softFar, softness);\n // we have co-opted opacity to scale the depth to clip\n this.depthMaterial.opacity = 1.0 / softness;\n camera.updateProjectionMatrix();\n // this.cameraHelper.update();\n this.setIntensity(this.intensity);\n this.setOffset(0);\n }\n /**\n * Lower-level version of the above function.\n */\n setMapSize(maxMapSize) {\n const { size } = this;\n if (this.isAnimated) {\n maxMapSize *= ANIMATION_SCALING;\n }\n const baseWidth = Math.floor(size.x > size.z ? maxMapSize : maxMapSize * size.x / size.z);\n const baseHeight = Math.floor(size.x > size.z ? maxMapSize * size.z / size.x : maxMapSize);\n // width of blur filter in pixels (not adjustable)\n const TAP_WIDTH = 10;\n const width = TAP_WIDTH + baseWidth;\n const height = TAP_WIDTH + baseHeight;\n if (this.renderTarget != null &&\n (this.renderTarget.width !== width ||\n this.renderTarget.height !== height)) {\n this.renderTarget.dispose();\n this.renderTarget = null;\n this.renderTargetBlur.dispose();\n this.renderTargetBlur = null;\n }\n if (this.renderTarget == null) {\n const params = { format: RGBAFormat };\n this.renderTarget = new WebGLRenderTarget(width, height, params);\n this.renderTargetBlur = new WebGLRenderTarget(width, height, params);\n this.floor.material.map =\n this.renderTarget.texture;\n }\n // These pads account for the softening radius around the shadow.\n this.camera.scale.set(size.x * (1 + TAP_WIDTH / baseWidth), size.z * (1 + TAP_WIDTH / baseHeight), 1);\n this.needsUpdate = true;\n }\n /**\n * Set the shadow's intensity (0 to 1), which is just its opacity. Turns off\n * shadow rendering if zero.\n */\n setIntensity(intensity) {\n this.intensity = intensity;\n if (intensity > 0) {\n this.visible = true;\n this.floor.visible = true;\n this.floor.material.opacity = intensity *\n lerp(DEFAULT_HARD_INTENSITY, 1, this.softness * this.softness);\n }\n else {\n this.visible = false;\n this.floor.visible = false;\n }\n }\n getIntensity() {\n return this.intensity;\n }\n /**\n * An offset can be specified to move the\n * shadow vertically relative to the bottom of the scene. Positive is up, so\n * values are generally negative. A small offset keeps our shadow from\n * z-fighting with any baked-in shadow plane.\n */\n setOffset(offset) {\n this.floor.position.z = -offset + this.gap();\n }\n gap() {\n return 0.001 * this.maxDimension;\n }\n render(renderer, scene) {\n // this.cameraHelper.visible = false;\n // force the depthMaterial to everything\n scene.overrideMaterial = this.depthMaterial;\n // set renderer clear alpha\n const initialClearAlpha = renderer.getClearAlpha();\n renderer.setClearAlpha(0);\n this.floor.visible = false;\n // disable XR for offscreen rendering\n const xrEnabled = renderer.xr.enabled;\n renderer.xr.enabled = false;\n // render to the render target to get the depths\n const oldRenderTarget = renderer.getRenderTarget();\n renderer.setRenderTarget(this.renderTarget);\n renderer.render(scene, this.camera);\n // and reset the override material\n scene.overrideMaterial = null;\n this.floor.visible = true;\n this.blurShadow(renderer);\n // reset and render the normal scene\n renderer.xr.enabled = xrEnabled;\n renderer.setRenderTarget(oldRenderTarget);\n renderer.setClearAlpha(initialClearAlpha);\n // this.cameraHelper.visible = true;\n }\n blurShadow(renderer) {\n const { camera, horizontalBlurMaterial, verticalBlurMaterial, renderTarget, renderTargetBlur, blurPlane } = this;\n blurPlane.visible = true;\n // blur horizontally and draw in the renderTargetBlur\n blurPlane.material = horizontalBlurMaterial;\n horizontalBlurMaterial.uniforms.h.value = 1 / this.renderTarget.width;\n horizontalBlurMaterial.uniforms.tDiffuse.value = this.renderTarget.texture;\n renderer.setRenderTarget(renderTargetBlur);\n renderer.render(blurPlane, camera);\n // blur vertically and draw in the main renderTarget\n blurPlane.material = verticalBlurMaterial;\n verticalBlurMaterial.uniforms.v.value = 1 / this.renderTarget.height;\n verticalBlurMaterial.uniforms.tDiffuse.value =\n this.renderTargetBlur.texture;\n renderer.setRenderTarget(renderTarget);\n renderer.render(blurPlane, camera);\n blurPlane.visible = false;\n }\n dispose() {\n if (this.renderTarget != null) {\n this.renderTarget.dispose();\n }\n if (this.renderTargetBlur != null) {\n this.renderTargetBlur.dispose();\n }\n this.depthMaterial.dispose();\n this.horizontalBlurMaterial.dispose();\n this.verticalBlurMaterial.dispose();\n this.floor.material.dispose();\n this.floor.geometry.dispose();\n this.blurPlane.geometry.dispose();\n this.removeFromParent();\n }\n}\n//# sourceMappingURL=Shadow.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { AnimationMixer, Box3, Euler, LoopOnce, LoopPingPong, LoopRepeat, Matrix3, NeutralToneMapping, Object3D, PerspectiveCamera, Raycaster, Scene, Sphere, Triangle, Vector2, Vector3 } from 'three';\nimport { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\nimport { reduceVertices } from 'three/examples/jsm/utils/SceneUtils.js';\nimport { $currentGLTF, $model, $originalGltfJson } from '../features/scene-graph.js';\nimport { $nodeFromIndex, $nodeFromPoint } from '../features/scene-graph/model.js';\nimport { $renderer, $scene } from '../model-viewer-base.js';\nimport { normalizeUnit } from '../styles/conversions.js';\nimport { parseExpressions } from '../styles/parsers.js';\nimport { Damper, SETTLING_TIME } from './Damper.js';\nimport { GroundedSkybox } from './GroundedSkybox.js';\nimport { Hotspot } from './Hotspot.js';\nimport { Shadow } from './Shadow.js';\nexport const GROUNDED_SKYBOX_SIZE = 10;\nconst MIN_SHADOW_RATIO = 100;\nexport const IlluminationRole = {\n Primary: 'primary',\n Secondary: 'secondary'\n};\nconst view = new Vector3();\nconst target = new Vector3();\nconst normalWorld = new Vector3();\nconst raycaster = new Raycaster();\nconst vector3 = new Vector3();\nconst ndc = new Vector2();\n/**\n * A THREE.Scene object that takes a Model and CanvasHTMLElement and\n * constructs a framed scene based off of the canvas dimensions.\n * Provides lights and cameras to be used in a renderer.\n */\nexport class ModelScene extends Scene {\n constructor({ canvas, element, width, height }) {\n super();\n this.annotationRenderer = new CSS2DRenderer();\n this.effectRenderer = null;\n this.schemaElement = document.createElement('script');\n this.width = 1;\n this.height = 1;\n this.aspect = 1;\n this.scaleStep = 0;\n this.renderCount = 0;\n this.externalRenderer = null;\n this.appendedAnimations = [];\n this.markedAnimations = [];\n // These default camera values are never used, as they are reset once the\n // model is loaded and framing is computed.\n this.camera = new PerspectiveCamera(45, 1, 0.1, 100);\n this.xrCamera = null;\n this.url = null;\n this.pivot = new Object3D();\n this.target = new Object3D();\n this.animationNames = [];\n this.boundingBox = new Box3();\n this.boundingSphere = new Sphere();\n this.size = new Vector3();\n this.idealAspect = 0;\n this.framedFoVDeg = 0;\n this.shadow = null;\n this.shadowIntensity = 0;\n this.shadowSoftness = 1;\n this.bakedShadows = new Set();\n this.exposure = 1;\n this.toneMapping = NeutralToneMapping;\n this.canScale = true;\n this.isDirty = false;\n this.goalTarget = new Vector3();\n this.targetDamperX = new Damper();\n this.targetDamperY = new Damper();\n this.targetDamperZ = new Damper();\n this._currentGLTF = null;\n this._model = null;\n this.cancelPendingSourceChange = null;\n this.animationsByName = new Map();\n this.currentAnimationAction = null;\n this.groundedSkybox = new GroundedSkybox();\n this.name = 'ModelScene';\n this.element = element;\n this.canvas = canvas;\n // These default camera values are never used, as they are reset once the\n // model is loaded and framing is computed.\n this.camera = new PerspectiveCamera(45, 1, 0.1, 100);\n this.camera.name = 'MainCamera';\n this.add(this.pivot);\n this.pivot.name = 'Pivot';\n this.pivot.add(this.target);\n this.setSize(width, height);\n this.target.name = 'Target';\n this.mixer = new AnimationMixer(this.target);\n const { domElement } = this.annotationRenderer;\n const { style } = domElement;\n style.display = 'none';\n style.pointerEvents = 'none';\n style.position = 'absolute';\n style.top = '0';\n this.element.shadowRoot.querySelector('.default').appendChild(domElement);\n this.schemaElement.setAttribute('type', 'application/ld+json');\n }\n /**\n * Function to create the context lazily, as when there is only one\n * element, the renderer's 3D context can be displayed\n * directly. This extra context is necessary to copy the renderings into when\n * there are more than one.\n */\n get context() {\n return this.canvas.getContext('2d');\n }\n getCamera() {\n return this.xrCamera != null ? this.xrCamera : this.camera;\n }\n queueRender() {\n this.isDirty = true;\n }\n shouldRender() {\n return this.isDirty;\n }\n hasRendered() {\n this.isDirty = false;\n }\n forceRescale() {\n this.scaleStep = -1;\n this.queueRender();\n }\n /**\n * Pass in a THREE.Object3D to be controlled\n * by this model.\n */\n async setObject(model) {\n this.reset();\n this._model = model;\n this.target.add(model);\n await this.setupScene();\n }\n /**\n * Sets the model via URL.\n */\n async setSource(url, progressCallback = () => { }) {\n if (!url || url === this.url) {\n progressCallback(1);\n return;\n }\n this.reset();\n this.url = url;\n if (this.externalRenderer != null) {\n const framingInfo = await this.externalRenderer.load(progressCallback);\n this.boundingSphere.radius = framingInfo.framedRadius;\n this.idealAspect = framingInfo.fieldOfViewAspect;\n return;\n }\n // If we have pending work due to a previous source change in progress,\n // cancel it so that we do not incur a race condition:\n if (this.cancelPendingSourceChange != null) {\n this.cancelPendingSourceChange();\n this.cancelPendingSourceChange = null;\n }\n let gltf;\n try {\n gltf = await new Promise(async (resolve, reject) => {\n this.cancelPendingSourceChange = () => reject();\n try {\n const result = await this.element[$renderer].loader.load(url, this.element, progressCallback);\n resolve(result);\n }\n catch (error) {\n reject(error);\n }\n });\n }\n catch (error) {\n if (error == null) {\n // Loading was cancelled, so silently return\n return;\n }\n throw error;\n }\n this.cancelPendingSourceChange = null;\n this.reset();\n this.url = url;\n this._currentGLTF = gltf;\n if (gltf != null) {\n this._model = gltf.scene;\n this.target.add(gltf.scene);\n }\n const { animations } = gltf;\n const animationsByName = new Map();\n const animationNames = [];\n for (const animation of animations) {\n animationsByName.set(animation.name, animation);\n animationNames.push(animation.name);\n }\n this.animations = animations;\n this.animationsByName = animationsByName;\n this.animationNames = animationNames;\n await this.setupScene();\n }\n async setupScene() {\n this.applyTransform();\n this.updateBoundingBox();\n await this.updateFraming();\n this.updateShadow();\n this.setShadowIntensity(this.shadowIntensity);\n this.setGroundedSkybox();\n }\n reset() {\n this.url = null;\n this.renderCount = 0;\n this.queueRender();\n if (this.shadow != null) {\n this.shadow.setIntensity(0);\n }\n this.bakedShadows.clear();\n const { _model } = this;\n if (_model != null) {\n _model.removeFromParent();\n this._model = null;\n }\n const gltf = this._currentGLTF;\n if (gltf != null) {\n gltf.dispose();\n this._currentGLTF = null;\n }\n if (this.currentAnimationAction != null) {\n this.currentAnimationAction.stop();\n this.currentAnimationAction = null;\n }\n this.mixer.stopAllAction();\n this.mixer.uncacheRoot(this);\n }\n dispose() {\n this.reset();\n if (this.shadow != null) {\n this.shadow.dispose();\n this.shadow = null;\n }\n this.element[$currentGLTF] = null;\n this.element[$originalGltfJson] = null;\n this.element[$model] = null;\n }\n get currentGLTF() {\n return this._currentGLTF;\n }\n /**\n * Updates the ModelScene for a new container size in CSS pixels.\n */\n setSize(width, height) {\n if (this.width === width && this.height === height) {\n return;\n }\n this.width = Math.max(width, 1);\n this.height = Math.max(height, 1);\n this.annotationRenderer.setSize(width, height);\n this.aspect = this.width / this.height;\n if (this.externalRenderer != null) {\n const dpr = window.devicePixelRatio;\n this.externalRenderer.resize(width * dpr, height * dpr);\n }\n this.queueRender();\n }\n markBakedShadow(mesh) {\n mesh.userData.noHit = true;\n this.bakedShadows.add(mesh);\n }\n unmarkBakedShadow(mesh) {\n mesh.userData.noHit = false;\n mesh.visible = true;\n this.bakedShadows.delete(mesh);\n this.boundingBox.expandByObject(mesh);\n }\n findBakedShadows(group) {\n const boundingBox = new Box3();\n group.traverse((object) => {\n const mesh = object;\n if (!mesh.material) {\n return;\n }\n const material = mesh.material;\n if (!material.transparent) {\n return;\n }\n boundingBox.setFromObject(mesh);\n const size = boundingBox.getSize(vector3);\n const minDim = Math.min(size.x, size.y, size.z);\n const maxDim = Math.max(size.x, size.y, size.z);\n if (maxDim < MIN_SHADOW_RATIO * minDim) {\n return;\n }\n this.markBakedShadow(mesh);\n });\n }\n checkBakedShadows() {\n const { min, max } = this.boundingBox;\n const shadowBox = new Box3();\n this.boundingBox.getSize(this.size);\n for (const mesh of this.bakedShadows) {\n shadowBox.setFromObject(mesh);\n if (shadowBox.min.y < min.y + this.size.y / MIN_SHADOW_RATIO &&\n shadowBox.min.x <= min.x && shadowBox.max.x >= max.x &&\n shadowBox.min.z <= min.z && shadowBox.max.z >= max.z) {\n // floor shadow\n continue;\n }\n if (shadowBox.min.z < min.z + this.size.z / MIN_SHADOW_RATIO &&\n shadowBox.min.x <= min.x && shadowBox.max.x >= max.x &&\n shadowBox.min.y <= min.y && shadowBox.max.y >= max.y) {\n // wall shadow\n continue;\n }\n this.unmarkBakedShadow(mesh);\n }\n }\n applyTransform() {\n const { model } = this;\n if (model == null) {\n return;\n }\n const orientation = parseExpressions(this.element.orientation)[0]\n .terms;\n const roll = normalizeUnit(orientation[0]).number;\n const pitch = normalizeUnit(orientation[1]).number;\n const yaw = normalizeUnit(orientation[2]).number;\n model.quaternion.setFromEuler(new Euler(pitch, yaw, roll, 'YXZ'));\n const scale = parseExpressions(this.element.scale)[0]\n .terms;\n model.scale.set(scale[0].number, scale[1].number, scale[2].number);\n }\n updateBoundingBox() {\n const { model } = this;\n if (model == null) {\n return;\n }\n this.target.remove(model);\n this.findBakedShadows(model);\n const bound = (box, vertex) => {\n return box.expandByPoint(vertex);\n };\n this.setBakedShadowVisibility(false);\n this.boundingBox = reduceVertices(model, bound, new Box3());\n // If there's nothing but the baked shadow, then it's not a baked shadow.\n if (this.boundingBox.isEmpty()) {\n this.setBakedShadowVisibility(true);\n this.bakedShadows.forEach((mesh) => this.unmarkBakedShadow(mesh));\n this.boundingBox = reduceVertices(model, bound, new Box3());\n }\n this.checkBakedShadows();\n this.setBakedShadowVisibility();\n this.boundingBox.getSize(this.size);\n this.target.add(model);\n }\n /**\n * Calculates the boundingSphere and idealAspect that allows the 3D\n * object to be framed tightly in a 2D window of any aspect ratio without\n * clipping at any camera orbit. The camera's center target point can be\n * optionally specified. If no center is specified, it defaults to the center\n * of the bounding box, which means asymmetric models will tend to be tight on\n * one side instead of both. Proper choice of center can correct this.\n */\n async updateFraming() {\n const { model } = this;\n if (model == null) {\n return;\n }\n this.target.remove(model);\n this.setBakedShadowVisibility(false);\n const { center } = this.boundingSphere;\n this.element.requestUpdate('cameraTarget');\n await this.element.updateComplete;\n center.copy(this.getTarget());\n const radiusSquared = (value, vertex) => {\n return Math.max(value, center.distanceToSquared(vertex));\n };\n this.boundingSphere.radius =\n Math.sqrt(reduceVertices(model, radiusSquared, 0));\n const horizontalTanFov = (value, vertex) => {\n vertex.sub(center);\n const radiusXZ = Math.sqrt(vertex.x * vertex.x + vertex.z * vertex.z);\n return Math.max(value, radiusXZ / (this.idealCameraDistance() - Math.abs(vertex.y)));\n };\n this.idealAspect = reduceVertices(model, horizontalTanFov, 0) /\n Math.tan((this.framedFoVDeg / 2) * Math.PI / 180);\n this.setBakedShadowVisibility();\n this.target.add(model);\n }\n setBakedShadowVisibility(visible = this.shadowIntensity <= 0) {\n for (const shadow of this.bakedShadows) {\n shadow.visible = visible;\n }\n }\n idealCameraDistance() {\n const halfFovRad = (this.framedFoVDeg / 2) * Math.PI / 180;\n return this.boundingSphere.radius / Math.sin(halfFovRad);\n }\n /**\n * Set's the framedFieldOfView based on the aspect ratio of the window in\n * order to keep the model fully visible at any camera orientation.\n */\n adjustedFoV(fovDeg) {\n const vertical = Math.tan((fovDeg / 2) * Math.PI / 180) *\n Math.max(1, this.idealAspect / this.aspect);\n return 2 * Math.atan(vertical) * 180 / Math.PI;\n }\n getNDC(clientX, clientY) {\n if (this.xrCamera != null) {\n ndc.set(clientX / window.screen.width, clientY / window.screen.height);\n }\n else {\n const rect = this.element.getBoundingClientRect();\n ndc.set((clientX - rect.x) / this.width, (clientY - rect.y) / this.height);\n }\n ndc.multiplyScalar(2).subScalar(1);\n ndc.y *= -1;\n return ndc;\n }\n /**\n * Returns the size of the corresponding canvas element.\n */\n getSize() {\n return { width: this.width, height: this.height };\n }\n setEnvironmentAndSkybox(environment, skybox) {\n if (this.element[$renderer].arRenderer.presentedScene === this) {\n return;\n }\n this.environment = environment;\n this.setBackground(skybox);\n this.queueRender();\n }\n setBackground(skybox) {\n this.groundedSkybox.map = skybox;\n if (this.groundedSkybox.isUsable()) {\n this.target.add(this.groundedSkybox);\n this.background = null;\n }\n else {\n this.target.remove(this.groundedSkybox);\n this.background = skybox;\n }\n }\n farRadius() {\n return this.boundingSphere.radius *\n (this.groundedSkybox.parent != null ? GROUNDED_SKYBOX_SIZE : 1);\n }\n setGroundedSkybox() {\n const heightNode = parseExpressions(this.element.skyboxHeight)[0].terms[0];\n const height = normalizeUnit(heightNode).number;\n const radius = GROUNDED_SKYBOX_SIZE * this.boundingSphere.radius;\n this.groundedSkybox.updateGeometry(height, radius);\n this.groundedSkybox.position.y =\n height - (this.shadow ? 2 * this.shadow.gap() : 0);\n this.setBackground(this.groundedSkybox.map);\n }\n /**\n * Sets the point in model coordinates the model should orbit/pivot around.\n */\n setTarget(modelX, modelY, modelZ) {\n this.goalTarget.set(-modelX, -modelY, -modelZ);\n }\n /**\n * Set the decay time of, affects the speed of target transitions.\n */\n setTargetDamperDecayTime(decayMilliseconds) {\n this.targetDamperX.setDecayTime(decayMilliseconds);\n this.targetDamperY.setDecayTime(decayMilliseconds);\n this.targetDamperZ.setDecayTime(decayMilliseconds);\n }\n /**\n * Gets the point in model coordinates the model should orbit/pivot around.\n */\n getTarget() {\n return this.goalTarget.clone().multiplyScalar(-1);\n }\n /**\n * Gets the current target point, which may not equal the goal returned by\n * getTarget() due to finite input decay smoothing.\n */\n getDynamicTarget() {\n return this.target.position.clone().multiplyScalar(-1);\n }\n /**\n * Shifts the model to the target point immediately instead of easing in.\n */\n jumpToGoal() {\n this.updateTarget(SETTLING_TIME);\n }\n /**\n * This should be called every frame with the frame delta to cause the target\n * to transition to its set point.\n */\n updateTarget(delta) {\n const goal = this.goalTarget;\n const target = this.target.position;\n if (!goal.equals(target)) {\n const normalization = this.boundingSphere.radius / 10;\n let { x, y, z } = target;\n x = this.targetDamperX.update(x, goal.x, delta, normalization);\n y = this.targetDamperY.update(y, goal.y, delta, normalization);\n z = this.targetDamperZ.update(z, goal.z, delta, normalization);\n this.groundedSkybox.position.x = -x;\n this.groundedSkybox.position.z = -z;\n this.target.position.set(x, y, z);\n this.target.updateMatrixWorld();\n this.queueRender();\n return true;\n }\n else {\n return false;\n }\n }\n /**\n * Yaw the +z (front) of the model toward the indicated world coordinates.\n */\n pointTowards(worldX, worldZ) {\n const { x, z } = this.position;\n this.yaw = Math.atan2(worldX - x, worldZ - z);\n }\n get model() {\n return this._model;\n }\n /**\n * Yaw is the scene's orientation about the y-axis, around the rotation\n * center.\n */\n set yaw(radiansY) {\n this.pivot.rotation.y = radiansY;\n this.groundedSkybox.rotation.y = -radiansY;\n this.queueRender();\n }\n get yaw() {\n return this.pivot.rotation.y;\n }\n set animationTime(value) {\n this.mixer.setTime(value);\n this.queueShadowRender();\n }\n get animationTime() {\n if (this.currentAnimationAction != null) {\n const loopCount = Math.max(this.currentAnimationAction._loopCount, 0);\n if (this.currentAnimationAction.loop === LoopPingPong &&\n (loopCount & 1) === 1) {\n return this.duration - this.currentAnimationAction.time;\n }\n else {\n return this.currentAnimationAction.time;\n }\n }\n return 0;\n }\n set animationTimeScale(value) {\n this.mixer.timeScale = value;\n }\n get animationTimeScale() {\n return this.mixer.timeScale;\n }\n get duration() {\n if (this.currentAnimationAction != null &&\n this.currentAnimationAction.getClip()) {\n return this.currentAnimationAction.getClip().duration;\n }\n return 0;\n }\n get hasActiveAnimation() {\n return this.currentAnimationAction != null;\n }\n /**\n * Plays an animation if there are any associated with the current model.\n * Accepts an optional string name of an animation to play. If no name is\n * provided, or if no animation is found by the given name, always falls back\n * to playing the first animation.\n */\n playAnimation(name = null, crossfadeTime = 0, loopMode = LoopRepeat, repetitionCount = Infinity) {\n if (this._currentGLTF == null) {\n return;\n }\n const { animations } = this;\n if (animations == null || animations.length === 0) {\n return;\n }\n let animationClip = null;\n if (name != null) {\n animationClip = this.animationsByName.get(name);\n if (animationClip == null) {\n const parsedAnimationIndex = parseInt(name);\n if (!isNaN(parsedAnimationIndex) && parsedAnimationIndex >= 0 &&\n parsedAnimationIndex < animations.length) {\n animationClip = animations[parsedAnimationIndex];\n }\n }\n }\n if (animationClip == null) {\n animationClip = animations[0];\n }\n try {\n const { currentAnimationAction: lastAnimationAction } = this;\n const action = this.mixer.clipAction(animationClip, this);\n // Reset animationAction timeScale\n if (action.timeScale != this.element.timeScale) {\n action.timeScale = this.element.timeScale;\n }\n this.currentAnimationAction = action;\n if (this.element.paused) {\n this.mixer.stopAllAction();\n }\n else {\n action.paused = false;\n if (lastAnimationAction != null && action !== lastAnimationAction) {\n action.crossFadeFrom(lastAnimationAction, crossfadeTime, false);\n }\n else if (this.animationTimeScale > 0 &&\n this.animationTime == this.duration) {\n // This is a workaround for what I believe is a three.js bug.\n this.animationTime = 0;\n }\n }\n action.setLoop(loopMode, repetitionCount);\n action.enabled = true;\n action.clampWhenFinished = true;\n action.play();\n }\n catch (error) {\n console.error(error);\n }\n }\n appendAnimation(name = '', loopMode = LoopRepeat, repetitionCount = Infinity, weight = 1, timeScale = 1, fade = false, warp = false, relativeWarp = true, time = null, needsToStop = false) {\n if (this._currentGLTF == null || name === this.element.animationName) {\n return;\n }\n const { animations } = this;\n if (animations == null || animations.length === 0) {\n return;\n }\n let animationClip = null;\n const defaultFade = 1.25;\n if (name) {\n animationClip = this.animationsByName.get(name);\n }\n if (animationClip == null) {\n return;\n }\n // validate function parameters\n if (typeof repetitionCount === 'string') {\n if (!isNaN(repetitionCount)) {\n repetitionCount = Math.max(parseInt(repetitionCount), 1);\n }\n else {\n repetitionCount = Infinity;\n console.warn('Invalid repetitionCount value, repetitionCount is set to Infinity');\n }\n }\n else if (typeof repetitionCount === 'number' && repetitionCount < 1) {\n repetitionCount = 1;\n }\n if (repetitionCount === 1 && loopMode !== LoopOnce) {\n loopMode = LoopOnce;\n }\n if (typeof weight === 'string') {\n if (!isNaN(weight)) {\n weight = parseFloat(weight);\n }\n else {\n weight = 1;\n console.warn('Invalid weight value, weight is set to 1');\n }\n }\n if (typeof timeScale === 'string') {\n if (!isNaN(timeScale)) {\n timeScale = parseFloat(timeScale);\n }\n else {\n timeScale = 1;\n console.warn('Invalid timeScale value, timeScale is set to 1');\n }\n }\n if (typeof fade === 'string') {\n // @ts-ignore: Unreachable code error\n if (fade.toLowerCase().trim() === 'true') {\n fade = true;\n // @ts-ignore: Unreachable code error\n }\n else if (fade.toLowerCase().trim() === 'false') {\n fade = false;\n }\n else if (!isNaN(fade)) {\n fade = parseFloat(fade);\n }\n else {\n fade = false;\n console.warn('Invalid fade value, fade is set to false');\n }\n }\n if (typeof warp === 'string') {\n // @ts-ignore: Unreachable code error\n if (warp.toLowerCase().trim() === 'true') {\n warp = true;\n // @ts-ignore: Unreachable code error\n }\n else if (warp.toLowerCase().trim() === 'false') {\n warp = false;\n }\n else if (!isNaN(warp)) {\n warp = parseFloat(warp);\n }\n else {\n warp = false;\n console.warn('Invalid warp value, warp is set to false');\n }\n }\n if (typeof time === 'string') {\n if (!isNaN(time)) {\n time = parseFloat(time);\n }\n }\n try {\n const action = this.mixer.existingAction(animationClip) ||\n this.mixer.clipAction(animationClip, this);\n const currentTimeScale = action.timeScale;\n if (needsToStop && this.appendedAnimations.includes(name)) {\n if (!this.markedAnimations.map(e => e.name).includes(name)) {\n this.markedAnimations.push({ name, loopMode, repetitionCount });\n }\n }\n if (typeof time === 'number') {\n action.time = Math.min(Math.max(time, 0), animationClip.duration);\n }\n if (typeof fade === 'boolean' && fade) {\n action.fadeIn(defaultFade);\n }\n else if (typeof fade === 'number') {\n action.fadeIn(Math.max(fade, 0));\n }\n else {\n if (weight >= 0) {\n action.weight = Math.min(Math.max(weight, 0), 1);\n }\n }\n if (typeof warp === 'boolean' && warp) {\n action.warp(relativeWarp ? currentTimeScale : 0, timeScale, defaultFade);\n }\n else if (typeof warp === 'number') {\n action.warp(relativeWarp ? currentTimeScale : 0, timeScale, Math.max(warp, 0));\n }\n else {\n action.timeScale = timeScale;\n }\n if (!action.isRunning()) {\n if (action.time == animationClip.duration) {\n action.stop();\n }\n action.setLoop(loopMode, repetitionCount);\n action.paused = false;\n action.enabled = true;\n action.clampWhenFinished = true;\n action.play();\n }\n if (!this.appendedAnimations.includes(name)) {\n this.element[$scene].appendedAnimations.push(name);\n }\n }\n catch (error) {\n console.error(error);\n }\n }\n detachAnimation(name = '', fade = true) {\n if (this._currentGLTF == null || name === this.element.animationName) {\n return;\n }\n const { animations } = this;\n if (animations == null || animations.length === 0) {\n return;\n }\n let animationClip = null;\n const defaultFade = 1.5;\n if (name) {\n animationClip = this.animationsByName.get(name);\n }\n if (animationClip == null) {\n return;\n }\n if (typeof fade === 'string') {\n // @ts-ignore: Unreachable code error\n if (fade.toLowerCase().trim() === 'true') {\n fade = true;\n // @ts-ignore: Unreachable code error\n }\n else if (fade.toLowerCase().trim() === 'false') {\n fade = false;\n }\n else if (!isNaN(fade)) {\n fade = parseFloat(fade);\n }\n else {\n fade = true;\n console.warn('Invalid fade value, fade is set to true');\n }\n }\n try {\n const action = this.mixer.existingAction(animationClip) ||\n this.mixer.clipAction(animationClip, this);\n if (typeof fade === 'boolean' && fade) {\n action.fadeOut(defaultFade);\n }\n else if (typeof fade === 'number') {\n action.fadeOut(Math.max(fade, 0));\n }\n else {\n action.stop();\n }\n const result = this.element[$scene].appendedAnimations.filter(i => i !== name);\n this.element[$scene].appendedAnimations = result;\n }\n catch (error) {\n console.error(error);\n }\n }\n updateAnimationLoop(name = '', loopMode = LoopRepeat, repetitionCount = Infinity) {\n if (this._currentGLTF == null || name === this.element.animationName) {\n return;\n }\n const { animations } = this;\n if (animations == null || animations.length === 0) {\n return;\n }\n let animationClip = null;\n if (name) {\n animationClip = this.animationsByName.get(name);\n }\n if (animationClip == null) {\n return;\n }\n try {\n const action = this.mixer.existingAction(animationClip) ||\n this.mixer.clipAction(animationClip, this);\n action.stop();\n action.setLoop(loopMode, repetitionCount);\n action.play();\n }\n catch (error) {\n console.error(error);\n }\n }\n stopAnimation() {\n this.currentAnimationAction = null;\n this.mixer.stopAllAction();\n }\n updateAnimation(step) {\n this.mixer.update(step);\n this.queueShadowRender();\n }\n subscribeMixerEvent(event, callback) {\n this.mixer.addEventListener(event, callback);\n }\n /**\n * Call if the object has been changed in such a way that the shadow's\n * shape has changed (not a rotation about the Y axis).\n */\n updateShadow() {\n const shadow = this.shadow;\n if (shadow != null) {\n const side = this.element.arPlacement === 'wall' ? 'back' :\n this.element.arPlacement === 'ceiling' ? 'top' : 'bottom';\n shadow.setScene(this, this.shadowSoftness, side);\n shadow.needsUpdate = true;\n }\n }\n renderShadow(renderer) {\n const shadow = this.shadow;\n if (shadow != null && shadow.needsUpdate == true) {\n shadow.render(renderer, this);\n shadow.needsUpdate = false;\n }\n }\n queueShadowRender() {\n if (this.shadow != null) {\n this.shadow.needsUpdate = true;\n }\n }\n /**\n * Sets the shadow's intensity, lazily creating the shadow as necessary.\n */\n setShadowIntensity(shadowIntensity) {\n this.shadowIntensity = shadowIntensity;\n if (this._currentGLTF == null) {\n return;\n }\n this.setBakedShadowVisibility();\n if (shadowIntensity <= 0 && this.shadow == null) {\n return;\n }\n if (this.shadow == null) {\n const side = this.element.arPlacement === 'wall' ? 'back' : 'bottom';\n this.shadow = new Shadow(this, this.shadowSoftness, side);\n }\n this.shadow.setIntensity(shadowIntensity);\n }\n /**\n * Sets the shadow's softness by mapping a [0, 1] softness parameter to\n * the shadow's resolution. This involves reallocation, so it should not\n * be changed frequently. Softer shadows are cheaper to render.\n */\n setShadowSoftness(softness) {\n this.shadowSoftness = softness;\n const shadow = this.shadow;\n if (shadow != null) {\n shadow.setSoftness(softness);\n }\n }\n /**\n * Shift the floor vertically from the bottom of the model's bounding box\n * by offset (should generally be negative).\n */\n setShadowOffset(offset) {\n const shadow = this.shadow;\n if (shadow != null) {\n shadow.setOffset(offset);\n }\n }\n getHit(object = this) {\n const hits = raycaster.intersectObject(object, true);\n return hits.find((hit) => hit.object.visible && !hit.object.userData.noHit);\n }\n hitFromController(controller, object = this) {\n raycaster.setFromXRController(controller);\n return this.getHit(object);\n }\n hitFromPoint(ndcPosition, object = this) {\n raycaster.setFromCamera(ndcPosition, this.getCamera());\n return this.getHit(object);\n }\n /**\n * This method returns the world position, model-space normal and texture\n * coordinate of the point on the mesh corresponding to the input pixel\n * coordinates given relative to the model-viewer element. If the mesh\n * is not hit, the result is null.\n */\n positionAndNormalFromPoint(ndcPosition, object = this) {\n var _a;\n const hit = this.hitFromPoint(ndcPosition, object);\n if (hit == null) {\n return null;\n }\n const position = hit.point;\n const normal = hit.face != null ?\n hit.face.normal.clone().applyNormalMatrix(new Matrix3().getNormalMatrix(hit.object.matrixWorld)) :\n raycaster.ray.direction.clone().multiplyScalar(-1);\n const uv = (_a = hit.uv) !== null && _a !== void 0 ? _a : null;\n return { position, normal, uv };\n }\n /**\n * This method returns a dynamic hotspot ID string of the point on the\n * mesh corresponding to the input pixel coordinates given relative to the\n * model-viewer element. The ID string can be used in the data-surface\n * attribute of the hotspot to make it follow this point on the surface\n * even as the model animates. If the mesh is not hit, the result is null.\n */\n surfaceFromPoint(ndcPosition, object = this) {\n const model = this.element.model;\n if (model == null) {\n return null;\n }\n const hit = this.hitFromPoint(ndcPosition, object);\n if (hit == null || hit.face == null) {\n return null;\n }\n const node = model[$nodeFromPoint](hit);\n const { meshes, primitives } = node.mesh.userData.associations;\n const va = new Vector3();\n const vb = new Vector3();\n const vc = new Vector3();\n const { a, b, c } = hit.face;\n const mesh = hit.object;\n mesh.getVertexPosition(a, va);\n mesh.getVertexPosition(b, vb);\n mesh.getVertexPosition(c, vc);\n const tri = new Triangle(va, vb, vc);\n const uvw = new Vector3();\n tri.getBarycoord(mesh.worldToLocal(hit.point), uvw);\n return `${meshes} ${primitives} ${a} ${b} ${c} ${uvw.x.toFixed(3)} ${uvw.y.toFixed(3)} ${uvw.z.toFixed(3)}`;\n }\n /**\n * The following methods are for operating on the set of Hotspot objects\n * attached to the scene. These come from DOM elements, provided to slots\n * by the Annotation Mixin.\n */\n addHotspot(hotspot) {\n this.target.add(hotspot);\n // This happens automatically in render(), but we do it early so that\n // the slots appear in the shadow DOM and the elements get attached,\n // allowing us to dispatch events on them.\n this.annotationRenderer.domElement.appendChild(hotspot.element);\n this.updateSurfaceHotspot(hotspot);\n }\n removeHotspot(hotspot) {\n this.target.remove(hotspot);\n }\n /**\n * Helper method to apply a function to all hotspots.\n */\n forHotspots(func) {\n const { children } = this.target;\n for (let i = 0, l = children.length; i < l; i++) {\n const hotspot = children[i];\n if (hotspot instanceof Hotspot) {\n func(hotspot);\n }\n }\n }\n /**\n * Lazy initializer for surface hotspots - will only run once.\n */\n updateSurfaceHotspot(hotspot) {\n if (hotspot.surface == null || this.element.model == null) {\n return;\n }\n const nodes = parseExpressions(hotspot.surface)[0].terms;\n if (nodes.length != 8) {\n console.warn(hotspot.surface + ' does not have exactly 8 numbers.');\n return;\n }\n const primitiveNode = this.element.model[$nodeFromIndex](nodes[0].number, nodes[1].number);\n if (primitiveNode == null) {\n console.warn(hotspot.surface +\n ' does not match a node/primitive in this glTF! Skipping this hotspot.');\n return;\n }\n const numVert = primitiveNode.mesh.geometry.attributes.position.count;\n const tri = new Vector3(nodes[2].number, nodes[3].number, nodes[4].number);\n if (tri.x >= numVert || tri.y >= numVert || tri.z >= numVert) {\n console.warn(hotspot.surface +\n ' vertex indices out of range in this glTF! Skipping this hotspot.');\n return;\n }\n const bary = new Vector3(nodes[5].number, nodes[6].number, nodes[7].number);\n hotspot.mesh = primitiveNode.mesh;\n hotspot.tri = tri;\n hotspot.bary = bary;\n hotspot.updateSurface();\n }\n /**\n * Update positions of surface hotspots to follow model animation.\n */\n animateSurfaceHotspots() {\n if (this.element.paused) {\n return;\n }\n this.forHotspots((hotspot) => {\n hotspot.updateSurface();\n });\n }\n /**\n * Update the CSS visibility of the hotspots based on whether their\n * normals point toward the camera.\n */\n updateHotspotsVisibility(viewerPosition) {\n this.forHotspots((hotspot) => {\n view.copy(viewerPosition);\n target.setFromMatrixPosition(hotspot.matrixWorld);\n view.sub(target);\n normalWorld.copy(hotspot.normal)\n .transformDirection(this.target.matrixWorld);\n if (view.dot(normalWorld) < 0) {\n hotspot.hide();\n }\n else {\n hotspot.show();\n }\n });\n }\n /**\n * Rotate all hotspots to an absolute orientation given by the input\n * number of radians. Zero returns them to upright.\n */\n orientHotspots(radians) {\n this.forHotspots((hotspot) => {\n hotspot.orient(radians);\n });\n }\n /**\n * Set the rendering visibility of all hotspots. This is used to hide them\n * during transitions and such.\n */\n setHotspotsVisibility(visible) {\n this.forHotspots((hotspot) => {\n hotspot.visible = visible;\n });\n }\n updateSchema(src) {\n var _a;\n const { schemaElement, element } = this;\n const { alt, poster, iosSrc } = element;\n if (src != null) {\n const encoding = [{\n '@type': 'MediaObject',\n contentUrl: src,\n encodingFormat: ((_a = src.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'gltf' ?\n 'model/gltf+json' :\n 'model/gltf-binary'\n }];\n if (iosSrc) {\n encoding.push({\n '@type': 'MediaObject',\n contentUrl: iosSrc,\n encodingFormat: 'model/vnd.usdz+zip'\n });\n }\n const structuredData = {\n '@context': 'http://schema.org/',\n '@type': '3DModel',\n image: poster !== null && poster !== void 0 ? poster : undefined,\n name: alt !== null && alt !== void 0 ? alt : undefined,\n encoding\n };\n schemaElement.textContent = JSON.stringify(structuredData);\n document.head.appendChild(schemaElement);\n }\n else if (schemaElement.parentElement != null) {\n schemaElement.parentElement.removeChild(schemaElement);\n }\n }\n}\n//# sourceMappingURL=ModelScene.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { clamp } from '../utilities.js';\n/**\n * ProgressTracker is an event emitter that helps to track the ongoing progress\n * of many simultaneous actions.\n *\n * ProgressTracker reports progress activity in the form of a progress event.\n * The event.detail.totalProgress value indicates the elapsed progress of all\n * activities being tracked by the ProgressTracker.\n *\n * The value of totalProgress is a number that progresses from 0 to 1. The\n * ProgressTracker allows for the lazy accumulation of tracked actions, so the\n * total progress represents an abstract, non-absolute progress towards the\n * completion of all currently tracked events.\n *\n * When all currently tracked activities are finished, the ProgressTracker\n * emits one final progress event and then resets the list of its currently\n * tracked activities. This means that from an observer's perspective,\n * ongoing activities will accumulate and collectively contribute to the notion\n * of total progress until all currently tracked ongoing activities have\n * completed.\n */\nexport class ProgressTracker extends EventTarget {\n constructor() {\n super(...arguments);\n this.ongoingActivities = new Set();\n this.totalProgress = 0;\n }\n /**\n * The total number of activities currently being tracked.\n */\n get ongoingActivityCount() {\n return this.ongoingActivities.size;\n }\n /**\n * Registers a new activity to be tracked by the progress tracker. The method\n * returns a special callback that should be invoked whenever new progress is\n * ready to be reported. The progress should be reported as a value between 0\n * and 1, where 0 would represent the beginning of the action and 1 would\n * represent its completion.\n *\n * There is no built-in notion of a time-out for ongoing activities, so once\n * an ongoing activity is begun, it is up to the consumer of this API to\n * update the progress until that activity is no longer ongoing.\n *\n * Progress is only allowed to move forward for any given activity. If a lower\n * progress is reported than the previously reported progress, it will be\n * ignored.\n */\n beginActivity(reason) {\n const activity = { progress: 0, completed: false };\n this.ongoingActivities.add(activity);\n if (this.ongoingActivityCount === 1) {\n // Announce the first progress event (which should always be 0 / 1\n // total progress):\n this.announceTotalProgress(activity, 0, reason);\n }\n return (progress) => {\n let nextProgress;\n nextProgress = Math.max(clamp(progress, 0, 1), activity.progress);\n if (nextProgress !== activity.progress) {\n this.announceTotalProgress(activity, nextProgress, reason);\n }\n return activity.progress;\n };\n }\n announceTotalProgress(updatedActivity, nextProgress, reason) {\n let progressLeft = 0;\n let completedActivities = 0;\n if (nextProgress == 1.0)\n updatedActivity.completed = true;\n for (const activity of this.ongoingActivities) {\n const { progress } = activity;\n progressLeft += 1.0 - progress;\n if (activity.completed) {\n completedActivities++;\n }\n }\n const lastProgress = updatedActivity.progress;\n updatedActivity.progress = nextProgress;\n // Advance the total progress by the fraction of total remaining progress\n // due to this activity.\n this.totalProgress += (nextProgress - lastProgress) *\n (1.0 - this.totalProgress) / progressLeft;\n const totalProgress = completedActivities === this.ongoingActivityCount ?\n 1.0 :\n this.totalProgress;\n this.dispatchEvent(new CustomEvent('progress', { detail: { totalProgress, reason } }));\n if (completedActivities === this.ongoingActivityCount) {\n this.totalProgress = 0.0;\n this.ongoingActivities.clear();\n }\n }\n}\n//# sourceMappingURL=progress-tracker.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;\nimport { ReactiveElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { HAS_INTERSECTION_OBSERVER, HAS_RESIZE_OBSERVER } from './constants.js';\nimport { $updateEnvironment } from './features/environment.js';\nimport { makeTemplate } from './template.js';\nimport { $evictionPolicy, CachingGLTFLoader } from './three-components/CachingGLTFLoader.js';\nimport { ModelScene } from './three-components/ModelScene.js';\nimport { Renderer } from './three-components/Renderer.js';\nimport { clamp, debounce } from './utilities.js';\nimport { ProgressTracker } from './utilities/progress-tracker.js';\nconst CLEAR_MODEL_TIMEOUT_MS = 10;\nconst FALLBACK_SIZE_UPDATE_THRESHOLD_MS = 50;\nconst ANNOUNCE_MODEL_VISIBILITY_DEBOUNCE_THRESHOLD = 0;\nconst UNSIZED_MEDIA_WIDTH = 300;\nconst UNSIZED_MEDIA_HEIGHT = 150;\nexport const blobCanvas = document.createElement('canvas');\nconst $fallbackResizeHandler = Symbol('fallbackResizeHandler');\nconst $defaultAriaLabel = Symbol('defaultAriaLabel');\nconst $resizeObserver = Symbol('resizeObserver');\nconst $clearModelTimeout = Symbol('clearModelTimeout');\nconst $onContextLost = Symbol('onContextLost');\nconst $loaded = Symbol('loaded');\nconst $status = Symbol('status');\nconst $onFocus = Symbol('onFocus');\nconst $onBlur = Symbol('onBlur');\nexport const $updateSize = Symbol('updateSize');\nexport const $intersectionObserver = Symbol('intersectionObserver');\nexport const $isElementInViewport = Symbol('isElementInViewport');\nexport const $announceModelVisibility = Symbol('announceModelVisibility');\nexport const $ariaLabel = Symbol('ariaLabel');\nexport const $altDefaulted = Symbol('altDefaulted');\nexport const $statusElement = Symbol('statusElement');\nexport const $updateStatus = Symbol('updateStatus');\nexport const $loadedTime = Symbol('loadedTime');\nexport const $updateSource = Symbol('updateSource');\nexport const $markLoaded = Symbol('markLoaded');\nexport const $container = Symbol('container');\nexport const $userInputElement = Symbol('input');\nexport const $canvas = Symbol('canvas');\nexport const $scene = Symbol('scene');\nexport const $needsRender = Symbol('needsRender');\nexport const $tick = Symbol('tick');\nexport const $onModelLoad = Symbol('onModelLoad');\nexport const $onResize = Symbol('onResize');\nexport const $renderer = Symbol('renderer');\nexport const $progressTracker = Symbol('progressTracker');\nexport const $getLoaded = Symbol('getLoaded');\nexport const $getModelIsVisible = Symbol('getModelIsVisible');\nexport const $shouldAttemptPreload = Symbol('shouldAttemptPreload');\nexport const toVector3D = (v) => {\n return {\n x: v.x,\n y: v.y,\n z: v.z,\n toString() {\n return `${this.x}m ${this.y}m ${this.z}m`;\n }\n };\n};\nexport const toVector2D = (v) => {\n return {\n u: v.x,\n v: v.y,\n toString() {\n return `${this.u} ${this.v}`;\n }\n };\n};\n/**\n * Definition for a basic element.\n */\nexport default class ModelViewerElementBase extends ReactiveElement {\n static get is() {\n return 'model-viewer';\n }\n /** @export */\n static set modelCacheSize(value) {\n CachingGLTFLoader[$evictionPolicy].evictionThreshold = value;\n }\n /** @export */\n static get modelCacheSize() {\n return CachingGLTFLoader[$evictionPolicy].evictionThreshold;\n }\n /** @export */\n static set minimumRenderScale(value) {\n if (value > 1) {\n console.warn(' minimumRenderScale has been clamped to a maximum value of 1.');\n }\n if (value <= 0) {\n console.warn(' minimumRenderScale has been clamped to a minimum value of 0.25.');\n }\n Renderer.singleton.minScale = value;\n }\n /** @export */\n static get minimumRenderScale() {\n return Renderer.singleton.minScale;\n }\n /** @export */\n get loaded() {\n return this[$getLoaded]();\n }\n get [(_a = $isElementInViewport, _b = $loaded, _c = $loadedTime, _d = $status, _e = $clearModelTimeout, _f = $fallbackResizeHandler, _g = $announceModelVisibility, _h = $resizeObserver, _j = $intersectionObserver, _k = $progressTracker, $renderer)]() {\n return Renderer.singleton;\n }\n /** @export */\n get modelIsVisible() {\n return this[$getModelIsVisible]();\n }\n /**\n * Creates a new ModelViewerElement.\n */\n constructor() {\n super();\n this.alt = null;\n this.src = null;\n this.withCredentials = false;\n /**\n * Generates a 3D model schema https://schema.org/3DModel associated with\n * the loaded src and inserts it into the header of the page for search\n * engines to crawl.\n */\n this.generateSchema = false;\n this[_a] = false;\n this[_b] = false;\n this[_c] = 0;\n this[_d] = '';\n this[_e] = null;\n this[_f] = debounce(() => {\n const boundingRect = this.getBoundingClientRect();\n this[$updateSize](boundingRect);\n }, FALLBACK_SIZE_UPDATE_THRESHOLD_MS);\n this[_g] = debounce((oldVisibility) => {\n const newVisibility = this.modelIsVisible;\n if (newVisibility !== oldVisibility) {\n this.dispatchEvent(new CustomEvent('model-visibility', { detail: { visible: newVisibility } }));\n }\n }, ANNOUNCE_MODEL_VISIBILITY_DEBOUNCE_THRESHOLD);\n this[_h] = null;\n this[_j] = null;\n this[_k] = new ProgressTracker();\n this[_l] = () => {\n this[$statusElement].textContent = this[$status];\n };\n this[_m] = () => {\n this[$statusElement].textContent = '';\n };\n this[_o] = (event) => {\n this.dispatchEvent(new CustomEvent('error', { detail: { type: 'webglcontextlost', sourceError: event.sourceEvent } }));\n };\n this.attachShadow({ mode: 'open' });\n const shadowRoot = this.shadowRoot;\n makeTemplate(shadowRoot);\n this[$container] = shadowRoot.querySelector('.container');\n this[$userInputElement] =\n shadowRoot.querySelector('.userInput');\n this[$canvas] = shadowRoot.querySelector('canvas');\n this[$statusElement] =\n shadowRoot.querySelector('#status');\n this[$defaultAriaLabel] =\n this[$userInputElement].getAttribute('aria-label');\n // Because of potential race conditions related to invoking the constructor\n // we only use the bounding rect to set the initial size if the element is\n // already connected to the document:\n let width, height;\n if (this.isConnected) {\n const rect = this.getBoundingClientRect();\n width = rect.width;\n height = rect.height;\n }\n else {\n width = UNSIZED_MEDIA_WIDTH;\n height = UNSIZED_MEDIA_HEIGHT;\n }\n // Create the underlying ModelScene.\n this[$scene] =\n new ModelScene({ canvas: this[$canvas], element: this, width, height });\n // Update initial size on microtask timing so that subclasses have a\n // chance to initialize\n Promise.resolve().then(() => {\n this[$updateSize](this.getBoundingClientRect());\n });\n if (HAS_RESIZE_OBSERVER) {\n // Set up a resize observer so we can scale our canvas\n // if our changes\n this[$resizeObserver] =\n new ResizeObserver((entries) => {\n // Don't resize anything if in AR mode; otherwise the canvas\n // scaling to fullscreen on entering AR will clobber the flat/2d\n // dimensions of the element.\n if (this[$renderer].isPresenting) {\n return;\n }\n for (let entry of entries) {\n if (entry.target === this) {\n this[$updateSize](entry.contentRect);\n }\n }\n });\n }\n if (HAS_INTERSECTION_OBSERVER) {\n this[$intersectionObserver] = new IntersectionObserver(entries => {\n for (let entry of entries) {\n if (entry.target === this) {\n const oldVisibility = this.modelIsVisible;\n this[$isElementInViewport] = entry.isIntersecting;\n this[$announceModelVisibility](oldVisibility);\n if (this[$isElementInViewport] && !this.loaded) {\n this[$updateSource]();\n }\n }\n }\n }, {\n root: null,\n // We used to have margin here, but it was causing animated models below\n // the fold to steal the frame budget. Weirder still, it would also\n // cause input events to be swallowed, sometimes for seconds on the\n // model above the fold, but only when the animated model was completely\n // below. Setting this margin to zero fixed it.\n rootMargin: '0px',\n // With zero threshold, an element adjacent to but not intersecting the\n // viewport will be reported as intersecting, which will cause\n // unnecessary rendering. Any slight positive threshold alleviates this.\n threshold: 0.00001,\n });\n }\n else {\n // If there is no intersection observer, then all models should be visible\n // at all times:\n this[$isElementInViewport] = true;\n }\n }\n connectedCallback() {\n super.connectedCallback && super.connectedCallback();\n if (HAS_RESIZE_OBSERVER) {\n this[$resizeObserver].observe(this);\n }\n else {\n self.addEventListener('resize', this[$fallbackResizeHandler]);\n }\n if (HAS_INTERSECTION_OBSERVER) {\n this[$intersectionObserver].observe(this);\n }\n this.addEventListener('focus', this[$onFocus]);\n this.addEventListener('blur', this[$onBlur]);\n const renderer = this[$renderer];\n renderer.addEventListener('contextlost', this[$onContextLost]);\n renderer.registerScene(this[$scene]);\n if (this[$clearModelTimeout] != null) {\n self.clearTimeout(this[$clearModelTimeout]);\n this[$clearModelTimeout] = null;\n // Force an update in case the model has been evicted from our GLTF cache\n // @see https://lit-element.polymer-project.org/guide/lifecycle#requestupdate\n this.requestUpdate('src', null);\n }\n }\n disconnectedCallback() {\n super.disconnectedCallback && super.disconnectedCallback();\n if (HAS_RESIZE_OBSERVER) {\n this[$resizeObserver].unobserve(this);\n }\n else {\n self.removeEventListener('resize', this[$fallbackResizeHandler]);\n }\n if (HAS_INTERSECTION_OBSERVER) {\n this[$intersectionObserver].unobserve(this);\n }\n this.removeEventListener('focus', this[$onFocus]);\n this.removeEventListener('blur', this[$onBlur]);\n const renderer = this[$renderer];\n renderer.removeEventListener('contextlost', this[$onContextLost]);\n renderer.unregisterScene(this[$scene]);\n this[$clearModelTimeout] = self.setTimeout(() => {\n this[$scene].dispose();\n this[$clearModelTimeout] = null;\n }, CLEAR_MODEL_TIMEOUT_MS);\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n // NOTE(cdata): If a property changes from values A -> B -> A in the space\n // of a microtask, LitElement/UpdatingElement will notify of a change even\n // though the value has effectively not changed, so we need to check to make\n // sure that the value has actually changed before changing the loaded flag.\n if (changedProperties.has('src')) {\n if (this.src == null) {\n this[$loaded] = false;\n this[$loadedTime] = 0;\n this[$scene].reset();\n }\n else if (this.src !== this[$scene].url) {\n this[$loaded] = false;\n this[$loadedTime] = 0;\n this[$updateSource]();\n }\n }\n if (changedProperties.has('alt')) {\n this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]);\n }\n if (changedProperties.has('generateSchema')) {\n if (this.generateSchema) {\n this[$scene].updateSchema(this.src);\n }\n else {\n this[$scene].updateSchema(null);\n }\n }\n }\n /** @export */\n toDataURL(type, encoderOptions) {\n return this[$renderer]\n .displayCanvas(this[$scene])\n .toDataURL(type, encoderOptions);\n }\n /** @export */\n async toBlob(options) {\n const mimeType = options ? options.mimeType : undefined;\n const qualityArgument = options ? options.qualityArgument : undefined;\n const useIdealAspect = options ? options.idealAspect : undefined;\n const { width, height, idealAspect, aspect } = this[$scene];\n const { dpr, scaleFactor } = this[$renderer];\n let outputWidth = width * scaleFactor * dpr;\n let outputHeight = height * scaleFactor * dpr;\n let offsetX = 0;\n let offsetY = 0;\n if (useIdealAspect === true) {\n if (idealAspect > aspect) {\n const oldHeight = outputHeight;\n outputHeight = Math.round(outputWidth / idealAspect);\n offsetY = (oldHeight - outputHeight) / 2;\n }\n else {\n const oldWidth = outputWidth;\n outputWidth = Math.round(outputHeight * idealAspect);\n offsetX = (oldWidth - outputWidth) / 2;\n }\n }\n blobCanvas.width = outputWidth;\n blobCanvas.height = outputHeight;\n try {\n return new Promise(async (resolve, reject) => {\n blobCanvas.getContext('2d').drawImage(this[$renderer].displayCanvas(this[$scene]), offsetX, offsetY, outputWidth, outputHeight, 0, 0, outputWidth, outputHeight);\n blobCanvas.toBlob((blob) => {\n if (!blob) {\n return reject(new Error('Unable to retrieve canvas blob'));\n }\n resolve(blob);\n }, mimeType, qualityArgument);\n });\n }\n finally {\n this[$updateSize]({ width, height });\n }\n ;\n }\n /**\n * Registers a new EffectComposer as the main rendering pipeline,\n * instead of the default ThreeJs renderer.\n * This method also calls setRenderer, setMainScene, and setMainCamera on\n * your effectComposer.\n * @param effectComposer An EffectComposer from `pmndrs/postprocessing`\n */\n registerEffectComposer(effectComposer) {\n effectComposer.setRenderer(this[$renderer].threeRenderer);\n effectComposer.setMainCamera(this[$scene].getCamera());\n effectComposer.setMainScene(this[$scene]);\n this[$scene].effectRenderer = effectComposer;\n }\n /**\n * Removes the registered EffectComposer\n */\n unregisterEffectComposer() {\n this[$scene].effectRenderer = null;\n }\n registerRenderer(renderer) {\n this[$scene].externalRenderer = renderer;\n }\n unregisterRenderer() {\n this[$scene].externalRenderer = null;\n }\n get [$ariaLabel]() {\n return this[$altDefaulted];\n }\n get [$altDefaulted]() {\n return (this.alt == null || this.alt === 'null') ? this[$defaultAriaLabel] :\n this.alt;\n }\n // NOTE(cdata): Although this may seem extremely redundant, it is required in\n // order to support overloading when TypeScript is compiled to ES5\n // @see https://github.com/Polymer/lit-element/pull/745\n // @see https://github.com/microsoft/TypeScript/issues/338\n [$getLoaded]() {\n return this[$loaded];\n }\n // @see [$getLoaded]\n [$getModelIsVisible]() {\n return this.loaded && this[$isElementInViewport];\n }\n [$shouldAttemptPreload]() {\n return !!this.src && this[$isElementInViewport];\n }\n /**\n * Called on initialization and when the resize observer fires.\n */\n [$updateSize]({ width, height }) {\n if (width === 0 || height === 0) {\n return;\n }\n this[$container].style.width = `${width}px`;\n this[$container].style.height = `${height}px`;\n this[$onResize]({ width, height });\n }\n [$tick](time, delta) {\n var _p;\n (_p = this[$scene].effectRenderer) === null || _p === void 0 ? void 0 : _p.beforeRender(time, delta);\n }\n [$markLoaded]() {\n if (this[$loaded]) {\n return;\n }\n this[$loaded] = true;\n this[$loadedTime] = performance.now();\n }\n [$needsRender]() {\n this[$scene].queueRender();\n }\n [$onModelLoad]() {\n }\n [$updateStatus](status) {\n this[$status] = status;\n const rootNode = this.getRootNode();\n // Only change the aria-label if is currently focused:\n if (rootNode != null && rootNode.activeElement === this &&\n this[$statusElement].textContent != status) {\n this[$statusElement].textContent = status;\n }\n }\n [(_l = $onFocus, _m = $onBlur, $onResize)](e) {\n this[$scene].setSize(e.width, e.height);\n }\n /**\n * Parses the element for an appropriate source URL and\n * sets the views to use the new model based.\n */\n async [(_o = $onContextLost, $updateSource)]() {\n const scene = this[$scene];\n if (this.loaded || !this[$shouldAttemptPreload]() ||\n this.src === scene.url) {\n return;\n }\n if (this.generateSchema) {\n scene.updateSchema(this.src);\n }\n this[$updateStatus]('Loading');\n // If we are loading a new model, we need to stop the animation of\n // the current one (if any is playing). Otherwise, we might lose\n // the reference to the scene root and running actions start to\n // throw exceptions and/or behave in unexpected ways:\n scene.stopAnimation();\n const updateSourceProgress = this[$progressTracker].beginActivity('model-load');\n const source = this.src;\n try {\n const srcUpdated = scene.setSource(source, (progress) => updateSourceProgress(clamp(progress, 0, 1) * 0.95));\n const envUpdated = this[$updateEnvironment]();\n await Promise.all([srcUpdated, envUpdated]);\n this[$markLoaded]();\n this[$onModelLoad]();\n this.updateComplete.then(() => {\n this.dispatchEvent(new CustomEvent('before-render'));\n });\n // Wait for shaders to compile and pixels to be drawn.\n await new Promise(resolve => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.dispatchEvent(new CustomEvent('load', { detail: { url: source } }));\n resolve();\n });\n });\n });\n }\n catch (error) {\n this.dispatchEvent(new CustomEvent('error', { detail: { type: 'loadfailure', sourceError: error } }));\n }\n finally {\n updateSourceProgress(1.0);\n }\n }\n}\n__decorate([\n property({ type: String })\n], ModelViewerElementBase.prototype, \"alt\", void 0);\n__decorate([\n property({ type: String })\n], ModelViewerElementBase.prototype, \"src\", void 0);\n__decorate([\n property({ type: Boolean, attribute: 'with-credentials' })\n], ModelViewerElementBase.prototype, \"withCredentials\", void 0);\n__decorate([\n property({ type: Boolean, attribute: 'generate-schema' })\n], ModelViewerElementBase.prototype, \"generateSchema\", void 0);\n//# sourceMappingURL=model-viewer-base.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { LoopOnce, LoopPingPong, LoopRepeat } from 'three';\nimport { $getModelIsVisible, $needsRender, $onModelLoad, $renderer, $scene, $tick } from '../model-viewer-base.js';\nconst MILLISECONDS_PER_SECOND = 1000.0;\nconst $changeAnimation = Symbol('changeAnimation');\nconst $appendAnimation = Symbol('appendAnimation');\nconst $detachAnimation = Symbol('detachAnimation');\nconst $paused = Symbol('paused');\nconst DEFAULT_PLAY_OPTIONS = {\n repetitions: Infinity,\n pingpong: false\n};\nconst DEFAULT_APPEND_OPTIONS = {\n pingpong: false,\n repetitions: null,\n weight: 1,\n timeScale: 1,\n fade: false,\n warp: false,\n relativeWarp: true,\n time: null\n};\nconst DEFAULT_DETACH_OPTIONS = {\n fade: true\n};\nexport const AnimationMixin = (ModelViewerElement) => {\n var _a;\n class AnimationModelViewerElement extends ModelViewerElement {\n constructor(...args) {\n super(args);\n this.autoplay = false;\n this.animationName = undefined;\n this.animationCrossfadeDuration = 300;\n this[_a] = true;\n this[$scene].subscribeMixerEvent('loop', (e) => {\n const count = e.action._loopCount;\n const name = e.action._clip.name;\n const uuid = e.action._clip.uuid;\n const targetAnimation = this[$scene].markedAnimations.find(e => e.name === name);\n if (targetAnimation) {\n this[$scene].updateAnimationLoop(targetAnimation.name, targetAnimation.loopMode, targetAnimation.repetitionCount);\n const filtredArr = this[$scene].markedAnimations.filter(e => e.name !== name);\n this[$scene].markedAnimations = filtredArr;\n }\n this.dispatchEvent(new CustomEvent('loop', { detail: { count, name, uuid } }));\n });\n this[$scene].subscribeMixerEvent('finished', (e) => {\n if (!this[$scene].appendedAnimations.includes(e.action._clip.name)) {\n this[$paused] = true;\n }\n else {\n const filteredList = this[$scene].appendedAnimations.filter(i => i !== e.action._clip.name);\n this[$scene].appendedAnimations = filteredList;\n }\n this.dispatchEvent(new CustomEvent('finished'));\n });\n }\n /**\n * Returns an array\n */\n get availableAnimations() {\n if (this.loaded) {\n return this[$scene].animationNames;\n }\n return [];\n }\n get duration() {\n return this[$scene].duration;\n }\n get paused() {\n return this[$paused];\n }\n get currentTime() {\n return this[$scene].animationTime;\n }\n get appendedAnimations() {\n return this[$scene].appendedAnimations;\n }\n set currentTime(value) {\n this[$scene].animationTime = value;\n this[$needsRender]();\n }\n get timeScale() {\n return this[$scene].animationTimeScale;\n }\n set timeScale(value) {\n this[$scene].animationTimeScale = value;\n }\n pause() {\n if (this[$paused]) {\n return;\n }\n this[$paused] = true;\n this.dispatchEvent(new CustomEvent('pause'));\n }\n play(options) {\n if (this.availableAnimations.length > 0) {\n this[$paused] = false;\n this[$changeAnimation](options);\n this.dispatchEvent(new CustomEvent('play'));\n }\n }\n appendAnimation(animationName, options) {\n if (this.availableAnimations.length > 0) {\n this[$paused] = false;\n this[$appendAnimation](animationName, options);\n this.dispatchEvent(new CustomEvent('append-animation'));\n }\n }\n detachAnimation(animationName, options) {\n if (this.availableAnimations.length > 0) {\n this[$paused] = false;\n this[$detachAnimation](animationName, options);\n this.dispatchEvent(new CustomEvent('detach-animation'));\n }\n }\n [(_a = $paused, $onModelLoad)]() {\n super[$onModelLoad]();\n this[$paused] = true;\n if (this.animationName != null) {\n this[$changeAnimation]();\n }\n if (this.autoplay) {\n this.play();\n }\n }\n [$tick](_time, delta) {\n super[$tick](_time, delta);\n if (this[$paused] ||\n (!this[$getModelIsVisible]() && !this[$renderer].isPresenting)) {\n return;\n }\n this[$scene].updateAnimation(delta / MILLISECONDS_PER_SECOND);\n this[$needsRender]();\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('autoplay') && this.autoplay) {\n this.play();\n }\n if (changedProperties.has('animationName')) {\n this[$changeAnimation]();\n }\n }\n [$changeAnimation](options = DEFAULT_PLAY_OPTIONS) {\n var _b;\n const repetitions = (_b = options.repetitions) !== null && _b !== void 0 ? _b : Infinity;\n const mode = options.pingpong ?\n LoopPingPong :\n (repetitions === 1 ? LoopOnce : LoopRepeat);\n this[$scene].playAnimation(this.animationName, this.animationCrossfadeDuration / MILLISECONDS_PER_SECOND, mode, repetitions);\n // If we are currently paused, we need to force a render so that\n // the scene updates to the first frame of the new animation\n if (this[$paused]) {\n this[$scene].updateAnimation(0);\n this[$needsRender]();\n }\n }\n [$appendAnimation](animationName = '', options = DEFAULT_APPEND_OPTIONS) {\n var _b;\n const repetitions = (_b = options.repetitions) !== null && _b !== void 0 ? _b : Infinity;\n const mode = options.pingpong ?\n LoopPingPong :\n (repetitions === 1 ? LoopOnce : LoopRepeat);\n const needsToStop = !!options.repetitions || 'pingpong' in options;\n this[$scene].appendAnimation(animationName ? animationName : this.animationName, mode, repetitions, options.weight, options.timeScale, options.fade, options.warp, options.relativeWarp, options.time, needsToStop);\n // If we are currently paused, we need to force a render so that\n // the scene updates to the first frame of the new animation\n if (this[$paused]) {\n this[$scene].updateAnimation(0);\n this[$needsRender]();\n }\n }\n [$detachAnimation](animationName = '', options = DEFAULT_DETACH_OPTIONS) {\n this[$scene].detachAnimation(animationName ? animationName : this.animationName, options.fade);\n // If we are currently paused, we need to force a render so that\n // the scene updates to the first frame of the new animation\n if (this[$paused]) {\n this[$scene].updateAnimation(0);\n this[$needsRender]();\n }\n }\n }\n __decorate([\n property({ type: Boolean })\n ], AnimationModelViewerElement.prototype, \"autoplay\", void 0);\n __decorate([\n property({ type: String, attribute: 'animation-name' })\n ], AnimationModelViewerElement.prototype, \"animationName\", void 0);\n __decorate([\n property({ type: Number, attribute: 'animation-crossfade-duration' })\n ], AnimationModelViewerElement.prototype, \"animationCrossfadeDuration\", void 0);\n return AnimationModelViewerElement;\n};\n//# sourceMappingURL=animation.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Matrix4, Vector3 } from 'three';\nimport { $needsRender, $onModelLoad, $scene, $tick, toVector2D, toVector3D } from '../model-viewer-base.js';\nimport { Hotspot } from '../three-components/Hotspot.js';\nconst $hotspotMap = Symbol('hotspotMap');\nconst $mutationCallback = Symbol('mutationCallback');\nconst $observer = Symbol('observer');\nconst $addHotspot = Symbol('addHotspot');\nconst $removeHotspot = Symbol('removeHotspot');\nconst worldToModel = new Matrix4();\n/**\n * AnnotationMixin implements a declarative API to add hotspots and annotations.\n * Child elements of the element that have a slot name that\n * begins with \"hotspot\" and data-position and data-normal attributes in\n * the format of the camera-target attribute will be added to the scene and\n * track the specified model coordinates.\n */\nexport const AnnotationMixin = (ModelViewerElement) => {\n var _a, _b, _c;\n class AnnotationModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this[_a] = new Map();\n this[_b] = (mutations) => {\n mutations.forEach((mutation) => {\n // NOTE: Be wary that in ShadyDOM cases, the MutationRecord\n // only has addedNodes and removedNodes (and no other details).\n if (!(mutation instanceof MutationRecord) ||\n mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n this[$addHotspot](node);\n });\n mutation.removedNodes.forEach((node) => {\n this[$removeHotspot](node);\n });\n this[$needsRender]();\n }\n });\n };\n this[_c] = new MutationObserver(this[$mutationCallback]);\n }\n connectedCallback() {\n super.connectedCallback();\n for (let i = 0; i < this.children.length; ++i) {\n this[$addHotspot](this.children[i]);\n }\n const { ShadyDOM } = self;\n if (ShadyDOM == null) {\n this[$observer].observe(this, { childList: true });\n }\n else {\n this[$observer] =\n ShadyDOM.observeChildren(this, this[$mutationCallback]);\n }\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n const { ShadyDOM } = self;\n if (ShadyDOM == null) {\n this[$observer].disconnect();\n }\n else {\n ShadyDOM.unobserveChildren(this[$observer]);\n }\n }\n [(_a = $hotspotMap, _b = $mutationCallback, _c = $observer, $onModelLoad)]() {\n super[$onModelLoad]();\n const scene = this[$scene];\n scene.forHotspots((hotspot) => {\n scene.updateSurfaceHotspot(hotspot);\n });\n }\n [$tick](time, delta) {\n super[$tick](time, delta);\n const scene = this[$scene];\n const { annotationRenderer } = scene;\n const camera = scene.getCamera();\n if (scene.shouldRender()) {\n scene.animateSurfaceHotspots();\n scene.updateHotspotsVisibility(camera.position);\n annotationRenderer.domElement.style.display = '';\n annotationRenderer.render(scene, camera);\n }\n }\n /**\n * Since the data-position and data-normal attributes are not observed, use\n * this method to move a hotspot. Keep in mind that all hotspots with the\n * same slot name use a single location and the first definition takes\n * precedence, until updated with this method.\n */\n updateHotspot(config) {\n const hotspot = this[$hotspotMap].get(config.name);\n if (hotspot == null) {\n return;\n }\n hotspot.updatePosition(config.position);\n hotspot.updateNormal(config.normal);\n hotspot.surface = config.surface;\n this[$scene].updateSurfaceHotspot(hotspot);\n this[$needsRender]();\n }\n /**\n * This method returns in-scene data about a requested hotspot including\n * its position in screen (canvas) space and its current visibility.\n */\n queryHotspot(name) {\n const hotspot = this[$hotspotMap].get(name);\n if (hotspot == null) {\n return null;\n }\n const position = toVector3D(hotspot.position);\n const normal = toVector3D(hotspot.normal);\n const facingCamera = hotspot.facingCamera;\n const scene = this[$scene];\n const camera = scene.getCamera();\n const vector = new Vector3();\n vector.setFromMatrixPosition(hotspot.matrixWorld);\n vector.project(camera);\n const widthHalf = scene.width / 2;\n const heightHalf = scene.height / 2;\n vector.x = (vector.x * widthHalf) + widthHalf;\n vector.y = -(vector.y * heightHalf) + heightHalf;\n const canvasPosition = toVector3D(new Vector3(vector.x, vector.y, vector.z));\n if (!Number.isFinite(canvasPosition.x) ||\n !Number.isFinite(canvasPosition.y)) {\n return null;\n }\n return { position, normal, canvasPosition, facingCamera };\n }\n /**\n * This method returns the model position, normal and texture coordinate\n * of the point on the mesh corresponding to the input pixel coordinates\n * given relative to the model-viewer element. The position and normal\n * are returned as strings in the format suitable for putting in a\n * hotspot's data-position and data-normal attributes. If the mesh is\n * not hit, the result is null.\n */\n positionAndNormalFromPoint(pixelX, pixelY) {\n const scene = this[$scene];\n const ndcPosition = scene.getNDC(pixelX, pixelY);\n const hit = scene.positionAndNormalFromPoint(ndcPosition);\n if (hit == null) {\n return null;\n }\n worldToModel.copy(scene.target.matrixWorld).invert();\n const position = toVector3D(hit.position.applyMatrix4(worldToModel));\n const normal = toVector3D(hit.normal.transformDirection(worldToModel));\n let uv = null;\n if (hit.uv != null) {\n uv = toVector2D(hit.uv);\n }\n return { position: position, normal: normal, uv: uv };\n }\n /**\n * This method returns a dynamic hotspot ID string of the point on the mesh\n * corresponding to the input pixel coordinates given relative to the\n * model-viewer element. The ID string can be used in the data-surface\n * attribute of the hotspot to make it follow this point on the surface even\n * as the model animates. If the mesh is not hit, the result is null.\n */\n surfaceFromPoint(pixelX, pixelY) {\n const scene = this[$scene];\n const ndcPosition = scene.getNDC(pixelX, pixelY);\n return scene.surfaceFromPoint(ndcPosition);\n }\n [$addHotspot](node) {\n if (!(node instanceof HTMLElement &&\n node.slot.indexOf('hotspot') === 0)) {\n return;\n }\n let hotspot = this[$hotspotMap].get(node.slot);\n if (hotspot != null) {\n hotspot.increment();\n }\n else {\n hotspot = new Hotspot({\n name: node.slot,\n position: node.dataset.position,\n normal: node.dataset.normal,\n surface: node.dataset.surface,\n });\n this[$hotspotMap].set(node.slot, hotspot);\n this[$scene].addHotspot(hotspot);\n }\n this[$scene].queueRender();\n }\n [$removeHotspot](node) {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n const hotspot = this[$hotspotMap].get(node.slot);\n if (!hotspot) {\n return;\n }\n if (hotspot.decrement()) {\n this[$scene].removeHotspot(hotspot);\n this[$hotspotMap].delete(node.slot);\n }\n this[$scene].queueRender();\n }\n }\n return AnnotationModelViewerElement;\n};\n//# sourceMappingURL=annotation.js.map","/*!\nfflate - fast JavaScript compression/decompression\n\nLicensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE\nversion 0.8.2\n*/\n\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n ,\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data.length) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush();\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function () { w.postMessage([]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n */\n Deflate.prototype.flush = function () {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n */\n Gzip.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n // process concatenated GZIP\n if (this.s.f && !this.s.l && !final) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n */\n Zlib.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (val instanceof u8)\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","import {\n\tNoColorSpace,\n\tDoubleSide,\n\tColor,\n} from 'three';\n\nimport {\n\tstrToU8,\n\tzipSync,\n} from '../libs/fflate.module.js';\n\nclass USDZExporter {\n\n\tconstructor() {\n\n\t\tthis.textureUtils = null;\n\n\t}\n\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t}\n\n\tparse( scene, onDone, onError, options ) {\n\n\t\tthis.parseAsync( scene, options ).then( onDone ).catch( onError );\n\n\t}\n\n\tasync parseAsync( scene, options = {} ) {\n\n\t\toptions = Object.assign( {\n\t\t\tar: {\n\t\t\t\tanchoring: { type: 'plane' },\n\t\t\t\tplaneAnchoring: { alignment: 'horizontal' }\n\t\t\t},\n\t\t\tincludeAnchoringProperties: true,\n\t\t\tquickLookCompatible: false,\n\t\t\tmaxTextureSize: 1024,\n\t\t}, options );\n\n\t\tconst files = {};\n\t\tconst modelFileName = 'model.usda';\n\n\t\t// model file should be first in USDZ archive so we init it here\n\t\tfiles[ modelFileName ] = null;\n\n\t\tlet output = buildHeader();\n\n\t\toutput += buildSceneStart( options );\n\n\t\tconst materials = {};\n\t\tconst textures = {};\n\n\t\tscene.traverseVisible( ( object ) => {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tconst geometry = object.geometry;\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\tconst geometryFileName = 'geometries/Geometry_' + geometry.id + '.usda';\n\n\t\t\t\t\tif ( ! ( geometryFileName in files ) ) {\n\n\t\t\t\t\t\tconst meshObject = buildMeshObject( geometry );\n\t\t\t\t\t\tfiles[ geometryFileName ] = buildUSDFileAsString( meshObject );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! ( material.uuid in materials ) ) {\n\n\t\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutput += buildXform( object, geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)', object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isCamera ) {\n\n\t\t\t\toutput += buildCamera( object );\n\n\t\t\t}\n\n\t\t} );\n\n\n\t\toutput += buildSceneEnd();\n\n\t\toutput += buildMaterials( materials, textures, options.quickLookCompatible );\n\n\t\tfiles[ modelFileName ] = strToU8( output );\n\t\toutput = null;\n\n\t\tfor ( const id in textures ) {\n\n\t\t\tlet texture = textures[ id ];\n\n\t\t\tif ( texture.isCompressedTexture === true ) {\n\n\t\t\t\tif ( this.textureUtils === null ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.USDZExporter: setTextureUtils() must be called to process compressed textures.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = await this.textureUtils.decompress( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst canvas = imageToCanvas( texture.image, texture.flipY, options.maxTextureSize );\n\t\t\tconst blob = await new Promise( resolve => canvas.toBlob( resolve, 'image/png', 1 ) );\n\n\t\t\tfiles[ `textures/Texture_${ id }.png` ] = new Uint8Array( await blob.arrayBuffer() );\n\n\t\t}\n\n\t\t// 64 byte alignment\n\t\t// https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n\t\tlet offset = 0;\n\n\t\tfor ( const filename in files ) {\n\n\t\t\tconst file = files[ filename ];\n\t\t\tconst headerSize = 34 + filename.length;\n\n\t\t\toffset += headerSize;\n\n\t\t\tconst offsetMod64 = offset & 63;\n\n\t\t\tif ( offsetMod64 !== 4 ) {\n\n\t\t\t\tconst padLength = 64 - offsetMod64;\n\t\t\t\tconst padding = new Uint8Array( padLength );\n\n\t\t\t\tfiles[ filename ] = [ file, { extra: { 12345: padding } } ];\n\n\t\t\t}\n\n\t\t\toffset = file.length;\n\n\t\t}\n\n\t\treturn zipSync( files, { level: 0 } );\n\n\t}\n\n}\n\nfunction imageToCanvas( image, flipY, maxTextureSize ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\tconst scale = maxTextureSize / Math.max( image.width, image.height );\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = image.width * Math.min( 1, scale );\n\t\tcanvas.height = image.height * Math.min( 1, scale );\n\n\t\tconst context = canvas.getContext( '2d' );\n\n\t\t// TODO: We should be able to do this in the UsdTransform2d?\n\n\t\tif ( flipY === true ) {\n\n\t\t\tcontext.translate( 0, canvas.height );\n\t\t\tcontext.scale( 1, - 1 );\n\n\t\t}\n\n\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\treturn canvas;\n\n\t} else {\n\n\t\tthrow new Error( 'THREE.USDZExporter: No valid image data found. Unable to process texture.' );\n\n\t}\n\n}\n\n//\n\nconst PRECISION = 7;\n\nfunction buildHeader() {\n\n\treturn `#usda 1.0\n(\n\tcustomLayerData = {\n\t\tstring creator = \"Three.js USDZExporter\"\n\t}\n\tdefaultPrim = \"Root\"\n\tmetersPerUnit = 1\n\tupAxis = \"Y\"\n)\n\n`;\n\n}\n\nfunction buildSceneStart( options ) {\n\n\tconst alignment = options.includeAnchoringProperties === true ? `\n\t\ttoken preliminary:anchoring:type = \"${options.ar.anchoring.type}\"\n\t\ttoken preliminary:planeAnchoring:alignment = \"${options.ar.planeAnchoring.alignment}\"\n\t` : '';\n\treturn `def Xform \"Root\"\n{\n\tdef Scope \"Scenes\" (\n\t\tkind = \"sceneLibrary\"\n\t)\n\t{\n\t\tdef Xform \"Scene\" (\n\t\t\tcustomData = {\n\t\t\t\tbool preliminary_collidesWithEnvironment = 0\n\t\t\t\tstring sceneName = \"Scene\"\n\t\t\t}\n\t\t\tsceneName = \"Scene\"\n\t\t)\n\t\t{${alignment}\n`;\n\n}\n\nfunction buildSceneEnd() {\n\n\treturn `\n\t\t}\n\t}\n}\n\n`;\n\n}\n\nfunction buildUSDFileAsString( dataToInsert ) {\n\n\tlet output = buildHeader();\n\toutput += dataToInsert;\n\treturn strToU8( output );\n\n}\n\n// Xform\n\nfunction buildXform( object, geometry, material ) {\n\n\tconst name = 'Object_' + object.id;\n\tconst transform = buildMatrix( object.matrixWorld );\n\n\tif ( object.matrixWorld.determinant() < 0 ) {\n\n\t\tconsole.warn( 'THREE.USDZExporter: USDZ does not support negative scales', object );\n\n\t}\n\n\treturn `def Xform \"${ name }\" (\n\tprepend references = @./geometries/Geometry_${ geometry.id }.usda@\n\tprepend apiSchemas = [\"MaterialBindingAPI\"]\n)\n{\n\tmatrix4d xformOp:transform = ${ transform }\n\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n\trel material:binding = \n}\n\n`;\n\n}\n\nfunction buildMatrix( matrix ) {\n\n\tconst array = matrix.elements;\n\n\treturn `( ${ buildMatrixRow( array, 0 ) }, ${ buildMatrixRow( array, 4 ) }, ${ buildMatrixRow( array, 8 ) }, ${ buildMatrixRow( array, 12 ) } )`;\n\n}\n\nfunction buildMatrixRow( array, offset ) {\n\n\treturn `(${ array[ offset + 0 ] }, ${ array[ offset + 1 ] }, ${ array[ offset + 2 ] }, ${ array[ offset + 3 ] })`;\n\n}\n\n// Mesh\n\nfunction buildMeshObject( geometry ) {\n\n\tconst mesh = buildMesh( geometry );\n\treturn `\ndef \"Geometry\"\n{\n${mesh}\n}\n`;\n\n}\n\nfunction buildMesh( geometry ) {\n\n\tconst name = 'Geometry';\n\tconst attributes = geometry.attributes;\n\tconst count = attributes.position.count;\n\n\treturn `\n\tdef Mesh \"${ name }\"\n\t{\n\t\tint[] faceVertexCounts = [${ buildMeshVertexCount( geometry ) }]\n\t\tint[] faceVertexIndices = [${ buildMeshVertexIndices( geometry ) }]\n\t\tnormal3f[] normals = [${ buildVector3Array( attributes.normal, count )}] (\n\t\t\tinterpolation = \"vertex\"\n\t\t)\n\t\tpoint3f[] points = [${ buildVector3Array( attributes.position, count )}]\n${ buildPrimvars( attributes ) }\n\t\tuniform token subdivisionScheme = \"none\"\n\t}\n`;\n\n}\n\nfunction buildMeshVertexCount( geometry ) {\n\n\tconst count = geometry.index !== null ? geometry.index.count : geometry.attributes.position.count;\n\n\treturn Array( count / 3 ).fill( 3 ).join( ', ' );\n\n}\n\nfunction buildMeshVertexIndices( geometry ) {\n\n\tconst index = geometry.index;\n\tconst array = [];\n\n\tif ( index !== null ) {\n\n\t\tfor ( let i = 0; i < index.count; i ++ ) {\n\n\t\t\tarray.push( index.getX( i ) );\n\n\t\t}\n\n\t} else {\n\n\t\tconst length = geometry.attributes.position.count;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tarray.push( i );\n\n\t\t}\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector3Array( attribute, count ) {\n\n\tif ( attribute === undefined ) {\n\n\t\tconsole.warn( 'USDZExporter: Normals missing.' );\n\t\treturn Array( count ).fill( '(0, 0, 0)' ).join( ', ' );\n\n\t}\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\t\tconst z = attribute.getZ( i );\n\n\t\tarray.push( `(${ x.toPrecision( PRECISION ) }, ${ y.toPrecision( PRECISION ) }, ${ z.toPrecision( PRECISION ) })` );\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector2Array( attribute ) {\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\n\t\tarray.push( `(${ x.toPrecision( PRECISION ) }, ${ 1 - y.toPrecision( PRECISION ) })` );\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildPrimvars( attributes ) {\n\n\tlet string = '';\n\n\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\tconst id = ( i > 0 ? i : '' );\n\t\tconst attribute = attributes[ 'uv' + id ];\n\n\t\tif ( attribute !== undefined ) {\n\n\t\t\tstring += `\n\t\ttexCoord2f[] primvars:st${ id } = [${ buildVector2Array( attribute )}] (\n\t\t\tinterpolation = \"vertex\"\n\t\t)`;\n\n\t\t}\n\n\t}\n\n\t// vertex colors\n\n\tconst colorAttribute = attributes.color;\n\n\tif ( colorAttribute !== undefined ) {\n\n\t\tconst count = colorAttribute.count;\n\n\t\tstring += `\n\tcolor3f[] primvars:displayColor = [${buildVector3Array( colorAttribute, count )}] (\n\t\tinterpolation = \"vertex\"\n\t\t)`;\n\n\t}\n\n\treturn string;\n\n}\n\n// Materials\n\nfunction buildMaterials( materials, textures, quickLookCompatible = false ) {\n\n\tconst array = [];\n\n\tfor ( const uuid in materials ) {\n\n\t\tconst material = materials[ uuid ];\n\n\t\tarray.push( buildMaterial( material, textures, quickLookCompatible ) );\n\n\t}\n\n\treturn `def \"Materials\"\n{\n${ array.join( '' ) }\n}\n\n`;\n\n}\n\nfunction buildMaterial( material, textures, quickLookCompatible = false ) {\n\n\t// https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n\tconst pad = '\t\t\t';\n\tconst inputs = [];\n\tconst samplers = [];\n\n\tfunction buildTexture( texture, mapType, color ) {\n\n\t\tconst id = texture.source.id + '_' + texture.flipY;\n\n\t\ttextures[ id ] = texture;\n\n\t\tconst uv = texture.channel > 0 ? 'st' + texture.channel : 'st';\n\n\t\tconst WRAPPINGS = {\n\t\t\t1000: 'repeat', // RepeatWrapping\n\t\t\t1001: 'clamp', // ClampToEdgeWrapping\n\t\t\t1002: 'mirror' // MirroredRepeatWrapping\n\t\t};\n\n\t\tconst repeat = texture.repeat.clone();\n\t\tconst offset = texture.offset.clone();\n\t\tconst rotation = texture.rotation;\n\n\t\t// rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\n\t\tconst xRotationOffset = Math.sin( rotation );\n\t\tconst yRotationOffset = Math.cos( rotation );\n\n\t\t// texture coordinates start in the opposite corner, need to correct\n\t\toffset.y = 1 - offset.y - repeat.y;\n\n\t\t// turns out QuickLook is buggy and interprets texture repeat inverted/applies operations in a different order.\n\t\t// Apple Feedback: \tFB10036297 and FB11442287\n\t\tif ( quickLookCompatible ) {\n\n\t\t\t// This is NOT correct yet in QuickLook, but comes close for a range of models.\n\t\t\t// It becomes more incorrect the bigger the offset is\n\n\t\t\toffset.x = offset.x / repeat.x;\n\t\t\toffset.y = offset.y / repeat.y;\n\n\t\t\toffset.x += xRotationOffset / repeat.x;\n\t\t\toffset.y += yRotationOffset - 1;\n\n\t\t} else {\n\n\t\t\t// results match glTF results exactly. verified correct in usdview.\n\t\t\toffset.x += xRotationOffset * repeat.x;\n\t\t\toffset.y += ( 1 - yRotationOffset ) * repeat.y;\n\n\t\t}\n\n\t\treturn `\n\t\tdef Shader \"PrimvarReader_${ mapType }\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdPrimvarReader_float2\"\n\t\t\tfloat2 inputs:fallback = (0.0, 0.0)\n\t\t\ttoken inputs:varname = \"${ uv }\"\n\t\t\tfloat2 outputs:result\n\t\t}\n\n\t\tdef Shader \"Transform2d_${ mapType }\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdTransform2d\"\n\t\t\ttoken inputs:in.connect = \n\t\t\tfloat inputs:rotation = ${ ( rotation * ( 180 / Math.PI ) ).toFixed( PRECISION ) }\n\t\t\tfloat2 inputs:scale = ${ buildVector2( repeat ) }\n\t\t\tfloat2 inputs:translation = ${ buildVector2( offset ) }\n\t\t\tfloat2 outputs:result\n\t\t}\n\n\t\tdef Shader \"Texture_${ texture.id }_${ mapType }\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdUVTexture\"\n\t\t\tasset inputs:file = @textures/Texture_${ id }.png@\n\t\t\tfloat2 inputs:st.connect = \n\t\t\t${ color !== undefined ? 'float4 inputs:scale = ' + buildColor4( color ) : '' }\n\t\t\ttoken inputs:sourceColorSpace = \"${ texture.colorSpace === NoColorSpace ? 'raw' : 'sRGB' }\"\n\t\t\ttoken inputs:wrapS = \"${ WRAPPINGS[ texture.wrapS ] }\"\n\t\t\ttoken inputs:wrapT = \"${ WRAPPINGS[ texture.wrapT ] }\"\n\t\t\tfloat outputs:r\n\t\t\tfloat outputs:g\n\t\t\tfloat outputs:b\n\t\t\tfloat3 outputs:rgb\n\t\t\t${ material.transparent || material.alphaTest > 0.0 ? 'float outputs:a' : '' }\n\t\t}`;\n\n\t}\n\n\n\tif ( material.side === DoubleSide ) {\n\n\t\tconsole.warn( 'THREE.USDZExporter: USDZ does not support double sided materials', material );\n\n\t}\n\n\tif ( material.map !== null ) {\n\n\t\tinputs.push( `${ pad }color3f inputs:diffuseColor.connect = ` );\n\n\t\tif ( material.transparent ) {\n\n\t\t\tinputs.push( `${ pad }float inputs:opacity.connect = ` );\n\n\t\t} else if ( material.alphaTest > 0.0 ) {\n\n\t\t\tinputs.push( `${ pad }float inputs:opacity.connect = ` );\n\t\t\tinputs.push( `${ pad }float inputs:opacityThreshold = ${material.alphaTest}` );\n\n\t\t}\n\n\t\tsamplers.push( buildTexture( material.map, 'diffuse', material.color ) );\n\n\t} else {\n\n\t\tinputs.push( `${ pad }color3f inputs:diffuseColor = ${ buildColor( material.color ) }` );\n\n\t}\n\n\tif ( material.emissiveMap !== null ) {\n\n\t\tinputs.push( `${ pad }color3f inputs:emissiveColor.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.emissiveMap, 'emissive', new Color( material.emissive.r * material.emissiveIntensity, material.emissive.g * material.emissiveIntensity, material.emissive.b * material.emissiveIntensity ) ) );\n\n\t} else if ( material.emissive.getHex() > 0 ) {\n\n\t\tinputs.push( `${ pad }color3f inputs:emissiveColor = ${ buildColor( material.emissive ) }` );\n\n\t}\n\n\tif ( material.normalMap !== null ) {\n\n\t\tinputs.push( `${ pad }normal3f inputs:normal.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.normalMap, 'normal' ) );\n\n\t}\n\n\tif ( material.aoMap !== null ) {\n\n\t\tinputs.push( `${ pad }float inputs:occlusion.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.aoMap, 'occlusion', new Color( material.aoMapIntensity, material.aoMapIntensity, material.aoMapIntensity ) ) );\n\n\t}\n\n\tif ( material.roughnessMap !== null ) {\n\n\t\tinputs.push( `${ pad }float inputs:roughness.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.roughnessMap, 'roughness', new Color( material.roughness, material.roughness, material.roughness ) ) );\n\n\t} else {\n\n\t\tinputs.push( `${ pad }float inputs:roughness = ${ material.roughness }` );\n\n\t}\n\n\tif ( material.metalnessMap !== null ) {\n\n\t\tinputs.push( `${ pad }float inputs:metallic.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.metalnessMap, 'metallic', new Color( material.metalness, material.metalness, material.metalness ) ) );\n\n\t} else {\n\n\t\tinputs.push( `${ pad }float inputs:metallic = ${ material.metalness }` );\n\n\t}\n\n\tif ( material.alphaMap !== null ) {\n\n\t\tinputs.push( `${pad}float inputs:opacity.connect = ` );\n\t\tinputs.push( `${pad}float inputs:opacityThreshold = 0.0001` );\n\n\t\tsamplers.push( buildTexture( material.alphaMap, 'opacity' ) );\n\n\t} else {\n\n\t\tinputs.push( `${pad}float inputs:opacity = ${material.opacity}` );\n\n\t}\n\n\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\tif ( material.clearcoatMap !== null ) {\n\n\t\t\tinputs.push( `${pad}float inputs:clearcoat.connect = ` );\n\t\t\tsamplers.push( buildTexture( material.clearcoatMap, 'clearcoat', new Color( material.clearcoat, material.clearcoat, material.clearcoat ) ) );\n\n\t\t} else {\n\n\t\t\tinputs.push( `${pad}float inputs:clearcoat = ${material.clearcoat}` );\n\n\t\t}\n\n\t\tif ( material.clearcoatRoughnessMap !== null ) {\n\n\t\t\tinputs.push( `${pad}float inputs:clearcoatRoughness.connect = ` );\n\t\t\tsamplers.push( buildTexture( material.clearcoatRoughnessMap, 'clearcoatRoughness', new Color( material.clearcoatRoughness, material.clearcoatRoughness, material.clearcoatRoughness ) ) );\n\n\t\t} else {\n\n\t\t\tinputs.push( `${pad}float inputs:clearcoatRoughness = ${material.clearcoatRoughness}` );\n\n\t\t}\n\n\t\tinputs.push( `${ pad }float inputs:ior = ${ material.ior }` );\n\n\t}\n\n\treturn `\n\tdef Material \"Material_${ material.id }\"\n\t{\n\t\tdef Shader \"PreviewSurface\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdPreviewSurface\"\n${ inputs.join( '\\n' ) }\n\t\t\tint inputs:useSpecularWorkflow = 0\n\t\t\ttoken outputs:surface\n\t\t}\n\n\t\ttoken outputs:surface.connect = \n\n${ samplers.join( '\\n' ) }\n\n\t}\n`;\n\n}\n\nfunction buildColor( color ) {\n\n\treturn `(${ color.r }, ${ color.g }, ${ color.b })`;\n\n}\n\nfunction buildColor4( color ) {\n\n\treturn `(${ color.r }, ${ color.g }, ${ color.b }, 1.0)`;\n\n}\n\nfunction buildVector2( vector ) {\n\n\treturn `(${ vector.x }, ${ vector.y })`;\n\n}\n\n\nfunction buildCamera( camera ) {\n\n\tconst name = camera.name ? camera.name : 'Camera_' + camera.id;\n\n\tconst transform = buildMatrix( camera.matrixWorld );\n\n\tif ( camera.matrixWorld.determinant() < 0 ) {\n\n\t\tconsole.warn( 'THREE.USDZExporter: USDZ does not support negative scales', camera );\n\n\t}\n\n\tif ( camera.isOrthographicCamera ) {\n\n\t\treturn `def Camera \"${name}\"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ${ transform }\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n\t\t\tfloat2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) })\n\t\t\tfloat horizontalAperture = ${ ( ( Math.abs( camera.left ) + Math.abs( camera.right ) ) * 10 ).toPrecision( PRECISION ) }\n\t\t\tfloat verticalAperture = ${ ( ( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) * 10 ).toPrecision( PRECISION ) }\n\t\t\ttoken projection = \"orthographic\"\n\t\t}\n\t\n\t`;\n\n\t} else {\n\n\t\treturn `def Camera \"${name}\"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ${ transform }\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n\t\t\tfloat2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) })\n\t\t\tfloat focalLength = ${ camera.getFocalLength().toPrecision( PRECISION ) }\n\t\t\tfloat focusDistance = ${ camera.focus.toPrecision( PRECISION ) }\n\t\t\tfloat horizontalAperture = ${ camera.getFilmWidth().toPrecision( PRECISION ) }\n\t\t\ttoken projection = \"perspective\"\n\t\t\tfloat verticalAperture = ${ camera.getFilmHeight().toPrecision( PRECISION ) }\n\t\t}\n\t\n\t`;\n\n\t}\n\n}\n\nexport { USDZExporter };\n","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { parseExpressions } from './parsers.js';\n/**\n * For our purposes, an enumeration is a fixed set of CSS-expression-compatible\n * names. When serialized, a selected subset of the members may be specified as\n * whitespace-separated strings. An enumeration deserializer is a function that\n * parses a serialized subset of an enumeration and returns any members that are\n * found as a Set.\n *\n * The following example will produce a deserializer for the days of the\n * week:\n *\n * const deserializeDaysOfTheWeek = enumerationDeserializer([\n * 'Monday',\n * 'Tuesday',\n * 'Wednesday',\n * 'Thursday',\n * 'Friday',\n * 'Saturday',\n * 'Sunday'\n * ]);\n */\nexport const enumerationDeserializer = (allowedNames) => (valueString) => {\n try {\n const expressions = parseExpressions(valueString);\n const names = (expressions.length ? expressions[0].terms : [])\n .filter((valueNode) => valueNode && valueNode.type === 'ident')\n .map(valueNode => valueNode.value)\n .filter(name => allowedNames.indexOf(name) > -1);\n return new Set(names);\n }\n catch (_error) {\n }\n return new Set();\n};\n//# sourceMappingURL=deserializers.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { USDZExporter } from 'three/examples/jsm/exporters/USDZExporter.js';\nimport { IS_AR_QUICKLOOK_CANDIDATE, IS_SCENEVIEWER_CANDIDATE, IS_WEBXR_AR_CANDIDATE } from '../constants.js';\nimport { $needsRender, $progressTracker, $renderer, $scene, $shouldAttemptPreload, $updateSource } from '../model-viewer-base.js';\nimport { enumerationDeserializer } from '../styles/deserializers.js';\nimport { ARStatus, ARTracking } from '../three-components/ARRenderer.js';\nimport { waitForEvent } from '../utilities.js';\nlet isWebXRBlocked = false;\nlet isSceneViewerBlocked = false;\nconst noArViewerSigil = '#model-viewer-no-ar-fallback';\nconst deserializeARModes = enumerationDeserializer(['quick-look', 'scene-viewer', 'webxr', 'none']);\nconst DEFAULT_AR_MODES = 'webxr scene-viewer quick-look';\nconst ARMode = {\n QUICK_LOOK: 'quick-look',\n SCENE_VIEWER: 'scene-viewer',\n WEBXR: 'webxr',\n NONE: 'none'\n};\nconst $arButtonContainer = Symbol('arButtonContainer');\nconst $enterARWithWebXR = Symbol('enterARWithWebXR');\nexport const $openSceneViewer = Symbol('openSceneViewer');\nexport const $openIOSARQuickLook = Symbol('openIOSARQuickLook');\nconst $canActivateAR = Symbol('canActivateAR');\nconst $arMode = Symbol('arMode');\nconst $arModes = Symbol('arModes');\nconst $arAnchor = Symbol('arAnchor');\nconst $preload = Symbol('preload');\nconst $onARButtonContainerClick = Symbol('onARButtonContainerClick');\nconst $onARStatus = Symbol('onARStatus');\nconst $onARTracking = Symbol('onARTracking');\nconst $onARTap = Symbol('onARTap');\nconst $selectARMode = Symbol('selectARMode');\nconst $triggerLoad = Symbol('triggerLoad');\nexport const ARMixin = (ModelViewerElement) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n class ARModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this.ar = false;\n this.arScale = 'auto';\n this.arUsdzMaxTextureSize = 'auto';\n this.arPlacement = 'floor';\n this.arModes = DEFAULT_AR_MODES;\n this.iosSrc = null;\n this.xrEnvironment = false;\n this[_a] = false;\n // TODO: Add this to the shadow root as part of this mixin's\n // implementation:\n this[_b] = this.shadowRoot.querySelector('.ar-button');\n this[_c] = document.createElement('a');\n this[_d] = new Set();\n this[_e] = ARMode.NONE;\n this[_f] = false;\n this[_g] = (event) => {\n event.preventDefault();\n this.activateAR();\n };\n this[_h] = ({ status }) => {\n if (status === ARStatus.NOT_PRESENTING ||\n this[$renderer].arRenderer.presentedScene === this[$scene]) {\n this.setAttribute('ar-status', status);\n this.dispatchEvent(new CustomEvent('ar-status', { detail: { status } }));\n if (status === ARStatus.NOT_PRESENTING) {\n this.removeAttribute('ar-tracking');\n }\n else if (status === ARStatus.SESSION_STARTED) {\n this.setAttribute('ar-tracking', ARTracking.TRACKING);\n }\n }\n };\n this[_j] = ({ status }) => {\n this.setAttribute('ar-tracking', status);\n this.dispatchEvent(new CustomEvent('ar-tracking', { detail: { status } }));\n };\n this[_k] = (event) => {\n if (event.data == '_apple_ar_quicklook_button_tapped') {\n this.dispatchEvent(new CustomEvent('quick-look-button-tapped'));\n }\n };\n }\n get canActivateAR() {\n return this[$arMode] !== ARMode.NONE;\n }\n connectedCallback() {\n super.connectedCallback();\n this[$renderer].arRenderer.addEventListener('status', this[$onARStatus]);\n this.setAttribute('ar-status', ARStatus.NOT_PRESENTING);\n this[$renderer].arRenderer.addEventListener('tracking', this[$onARTracking]);\n this[$arAnchor].addEventListener('message', this[$onARTap]);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this[$renderer].arRenderer.removeEventListener('status', this[$onARStatus]);\n this[$renderer].arRenderer.removeEventListener('tracking', this[$onARTracking]);\n this[$arAnchor].removeEventListener('message', this[$onARTap]);\n }\n update(changedProperties) {\n super.update(changedProperties);\n if (changedProperties.has('arScale')) {\n this[$scene].canScale = this.arScale !== 'fixed';\n }\n if (changedProperties.has('arPlacement')) {\n this[$scene].updateShadow();\n this[$needsRender]();\n }\n if (changedProperties.has('arModes')) {\n this[$arModes] = deserializeARModes(this.arModes);\n }\n if (changedProperties.has('ar') || changedProperties.has('arModes') ||\n changedProperties.has('src') || changedProperties.has('iosSrc') ||\n changedProperties.has('arUsdzMaxTextureSize')) {\n this[$selectARMode]();\n }\n }\n /**\n * Activates AR. Note that for any mode that is not WebXR-based, this\n * method most likely has to be called synchronous from a user\n * interaction handler. Otherwise, attempts to activate modes that\n * require user interaction will most likely be ignored.\n */\n async activateAR() {\n switch (this[$arMode]) {\n case ARMode.QUICK_LOOK:\n await this[$openIOSARQuickLook]();\n break;\n case ARMode.WEBXR:\n await this[$enterARWithWebXR]();\n break;\n case ARMode.SCENE_VIEWER:\n this[$openSceneViewer]();\n break;\n default:\n console.warn('No AR Mode can be activated. This is probably due to missing \\\nconfiguration or device capabilities');\n break;\n }\n }\n async [(_a = $canActivateAR, _b = $arButtonContainer, _c = $arAnchor, _d = $arModes, _e = $arMode, _f = $preload, _g = $onARButtonContainerClick, _h = $onARStatus, _j = $onARTracking, _k = $onARTap, $selectARMode)]() {\n var _l;\n let arMode = ARMode.NONE;\n if (this.ar) {\n if (this.src != null) {\n for (const value of this[$arModes]) {\n if (value === 'webxr' && IS_WEBXR_AR_CANDIDATE && !isWebXRBlocked &&\n await this[$renderer].arRenderer.supportsPresentation()) {\n arMode = ARMode.WEBXR;\n break;\n }\n if (value === 'scene-viewer' && !isSceneViewerBlocked &&\n (IS_SCENEVIEWER_CANDIDATE ||\n (navigator.userAgentData &&\n navigator.userAgentData.getHighEntropyValues &&\n ((_l = (await navigator.userAgentData.getHighEntropyValues([\n 'formFactor'\n ])).formFactor) === null || _l === void 0 ? void 0 : _l.includes('XR'))))) {\n arMode = ARMode.SCENE_VIEWER;\n break;\n }\n if (value === 'quick-look' && IS_AR_QUICKLOOK_CANDIDATE) {\n arMode = ARMode.QUICK_LOOK;\n break;\n }\n }\n }\n // The presence of ios-src overrides the absence of quick-look\n // ar-mode.\n if (arMode === ARMode.NONE && this.iosSrc != null &&\n IS_AR_QUICKLOOK_CANDIDATE) {\n arMode = ARMode.QUICK_LOOK;\n }\n }\n if (arMode !== ARMode.NONE) {\n this[$arButtonContainer].classList.add('enabled');\n this[$arButtonContainer].addEventListener('click', this[$onARButtonContainerClick]);\n }\n else if (this[$arButtonContainer].classList.contains('enabled')) {\n this[$arButtonContainer].removeEventListener('click', this[$onARButtonContainerClick]);\n this[$arButtonContainer].classList.remove('enabled');\n // If AR went from working to not, notify the element.\n const status = ARStatus.FAILED;\n this.setAttribute('ar-status', status);\n this.dispatchEvent(new CustomEvent('ar-status', { detail: { status } }));\n }\n this[$arMode] = arMode;\n }\n async [$enterARWithWebXR]() {\n console.log('Attempting to present in AR with WebXR...');\n await this[$triggerLoad]();\n try {\n this[$arButtonContainer].removeEventListener('click', this[$onARButtonContainerClick]);\n const { arRenderer } = this[$renderer];\n if (this.arPlacement === 'wall') {\n arRenderer.placementMode = 'wall';\n }\n else if (this.arPlacement === 'ceiling') {\n arRenderer.placementMode = 'ceiling';\n }\n else {\n arRenderer.placementMode = 'floor';\n }\n await arRenderer.present(this[$scene], this.xrEnvironment);\n }\n catch (error) {\n console.warn('Error while trying to present in AR with WebXR');\n console.error(error);\n await this[$renderer].arRenderer.stopPresenting();\n isWebXRBlocked = true;\n console.warn('Falling back to next ar-mode');\n await this[$selectARMode]();\n this.activateAR();\n }\n finally {\n this[$selectARMode]();\n }\n }\n async [$triggerLoad]() {\n if (!this.loaded) {\n this[$preload] = true;\n this[$updateSource]();\n await waitForEvent(this, 'load');\n this[$preload] = false;\n }\n }\n [$shouldAttemptPreload]() {\n return super[$shouldAttemptPreload]() || this[$preload];\n }\n /**\n * Takes a URL and a title string, and attempts to launch Scene Viewer on\n * the current device.\n */\n [$openSceneViewer]() {\n const location = self.location.toString();\n const locationUrl = new URL(location);\n const modelUrl = new URL(this.src, location);\n if (modelUrl.hash)\n modelUrl.hash = '';\n const params = new URLSearchParams(modelUrl.search);\n locationUrl.hash = noArViewerSigil;\n // modelUrl can contain title/link/sound etc.\n params.set('mode', 'ar_preferred');\n if (!params.has('disable_occlusion')) {\n params.set('disable_occlusion', 'true');\n }\n if (this.arScale === 'fixed') {\n params.set('resizable', 'false');\n }\n if (this.arPlacement === 'wall') {\n params.set('enable_vertical_placement', 'true');\n }\n if (params.has('sound')) {\n const soundUrl = new URL(params.get('sound'), location);\n params.set('sound', soundUrl.toString());\n }\n if (params.has('link')) {\n const linkUrl = new URL(params.get('link'), location);\n params.set('link', linkUrl.toString());\n }\n const intent = `intent://arvr.google.com/scene-viewer/1.2?${params.toString() + '&file=' +\n encodeURIComponent(modelUrl\n .toString())}#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=${encodeURIComponent(locationUrl.toString())};end;`;\n const undoHashChange = () => {\n if (self.location.hash === noArViewerSigil) {\n isSceneViewerBlocked = true;\n // The new history will be the current URL with a new hash.\n // Go back one step so that we reset to the expected URL.\n // NOTE(cdata): this should not invoke any browser-level navigation\n // because hash-only changes modify the URL in-place without\n // navigating:\n self.history.back();\n console.warn('Error while trying to present in AR with Scene Viewer');\n console.warn('Falling back to next ar-mode');\n this[$selectARMode]();\n // Would be nice to activateAR() here, but webXR fails due to not\n // seeing a user activation.\n }\n };\n self.addEventListener('hashchange', undoHashChange, { once: true });\n this[$arAnchor].setAttribute('href', intent);\n console.log('Attempting to present in AR with Scene Viewer...');\n this[$arAnchor].click();\n }\n /**\n * Takes a URL to a USDZ file and sets the appropriate fields so that\n * Safari iOS can intent to their AR Quick Look.\n */\n async [$openIOSARQuickLook]() {\n const generateUsdz = !this.iosSrc;\n this[$arButtonContainer].classList.remove('enabled');\n const objectURL = generateUsdz ? await this.prepareUSDZ() : this.iosSrc;\n const modelUrl = new URL(objectURL, self.location.toString());\n if (generateUsdz) {\n const location = self.location.toString();\n const locationUrl = new URL(location);\n const srcUrl = new URL(this.src, locationUrl);\n if (srcUrl.hash) {\n modelUrl.hash = srcUrl.hash;\n }\n }\n if (this.arScale === 'fixed') {\n if (modelUrl.hash) {\n modelUrl.hash += '&';\n }\n modelUrl.hash += 'allowsContentScaling=0';\n }\n const anchor = this[$arAnchor];\n anchor.setAttribute('rel', 'ar');\n const img = document.createElement('img');\n anchor.appendChild(img);\n anchor.setAttribute('href', modelUrl.toString());\n if (generateUsdz) {\n anchor.setAttribute('download', 'model.usdz');\n }\n // attach anchor to shadow DOM to ensure iOS16 ARQL banner click message\n // event propagation\n anchor.style.display = 'none';\n if (!anchor.isConnected)\n this.shadowRoot.appendChild(anchor);\n console.log('Attempting to present in AR with Quick Look...');\n anchor.click();\n anchor.removeChild(img);\n if (generateUsdz) {\n URL.revokeObjectURL(objectURL);\n }\n this[$arButtonContainer].classList.add('enabled');\n }\n async prepareUSDZ() {\n const updateSourceProgress = this[$progressTracker].beginActivity('usdz-conversion');\n await this[$triggerLoad]();\n const { model, shadow, target } = this[$scene];\n if (model == null) {\n return '';\n }\n let visible = false;\n // Remove shadow from export\n if (shadow != null) {\n visible = shadow.visible;\n shadow.visible = false;\n }\n updateSourceProgress(0.2);\n const exporter = new USDZExporter();\n target.remove(model);\n model.position.copy(target.position);\n model.updateWorldMatrix(false, true);\n const arraybuffer = await exporter.parseAsync(model, {\n maxTextureSize: isNaN(this.arUsdzMaxTextureSize) ?\n Infinity :\n Math.max(parseInt(this.arUsdzMaxTextureSize), 16),\n });\n model.position.set(0, 0, 0);\n target.add(model);\n const blob = new Blob([arraybuffer], {\n type: 'model/vnd.usdz+zip',\n });\n const url = URL.createObjectURL(blob);\n updateSourceProgress(1);\n if (shadow != null) {\n shadow.visible = visible;\n }\n return url;\n }\n }\n __decorate([\n property({ type: Boolean, attribute: 'ar' })\n ], ARModelViewerElement.prototype, \"ar\", void 0);\n __decorate([\n property({ type: String, attribute: 'ar-scale' })\n ], ARModelViewerElement.prototype, \"arScale\", void 0);\n __decorate([\n property({ type: String, attribute: 'ar-usdz-max-texture-size' })\n ], ARModelViewerElement.prototype, \"arUsdzMaxTextureSize\", void 0);\n __decorate([\n property({ type: String, attribute: 'ar-placement' })\n ], ARModelViewerElement.prototype, \"arPlacement\", void 0);\n __decorate([\n property({ type: String, attribute: 'ar-modes' })\n ], ARModelViewerElement.prototype, \"arModes\", void 0);\n __decorate([\n property({ type: String, attribute: 'ios-src' })\n ], ARModelViewerElement.prototype, \"iosSrc\", void 0);\n __decorate([\n property({ type: Boolean, attribute: 'xr-environment' })\n ], ARModelViewerElement.prototype, \"xrEnvironment\", void 0);\n return ARModelViewerElement;\n};\n//# sourceMappingURL=ar.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { Vector3 } from 'three';\nimport { $altDefaulted, $announceModelVisibility, $getModelIsVisible, $isElementInViewport, $progressTracker, $scene, $shouldAttemptPreload, $updateSource, $userInputElement, toVector3D } from '../model-viewer-base.js';\nimport { $loader, CachingGLTFLoader } from '../three-components/CachingGLTFLoader.js';\nimport { Renderer } from '../three-components/Renderer.js';\nimport { throttle } from '../utilities.js';\nexport const PROGRESS_BAR_UPDATE_THRESHOLD = 100;\nconst DEFAULT_DRACO_DECODER_LOCATION = 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/';\nconst DEFAULT_KTX2_TRANSCODER_LOCATION = 'https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/';\nconst DEFAULT_LOTTIE_LOADER_LOCATION = 'https://cdn.jsdelivr.net/npm/three@0.149.0/examples/jsm/loaders/LottieLoader.js';\nconst RevealStrategy = {\n AUTO: 'auto',\n MANUAL: 'manual'\n};\nconst LoadingStrategy = {\n AUTO: 'auto',\n LAZY: 'lazy',\n EAGER: 'eager'\n};\nexport const $defaultProgressBarElement = Symbol('defaultProgressBarElement');\nexport const $posterContainerElement = Symbol('posterContainerElement');\nexport const $defaultPosterElement = Symbol('defaultPosterElement');\nconst $shouldDismissPoster = Symbol('shouldDismissPoster');\nconst $hidePoster = Symbol('hidePoster');\nconst $modelIsRevealed = Symbol('modelIsRevealed');\nconst $updateProgressBar = Symbol('updateProgressBar');\nconst $ariaLabelCallToAction = Symbol('ariaLabelCallToAction');\nconst $onProgress = Symbol('onProgress');\n/**\n * LoadingMixin implements features related to lazy loading, as well as\n * presentation details related to the pre-load / pre-render presentation of a\n * \n *\n * This mixin implements support for models with DRACO-compressed meshes.\n * The DRACO decoder will be loaded on-demand if a glTF that uses the DRACO mesh\n * compression extension is encountered.\n *\n * By default, the DRACO decoder will be loaded from a Google CDN. It is\n * possible to customize where the decoder is loaded from by defining a global\n * configuration option for `` like so:\n *\n * ```html\n * \n * ```\n *\n * Note that the above configuration strategy must be performed *before* the\n * first `` element is created in the browser. The configuration\n * can be done anywhere, but the easiest way to ensure it is done at the right\n * time is to do it in the `` of the HTML document. This is the\n * recommended way to set the location because it is most compatible with\n * scenarios where the `` library is lazily loaded.\n *\n * If you absolutely have to set the DRACO decoder location *after* the first\n * `` element is created, you can do it this way:\n *\n * ```html\n * \n * ```\n *\n * Note that the above configuration approach will not work until *after*\n * `` is defined in the browser. Also note that this configuration\n * *must* be set *before* the first DRACO model is fully loaded.\n *\n * It is recommended that users who intend to take advantage of DRACO mesh\n * compression consider whether or not it is acceptable for their use case to\n * have code side-loaded from a Google CDN. If it is not acceptable, then the\n * location must be customized before loading any DRACO models in order to cause\n * the decoder to be loaded from an alternative, acceptable location.\n */\nexport const LoadingMixin = (ModelViewerElement) => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n class LoadingModelViewerElement extends ModelViewerElement {\n static set dracoDecoderLocation(value) {\n CachingGLTFLoader.setDRACODecoderLocation(value);\n }\n static get dracoDecoderLocation() {\n return CachingGLTFLoader.getDRACODecoderLocation();\n }\n static set ktx2TranscoderLocation(value) {\n CachingGLTFLoader.setKTX2TranscoderLocation(value);\n }\n static get ktx2TranscoderLocation() {\n return CachingGLTFLoader.getKTX2TranscoderLocation();\n }\n static set meshoptDecoderLocation(value) {\n CachingGLTFLoader.setMeshoptDecoderLocation(value);\n }\n static get meshoptDecoderLocation() {\n return CachingGLTFLoader.getMeshoptDecoderLocation();\n }\n static set lottieLoaderLocation(value) {\n Renderer.singleton.textureUtils.lottieLoaderUrl = value;\n }\n static get lottieLoaderLocation() {\n return Renderer.singleton.textureUtils.lottieLoaderUrl;\n }\n /**\n * If provided, the callback will be passed each resource URL before a\n * request is sent. The callback may return the original URL, or a new URL\n * to override loading behavior. This behavior can be used to load assets\n * from .ZIP files, drag-and-drop APIs, and Data URIs.\n */\n static mapURLs(callback) {\n Renderer.singleton.loader[$loader].manager.setURLModifier(callback);\n }\n /**\n * Dismisses the poster, causing the model to load and render if\n * necessary. This is currently effectively the same as interacting with\n * the poster via user input.\n */\n dismissPoster() {\n if (this.loaded) {\n this[$hidePoster]();\n }\n else {\n this[$shouldDismissPoster] = true;\n this[$updateSource]();\n }\n }\n /**\n * Displays the poster, hiding the 3D model. If this is called after the 3D\n * model has been revealed, then it must be dismissed by a call to\n * dismissPoster().\n */\n showPoster() {\n const posterContainerElement = this[$posterContainerElement];\n if (posterContainerElement.classList.contains('show')) {\n return;\n }\n posterContainerElement.classList.add('show');\n this[$userInputElement].classList.remove('show');\n const defaultPosterElement = this[$defaultPosterElement];\n defaultPosterElement.removeAttribute('tabindex');\n defaultPosterElement.removeAttribute('aria-hidden');\n const oldVisibility = this.modelIsVisible;\n this[$modelIsRevealed] = false;\n this[$announceModelVisibility](oldVisibility);\n }\n /**\n * Returns the model's bounding box dimensions in meters, independent of\n * turntable rotation.\n */\n getDimensions() {\n return toVector3D(this[$scene].size);\n }\n getBoundingBoxCenter() {\n return toVector3D(this[$scene].boundingBox.getCenter(new Vector3()));\n }\n constructor(...args) {\n super(...args);\n /**\n * A URL pointing to the image to use as a poster in scenarios where the\n * is not ready to reveal a rendered model to the viewer.\n */\n this.poster = null;\n /**\n * An enumerable attribute describing under what conditions the\n * should reveal a model to the viewer.\n *\n * The default value is \"auto\". The only supported alternative values is\n * \"manual\".\n */\n this.reveal = RevealStrategy.AUTO;\n /**\n * An enumerable attribute describing under what conditions the\n * should preload a model.\n *\n * The default value is \"auto\". The only supported alternative values are\n * \"lazy\" and \"eager\". Auto is equivalent to lazy, which loads the model\n * when it is near the viewport for reveal = \"auto\", and when interacted\n * with for reveal = \"interaction\". Eager loads the model immediately.\n */\n this.loading = LoadingStrategy.AUTO;\n this[_a] = false;\n this[_b] = false;\n // TODO: Add this to the shadow root as part of this mixin's\n // implementation:\n this[_c] = this.shadowRoot.querySelector('.slot.poster');\n this[_d] = this.shadowRoot.querySelector('#default-poster');\n this[_e] = this.shadowRoot.querySelector('#default-progress-bar > .bar');\n this[_f] = this[$defaultPosterElement].getAttribute('aria-label');\n this[_g] = throttle((progress) => {\n const parentNode = this[$defaultProgressBarElement].parentNode;\n requestAnimationFrame(() => {\n this[$defaultProgressBarElement].style.transform =\n `scaleX(${progress})`;\n if (progress === 0) {\n // NOTE(cdata): We remove and re-append the progress bar in this\n // condition so that the progress bar does not appear to\n // transition backwards from the right when we reset to 0 (or\n // otherwise <1) progress after having already reached 1 progress\n // previously.\n parentNode.removeChild(this[$defaultProgressBarElement]);\n parentNode.appendChild(this[$defaultProgressBarElement]);\n }\n this[$defaultProgressBarElement].classList.toggle('hide', progress === 1.0);\n });\n }, PROGRESS_BAR_UPDATE_THRESHOLD);\n this[_h] = (event) => {\n const progress = event.detail.totalProgress;\n const reason = event.detail.reason;\n if (progress === 1.0) {\n this[$updateProgressBar].flush();\n if (this.loaded &&\n (this[$shouldDismissPoster] ||\n this.reveal === RevealStrategy.AUTO)) {\n this[$hidePoster]();\n }\n }\n this[$updateProgressBar](progress);\n this.dispatchEvent(new CustomEvent('progress', { detail: { totalProgress: progress, reason } }));\n };\n const ModelViewerElement = self.ModelViewerElement || {};\n const dracoDecoderLocation = ModelViewerElement.dracoDecoderLocation ||\n DEFAULT_DRACO_DECODER_LOCATION;\n CachingGLTFLoader.setDRACODecoderLocation(dracoDecoderLocation);\n const ktx2TranscoderLocation = ModelViewerElement.ktx2TranscoderLocation ||\n DEFAULT_KTX2_TRANSCODER_LOCATION;\n CachingGLTFLoader.setKTX2TranscoderLocation(ktx2TranscoderLocation);\n if (ModelViewerElement.meshoptDecoderLocation) {\n CachingGLTFLoader.setMeshoptDecoderLocation(ModelViewerElement.meshoptDecoderLocation);\n }\n const lottieLoaderLocation = ModelViewerElement.lottieLoaderLocation ||\n DEFAULT_LOTTIE_LOADER_LOCATION;\n Renderer.singleton.textureUtils.lottieLoaderUrl = lottieLoaderLocation;\n }\n connectedCallback() {\n super.connectedCallback();\n if (!this.loaded) {\n this.showPoster();\n }\n this[$progressTracker].addEventListener('progress', this[$onProgress]);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this[$progressTracker].removeEventListener('progress', this[$onProgress]);\n }\n async updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('poster') && this.poster != null) {\n this[$defaultPosterElement].style.backgroundImage =\n `url(${this.poster})`;\n }\n if (changedProperties.has('alt')) {\n this[$defaultPosterElement].setAttribute('aria-label', this[$altDefaulted]);\n }\n if (changedProperties.has('reveal') || changedProperties.has('loading')) {\n this[$updateSource]();\n }\n }\n [(_a = $modelIsRevealed, _b = $shouldDismissPoster, _c = $posterContainerElement, _d = $defaultPosterElement, _e = $defaultProgressBarElement, _f = $ariaLabelCallToAction, _g = $updateProgressBar, _h = $onProgress, $shouldAttemptPreload)]() {\n return !!this.src &&\n (this[$shouldDismissPoster] ||\n this.loading === LoadingStrategy.EAGER ||\n (this.reveal === RevealStrategy.AUTO && this[$isElementInViewport]));\n }\n [$hidePoster]() {\n this[$shouldDismissPoster] = false;\n const posterContainerElement = this[$posterContainerElement];\n if (!posterContainerElement.classList.contains('show')) {\n return;\n }\n posterContainerElement.classList.remove('show');\n this[$userInputElement].classList.add('show');\n const oldVisibility = this.modelIsVisible;\n this[$modelIsRevealed] = true;\n this[$announceModelVisibility](oldVisibility);\n const root = this.getRootNode();\n // If the is still focused, forward the focus to\n // the canvas that has just been revealed\n if (root && root.activeElement === this) {\n this[$userInputElement].focus();\n }\n // Ensure that the poster is no longer focusable or visible to\n // screen readers\n const defaultPosterElement = this[$defaultPosterElement];\n defaultPosterElement.setAttribute('aria-hidden', 'true');\n defaultPosterElement.tabIndex = -1;\n this.dispatchEvent(new CustomEvent('poster-dismissed'));\n }\n [$getModelIsVisible]() {\n return super[$getModelIsVisible]() && this[$modelIsRevealed];\n }\n }\n __decorate([\n property({ type: String })\n ], LoadingModelViewerElement.prototype, \"poster\", void 0);\n __decorate([\n property({ type: String })\n ], LoadingModelViewerElement.prototype, \"reveal\", void 0);\n __decorate([\n property({ type: String })\n ], LoadingModelViewerElement.prototype, \"loading\", void 0);\n return LoadingModelViewerElement;\n};\n//# sourceMappingURL=loading.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { style } from '../decorators.js';\nimport { $getModelIsVisible, $renderer, $scene, $tick } from '../model-viewer-base.js';\nimport { degreesToRadians } from '../styles/conversions.js';\nimport { numberNode } from '../styles/parsers.js';\n// How much the model will rotate per\n// second in radians:\nconst DEFAULT_ROTATION_SPEED = Math.PI / 32;\nexport const AUTO_ROTATE_DELAY_DEFAULT = 3000;\nconst rotationRateIntrinsics = {\n basis: [degreesToRadians(numberNode(DEFAULT_ROTATION_SPEED, 'rad'))],\n keywords: { auto: [null] }\n};\nconst $autoRotateStartTime = Symbol('autoRotateStartTime');\nconst $radiansPerSecond = Symbol('radiansPerSecond');\nconst $syncRotationRate = Symbol('syncRotationRate');\nconst $onCameraChange = Symbol('onCameraChange');\nexport const StagingMixin = (ModelViewerElement) => {\n var _a, _b, _c;\n class StagingModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this.autoRotate = false;\n this.autoRotateDelay = AUTO_ROTATE_DELAY_DEFAULT;\n this.rotationPerSecond = 'auto';\n this[_a] = performance.now();\n this[_b] = 0;\n this[_c] = (event) => {\n if (!this.autoRotate) {\n return;\n }\n if (event.detail.source === 'user-interaction') {\n this[$autoRotateStartTime] = performance.now();\n }\n };\n }\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('camera-change', this[$onCameraChange]);\n this[$autoRotateStartTime] = performance.now();\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('camera-change', this[$onCameraChange]);\n this[$autoRotateStartTime] = performance.now();\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('autoRotate')) {\n this[$autoRotateStartTime] = performance.now();\n }\n }\n [(_a = $autoRotateStartTime, _b = $radiansPerSecond, $syncRotationRate)](style) {\n this[$radiansPerSecond] = style[0];\n }\n [$tick](time, delta) {\n super[$tick](time, delta);\n if (!this.autoRotate || !this[$getModelIsVisible]() ||\n this[$renderer].isPresenting) {\n return;\n }\n const rotationDelta = Math.min(delta, time - this[$autoRotateStartTime] - this.autoRotateDelay);\n if (rotationDelta > 0) {\n this[$scene].yaw = this.turntableRotation +\n this[$radiansPerSecond] * rotationDelta * 0.001;\n }\n }\n get turntableRotation() {\n return this[$scene].yaw;\n }\n resetTurntableRotation(theta = 0) {\n this[$scene].yaw = theta;\n }\n }\n _c = $onCameraChange;\n __decorate([\n property({ type: Boolean, attribute: 'auto-rotate' })\n ], StagingModelViewerElement.prototype, \"autoRotate\", void 0);\n __decorate([\n property({ type: Number, attribute: 'auto-rotate-delay' })\n ], StagingModelViewerElement.prototype, \"autoRotateDelay\", void 0);\n __decorate([\n style({ intrinsics: rotationRateIntrinsics, updateHandler: $syncRotationRate }),\n property({ type: String, attribute: 'rotation-per-second' })\n ], StagingModelViewerElement.prototype, \"rotationPerSecond\", void 0);\n return StagingModelViewerElement;\n};\n//# sourceMappingURL=staging.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { AnimationMixin } from './features/animation.js';\nimport { AnnotationMixin } from './features/annotation.js';\nimport { ARMixin } from './features/ar.js';\nimport { ControlsMixin } from './features/controls.js';\nimport { EnvironmentMixin } from './features/environment.js';\nimport { LoadingMixin } from './features/loading.js';\nimport { SceneGraphMixin } from './features/scene-graph.js';\nimport { StagingMixin } from './features/staging.js';\nimport ModelViewerElementBase from './model-viewer-base.js';\n// Export these to allow lazy-loaded LottieLoader.js to find what it needs.\n// Requires an import map - \"three\": \"path/to/model-viewer.min.js\".\nexport { CanvasTexture, FileLoader, Loader, NearestFilter } from 'three';\nexport const ModelViewerElement = AnnotationMixin(SceneGraphMixin(StagingMixin(EnvironmentMixin(ControlsMixin(ARMixin(LoadingMixin(AnimationMixin(ModelViewerElementBase))))))));\ncustomElements.define('model-viewer', ModelViewerElement);\n//# sourceMappingURL=model-viewer.js.map"],"names":["global","issueWarning","trustedTypes","polyfillSupport","debugLogEvent","JSCompiler_renameProperty","defaultPropertyDeclaration","__decorate","this","_taskCache","GLTFMaterialsClearcoatExtension","GLTFMaterialsDispersionExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsAnisotropyExtension","GLTFMaterialsBumpExtension","GLTFMeshGpuInstancing","GLTFMaterialsUnlitExtension","WEBGL_CONSTANTS","PATH_PROPERTIES","Texture","Material","g","C","te","KHR_DF_FLAG_ALPHA_PREMULTIPLIED","read","VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT","VK_FORMAT_UNDEFINED","VK_FORMAT_R32G32B32A32_SFLOAT","VK_FORMAT_R16G16B16A16_SFLOAT","VK_FORMAT_R8G8B8A8_UNORM","VK_FORMAT_R8G8B8A8_SRGB","VK_FORMAT_R32G32_SFLOAT","VK_FORMAT_R16G16_SFLOAT","VK_FORMAT_R8G8_UNORM","VK_FORMAT_R8G8_SRGB","VK_FORMAT_R32_SFLOAT","VK_FORMAT_R16_SFLOAT","VK_FORMAT_R8_SRGB","VK_FORMAT_R8_UNORM","VK_FORMAT_ASTC_6x6_SRGB_BLOCK","VK_FORMAT_ASTC_6x6_UNORM_BLOCK","KHR_SUPERCOMPRESSION_ZSTD","ZSTDDecoder","KHR_SUPERCOMPRESSION_NONE","KHR_DF_PRIMARIES_BT709","KHR_DF_TRANSFER_SRGB","KHR_DF_PRIMARIES_DISPLAYP3","KHR_DF_PRIMARIES_UNSPECIFIED","_a","_b","vector2","_c","_d","vector3","SkeletonUtils.clone","$onUpdate","$threeTexture","$threeTextures","Image","$materials","Node","_e","_f","ModelViewerTexture"],"mappings":"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A;AACA;AACA;AACA,MAAM,CAAC;;AClCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,cAAe,IAAI,CAAC;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC;;AC/BP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,EAAE,OAAO;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ,EAAE,cAAc;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,EAAE,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC;AACA,MAAM,YAAY,GAAG,CAAC,UAAU,KAAK;AAC5C,IAAI,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC;AACtC,CAAC;;ACtXD;AACA;AACA,IAAI,cAAc,GAAG,CAAC,WAAW;;AAGjC;AACA;AACA,CAAC,IAAI,SAAS,GAAG,2kOAA2kO;AAC5lO,CAAC,IAAI,SAAS,GAAG,uxXAAuxX;;AAExyX,CAAC,IAAI,QAAQ,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CA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","x_google_ignoreList":[0,1,2,3,4,5,13,14,15,16,17,18,19,20,21,25,26,27,29,42,46,47,48,65,66,67,74,75]} \ No newline at end of file diff --git a/packages/model-viewer/dist/model-viewer.js b/packages/model-viewer/dist/model-viewer.js new file mode 100644 index 0000000..10c2c70 --- /dev/null +++ b/packages/model-viewer/dist/model-viewer.js @@ -0,0 +1,80896 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +const NODE_MODE = false; +// Allows minifiers to rename references to globalThis +const global$2 = globalThis; +/** + * Whether the current browser supports `adoptedStyleSheets`. + */ +const supportsAdoptingStyleSheets = global$2.ShadowRoot && + (global$2.ShadyCSS === undefined || global$2.ShadyCSS.nativeShadow) && + 'adoptedStyleSheets' in Document.prototype && + 'replace' in CSSStyleSheet.prototype; +const constructionToken = Symbol(); +const cssTagCache = new WeakMap(); +/** + * A container for a string of CSS text, that may be used to create a CSSStyleSheet. + * + * CSSResult is the return value of `css`-tagged template literals and + * `unsafeCSS()`. In order to ensure that CSSResults are only created via the + * `css` tag and `unsafeCSS()`, CSSResult cannot be constructed directly. + */ +class CSSResult { + constructor(cssText, strings, safeToken) { + // This property needs to remain unminified. + this['_$cssResult$'] = true; + if (safeToken !== constructionToken) { + throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.'); + } + this.cssText = cssText; + this._strings = strings; + } + // This is a getter so that it's lazy. In practice, this means stylesheets + // are not created until the first element instance is made. + get styleSheet() { + // If `supportsAdoptingStyleSheets` is true then we assume CSSStyleSheet is + // constructable. + let styleSheet = this._styleSheet; + const strings = this._strings; + if (supportsAdoptingStyleSheets && styleSheet === undefined) { + const cacheable = strings !== undefined && strings.length === 1; + if (cacheable) { + styleSheet = cssTagCache.get(strings); + } + if (styleSheet === undefined) { + (this._styleSheet = styleSheet = new CSSStyleSheet()).replaceSync(this.cssText); + if (cacheable) { + cssTagCache.set(strings, styleSheet); + } + } + } + return styleSheet; + } + toString() { + return this.cssText; + } +} +/** + * Wrap a value for interpolation in a {@linkcode css} tagged template literal. + * + * This is unsafe because untrusted CSS text can be used to phone home + * or exfiltrate data to an attacker controlled site. Take care to only use + * this with trusted input. + */ +const unsafeCSS = (value) => new CSSResult(typeof value === 'string' ? value : String(value), undefined, constructionToken); +/** + * Applies the given styles to a `shadowRoot`. When Shadow DOM is + * available but `adoptedStyleSheets` is not, styles are appended to the + * `shadowRoot` to [mimic spec behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets). + * Note, when shimming is used, any styles that are subsequently placed into + * the shadowRoot should be placed *before* any shimmed adopted styles. This + * will match spec behavior that gives adopted sheets precedence over styles in + * shadowRoot. + */ +const adoptStyles = (renderRoot, styles) => { + if (supportsAdoptingStyleSheets) { + renderRoot.adoptedStyleSheets = styles.map((s) => s instanceof CSSStyleSheet ? s : s.styleSheet); + } + else { + for (const s of styles) { + const style = document.createElement('style'); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const nonce = global$2['litNonce']; + if (nonce !== undefined) { + style.setAttribute('nonce', nonce); + } + style.textContent = s.cssText; + renderRoot.appendChild(style); + } + } +}; +const cssResultFromStyleSheet = (sheet) => { + let cssText = ''; + for (const rule of sheet.cssRules) { + cssText += rule.cssText; + } + return unsafeCSS(cssText); +}; +const getCompatibleStyle = supportsAdoptingStyleSheets || + (NODE_MODE) + ? (s) => s + : (s) => s instanceof CSSStyleSheet ? cssResultFromStyleSheet(s) : s; + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +/** + * Use this module if you want to create your own base class extending + * {@link ReactiveElement}. + * @packageDocumentation + */ +// TODO (justinfagnani): Add `hasOwn` here when we ship ES2022 +const { is, defineProperty, getOwnPropertyDescriptor, getOwnPropertyNames, getOwnPropertySymbols, getPrototypeOf, } = Object; +// Lets a minifier replace globalThis references with a minified name +const global$1 = globalThis; +let issueWarning$3; +const trustedTypes$1 = global$1 + .trustedTypes; +// Temporary workaround for https://crbug.com/993268 +// Currently, any attribute starting with "on" is considered to be a +// TrustedScript source. Such boolean attributes must be set to the equivalent +// trusted emptyScript value. +const emptyStringForBooleanAttribute = trustedTypes$1 + ? trustedTypes$1.emptyScript + : ''; +const polyfillSupport$2 = global$1.reactiveElementPolyfillSupportDevMode + ; +{ + // Ensure warnings are issued only 1x, even if multiple versions of Lit + // are loaded. + const issuedWarnings = (global$1.litIssuedWarnings ??= + new Set()); + // Issue a warning, if we haven't already. + issueWarning$3 = (code, warning) => { + warning += ` See https://lit.dev/msg/${code} for more information.`; + if (!issuedWarnings.has(warning)) { + console.warn(warning); + issuedWarnings.add(warning); + } + }; + issueWarning$3('dev-mode', `Lit is in dev mode. Not recommended for production!`); + // Issue polyfill support warning. + if (global$1.ShadyDOM?.inUse && polyfillSupport$2 === undefined) { + issueWarning$3('polyfill-support-missing', `Shadow DOM is being polyfilled via \`ShadyDOM\` but ` + + `the \`polyfill-support\` module has not been loaded.`); + } +} +/** + * Useful for visualizing and logging insights into what the Lit template system is doing. + * + * Compiled out of prod mode builds. + */ +const debugLogEvent$1 = (event) => { + const shouldEmit = global$1 + .emitLitDebugLogEvents; + if (!shouldEmit) { + return; + } + global$1.dispatchEvent(new CustomEvent('lit-debug', { + detail: event, + })); + } + ; +/* + * When using Closure Compiler, JSCompiler_renameProperty(property, object) is + * replaced at compile time by the munged name for object[property]. We cannot + * alias this function, so we have to use a small shim that has the same + * behavior when not compiling. + */ +/*@__INLINE__*/ +const JSCompiler_renameProperty$1 = (prop, _obj) => prop; +const defaultConverter = { + toAttribute(value, type) { + switch (type) { + case Boolean: + value = value ? emptyStringForBooleanAttribute : null; + break; + case Object: + case Array: + // if the value is `null` or `undefined` pass this through + // to allow removing/no change behavior. + value = value == null ? value : JSON.stringify(value); + break; + } + return value; + }, + fromAttribute(value, type) { + let fromValue = value; + switch (type) { + case Boolean: + fromValue = value !== null; + break; + case Number: + fromValue = value === null ? null : Number(value); + break; + case Object: + case Array: + // Do *not* generate exception when invalid JSON is set as elements + // don't normally complain on being mis-configured. + // TODO(sorvell): Do generate exception in *dev mode*. + try { + // Assert to adhere to Bazel's "must type assert JSON parse" rule. + fromValue = JSON.parse(value); + } + catch (e) { + fromValue = null; + } + break; + } + return fromValue; + }, +}; +/** + * Change function that returns true if `value` is different from `oldValue`. + * This method is used as the default for a property's `hasChanged` function. + */ +const notEqual = (value, old) => !is(value, old); +const defaultPropertyDeclaration$1 = { + attribute: true, + type: String, + converter: defaultConverter, + reflect: false, + hasChanged: notEqual, +}; +// Ensure metadata is enabled. TypeScript does not polyfill +// Symbol.metadata, so we must ensure that it exists. +Symbol.metadata ??= Symbol('metadata'); +// Map from a class's metadata object to property options +// Note that we must use nullish-coalescing assignment so that we only use one +// map even if we load multiple version of this module. +global$1.litPropertyMetadata ??= new WeakMap(); +/** + * Base element class which manages element properties and attributes. When + * properties change, the `update` method is asynchronously called. This method + * should be supplied by subclasses to render updates as desired. + * @noInheritDoc + */ +class ReactiveElement +// In the Node build, this `extends` clause will be substituted with +// `(globalThis.HTMLElement ?? HTMLElement)`. +// +// This way, we will first prefer any global `HTMLElement` polyfill that the +// user has assigned, and then fall back to the `HTMLElement` shim which has +// been imported (see note at the top of this file about how this import is +// generated by Rollup). Note that the `HTMLElement` variable has been +// shadowed by this import, so it no longer refers to the global. + extends HTMLElement { + /** + * Adds an initializer function to the class that is called during instance + * construction. + * + * This is useful for code that runs against a `ReactiveElement` + * subclass, such as a decorator, that needs to do work for each + * instance, such as setting up a `ReactiveController`. + * + * ```ts + * const myDecorator = (target: typeof ReactiveElement, key: string) => { + * target.addInitializer((instance: ReactiveElement) => { + * // This is run during construction of the element + * new MyController(instance); + * }); + * } + * ``` + * + * Decorating a field will then cause each instance to run an initializer + * that adds a controller: + * + * ```ts + * class MyElement extends LitElement { + * @myDecorator foo; + * } + * ``` + * + * Initializers are stored per-constructor. Adding an initializer to a + * subclass does not add it to a superclass. Since initializers are run in + * constructors, initializers will run in order of the class hierarchy, + * starting with superclasses and progressing to the instance's class. + * + * @nocollapse + */ + static addInitializer(initializer) { + this.__prepare(); + (this._initializers ??= []).push(initializer); + } + /** + * Returns a list of attributes corresponding to the registered properties. + * @nocollapse + * @category attributes + */ + static get observedAttributes() { + // Ensure we've created all properties + this.finalize(); + // this.__attributeToPropertyMap is only undefined after finalize() in + // ReactiveElement itself. ReactiveElement.observedAttributes is only + // accessed with ReactiveElement as the receiver when a subclass or mixin + // calls super.observedAttributes + return (this.__attributeToPropertyMap && [...this.__attributeToPropertyMap.keys()]); + } + /** + * Creates a property accessor on the element prototype if one does not exist + * and stores a {@linkcode PropertyDeclaration} for the property with the + * given options. The property setter calls the property's `hasChanged` + * property option or uses a strict identity check to determine whether or not + * to request an update. + * + * This method may be overridden to customize properties; however, + * when doing so, it's important to call `super.createProperty` to ensure + * the property is setup correctly. This method calls + * `getPropertyDescriptor` internally to get a descriptor to install. + * To customize what properties do when they are get or set, override + * `getPropertyDescriptor`. To customize the options for a property, + * implement `createProperty` like this: + * + * ```ts + * static createProperty(name, options) { + * options = Object.assign(options, {myOption: true}); + * super.createProperty(name, options); + * } + * ``` + * + * @nocollapse + * @category properties + */ + static createProperty(name, options = defaultPropertyDeclaration$1) { + // If this is a state property, force the attribute to false. + if (options.state) { + options.attribute = false; + } + this.__prepare(); + this.elementProperties.set(name, options); + if (!options.noAccessor) { + const key = // Use Symbol.for in dev mode to make it easier to maintain state + // when doing HMR. + Symbol.for(`${String(name)} (@property() cache)`) + ; + const descriptor = this.getPropertyDescriptor(name, key, options); + if (descriptor !== undefined) { + defineProperty(this.prototype, name, descriptor); + } + } + } + /** + * Returns a property descriptor to be defined on the given named property. + * If no descriptor is returned, the property will not become an accessor. + * For example, + * + * ```ts + * class MyElement extends LitElement { + * static getPropertyDescriptor(name, key, options) { + * const defaultDescriptor = + * super.getPropertyDescriptor(name, key, options); + * const setter = defaultDescriptor.set; + * return { + * get: defaultDescriptor.get, + * set(value) { + * setter.call(this, value); + * // custom action. + * }, + * configurable: true, + * enumerable: true + * } + * } + * } + * ``` + * + * @nocollapse + * @category properties + */ + static getPropertyDescriptor(name, key, options) { + const { get, set } = getOwnPropertyDescriptor(this.prototype, name) ?? { + get() { + return this[key]; + }, + set(v) { + this[key] = v; + }, + }; + if (get == null) { + if ('value' in (getOwnPropertyDescriptor(this.prototype, name) ?? {})) { + throw new Error(`Field ${JSON.stringify(String(name))} on ` + + `${this.name} was declared as a reactive property ` + + `but it's actually declared as a value on the prototype. ` + + `Usually this is due to using @property or @state on a method.`); + } + issueWarning$3('reactive-property-without-getter', `Field ${JSON.stringify(String(name))} on ` + + `${this.name} was declared as a reactive property ` + + `but it does not have a getter. This will be an error in a ` + + `future version of Lit.`); + } + return { + get() { + return get?.call(this); + }, + set(value) { + const oldValue = get?.call(this); + set.call(this, value); + this.requestUpdate(name, oldValue, options); + }, + configurable: true, + enumerable: true, + }; + } + /** + * Returns the property options associated with the given property. + * These options are defined with a `PropertyDeclaration` via the `properties` + * object or the `@property` decorator and are registered in + * `createProperty(...)`. + * + * Note, this method should be considered "final" and not overridden. To + * customize the options for a given property, override + * {@linkcode createProperty}. + * + * @nocollapse + * @final + * @category properties + */ + static getPropertyOptions(name) { + return this.elementProperties.get(name) ?? defaultPropertyDeclaration$1; + } + /** + * Initializes static own properties of the class used in bookkeeping + * for element properties, initializers, etc. + * + * Can be called multiple times by code that needs to ensure these + * properties exist before using them. + * + * This method ensures the superclass is finalized so that inherited + * property metadata can be copied down. + * @nocollapse + */ + static __prepare() { + if (this.hasOwnProperty(JSCompiler_renameProperty$1('elementProperties'))) { + // Already prepared + return; + } + // Finalize any superclasses + const superCtor = getPrototypeOf(this); + superCtor.finalize(); + // Create own set of initializers for this class if any exist on the + // superclass and copy them down. Note, for a small perf boost, avoid + // creating initializers unless needed. + if (superCtor._initializers !== undefined) { + this._initializers = [...superCtor._initializers]; + } + // Initialize elementProperties from the superclass + this.elementProperties = new Map(superCtor.elementProperties); + } + /** + * Finishes setting up the class so that it's ready to be registered + * as a custom element and instantiated. + * + * This method is called by the ReactiveElement.observedAttributes getter. + * If you override the observedAttributes getter, you must either call + * super.observedAttributes to trigger finalization, or call finalize() + * yourself. + * + * @nocollapse + */ + static finalize() { + if (this.hasOwnProperty(JSCompiler_renameProperty$1('finalized'))) { + return; + } + this.finalized = true; + this.__prepare(); + // Create properties from the static properties block: + if (this.hasOwnProperty(JSCompiler_renameProperty$1('properties'))) { + const props = this.properties; + const propKeys = [ + ...getOwnPropertyNames(props), + ...getOwnPropertySymbols(props), + ]; + for (const p of propKeys) { + this.createProperty(p, props[p]); + } + } + // Create properties from standard decorator metadata: + const metadata = this[Symbol.metadata]; + if (metadata !== null) { + const properties = litPropertyMetadata.get(metadata); + if (properties !== undefined) { + for (const [p, options] of properties) { + this.elementProperties.set(p, options); + } + } + } + // Create the attribute-to-property map + this.__attributeToPropertyMap = new Map(); + for (const [p, options] of this.elementProperties) { + const attr = this.__attributeNameForProperty(p, options); + if (attr !== undefined) { + this.__attributeToPropertyMap.set(attr, p); + } + } + this.elementStyles = this.finalizeStyles(this.styles); + { + if (this.hasOwnProperty('createProperty')) { + issueWarning$3('no-override-create-property', 'Overriding ReactiveElement.createProperty() is deprecated. ' + + 'The override will not be called with standard decorators'); + } + if (this.hasOwnProperty('getPropertyDescriptor')) { + issueWarning$3('no-override-get-property-descriptor', 'Overriding ReactiveElement.getPropertyDescriptor() is deprecated. ' + + 'The override will not be called with standard decorators'); + } + } + } + /** + * Takes the styles the user supplied via the `static styles` property and + * returns the array of styles to apply to the element. + * Override this method to integrate into a style management system. + * + * Styles are deduplicated preserving the _last_ instance in the list. This + * is a performance optimization to avoid duplicated styles that can occur + * especially when composing via subclassing. The last item is kept to try + * to preserve the cascade order with the assumption that it's most important + * that last added styles override previous styles. + * + * @nocollapse + * @category styles + */ + static finalizeStyles(styles) { + const elementStyles = []; + if (Array.isArray(styles)) { + // Dedupe the flattened array in reverse order to preserve the last items. + // Casting to Array works around TS error that + // appears to come from trying to flatten a type CSSResultArray. + const set = new Set(styles.flat(Infinity).reverse()); + // Then preserve original order by adding the set items in reverse order. + for (const s of set) { + elementStyles.unshift(getCompatibleStyle(s)); + } + } + else if (styles !== undefined) { + elementStyles.push(getCompatibleStyle(styles)); + } + return elementStyles; + } + /** + * Returns the property name for the given attribute `name`. + * @nocollapse + */ + static __attributeNameForProperty(name, options) { + const attribute = options.attribute; + return attribute === false + ? undefined + : typeof attribute === 'string' + ? attribute + : typeof name === 'string' + ? name.toLowerCase() + : undefined; + } + constructor() { + super(); + this.__instanceProperties = undefined; + /** + * True if there is a pending update as a result of calling `requestUpdate()`. + * Should only be read. + * @category updates + */ + this.isUpdatePending = false; + /** + * Is set to `true` after the first update. The element code cannot assume + * that `renderRoot` exists before the element `hasUpdated`. + * @category updates + */ + this.hasUpdated = false; + /** + * Name of currently reflecting property + */ + this.__reflectingProperty = null; + this.__initialize(); + } + /** + * Internal only override point for customizing work done when elements + * are constructed. + */ + __initialize() { + this.__updatePromise = new Promise((res) => (this.enableUpdating = res)); + this._$changedProperties = new Map(); + // This enqueues a microtask that ust run before the first update, so it + // must be called before requestUpdate() + this.__saveInstanceProperties(); + // ensures first update will be caught by an early access of + // `updateComplete` + this.requestUpdate(); + this.constructor._initializers?.forEach((i) => i(this)); + } + /** + * Registers a `ReactiveController` to participate in the element's reactive + * update cycle. The element automatically calls into any registered + * controllers during its lifecycle callbacks. + * + * If the element is connected when `addController()` is called, the + * controller's `hostConnected()` callback will be immediately called. + * @category controllers + */ + addController(controller) { + (this.__controllers ??= new Set()).add(controller); + // If a controller is added after the element has been connected, + // call hostConnected. Note, re-using existence of `renderRoot` here + // (which is set in connectedCallback) to avoid the need to track a + // first connected state. + if (this.renderRoot !== undefined && this.isConnected) { + controller.hostConnected?.(); + } + } + /** + * Removes a `ReactiveController` from the element. + * @category controllers + */ + removeController(controller) { + this.__controllers?.delete(controller); + } + /** + * Fixes any properties set on the instance before upgrade time. + * Otherwise these would shadow the accessor and break these properties. + * The properties are stored in a Map which is played back after the + * constructor runs. Note, on very old versions of Safari (<=9) or Chrome + * (<=41), properties created for native platform properties like (`id` or + * `name`) may not have default values set in the element constructor. On + * these browsers native properties appear on instances and therefore their + * default value will overwrite any element default (e.g. if the element sets + * this.id = 'id' in the constructor, the 'id' will become '' since this is + * the native platform default). + */ + __saveInstanceProperties() { + const instanceProperties = new Map(); + const elementProperties = this.constructor + .elementProperties; + for (const p of elementProperties.keys()) { + if (this.hasOwnProperty(p)) { + instanceProperties.set(p, this[p]); + delete this[p]; + } + } + if (instanceProperties.size > 0) { + this.__instanceProperties = instanceProperties; + } + } + /** + * Returns the node into which the element should render and by default + * creates and returns an open shadowRoot. Implement to customize where the + * element's DOM is rendered. For example, to render into the element's + * childNodes, return `this`. + * + * @return Returns a node into which to render. + * @category rendering + */ + createRenderRoot() { + const renderRoot = this.shadowRoot ?? + this.attachShadow(this.constructor.shadowRootOptions); + adoptStyles(renderRoot, this.constructor.elementStyles); + return renderRoot; + } + /** + * On first connection, creates the element's renderRoot, sets up + * element styling, and enables updating. + * @category lifecycle + */ + connectedCallback() { + // Create renderRoot before controllers `hostConnected` + this.renderRoot ??= + this.createRenderRoot(); + this.enableUpdating(true); + this.__controllers?.forEach((c) => c.hostConnected?.()); + } + /** + * Note, this method should be considered final and not overridden. It is + * overridden on the element instance with a function that triggers the first + * update. + * @category updates + */ + enableUpdating(_requestedUpdate) { } + /** + * Allows for `super.disconnectedCallback()` in extensions while + * reserving the possibility of making non-breaking feature additions + * when disconnecting at some point in the future. + * @category lifecycle + */ + disconnectedCallback() { + this.__controllers?.forEach((c) => c.hostDisconnected?.()); + } + /** + * Synchronizes property values when attributes change. + * + * Specifically, when an attribute is set, the corresponding property is set. + * You should rarely need to implement this callback. If this method is + * overridden, `super.attributeChangedCallback(name, _old, value)` must be + * called. + * + * See [using the lifecycle callbacks](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks) + * on MDN for more information about the `attributeChangedCallback`. + * @category attributes + */ + attributeChangedCallback(name, _old, value) { + this._$attributeToProperty(name, value); + } + __propertyToAttribute(name, value) { + const elemProperties = this.constructor.elementProperties; + const options = elemProperties.get(name); + const attr = this.constructor.__attributeNameForProperty(name, options); + if (attr !== undefined && options.reflect === true) { + const converter = options.converter?.toAttribute !== + undefined + ? options.converter + : defaultConverter; + const attrValue = converter.toAttribute(value, options.type); + if (this.constructor.enabledWarnings.includes('migration') && + attrValue === undefined) { + issueWarning$3('undefined-attribute-value', `The attribute value for the ${name} property is ` + + `undefined on element ${this.localName}. The attribute will be ` + + `removed, but in the previous version of \`ReactiveElement\`, ` + + `the attribute would not have changed.`); + } + // Track if the property is being reflected to avoid + // setting the property again via `attributeChangedCallback`. Note: + // 1. this takes advantage of the fact that the callback is synchronous. + // 2. will behave incorrectly if multiple attributes are in the reaction + // stack at time of calling. However, since we process attributes + // in `update` this should not be possible (or an extreme corner case + // that we'd like to discover). + // mark state reflecting + this.__reflectingProperty = name; + if (attrValue == null) { + this.removeAttribute(attr); + } + else { + this.setAttribute(attr, attrValue); + } + // mark state not reflecting + this.__reflectingProperty = null; + } + } + /** @internal */ + _$attributeToProperty(name, value) { + const ctor = this.constructor; + // Note, hint this as an `AttributeMap` so closure clearly understands + // the type; it has issues with tracking types through statics + const propName = ctor.__attributeToPropertyMap.get(name); + // Use tracking info to avoid reflecting a property value to an attribute + // if it was just set because the attribute changed. + if (propName !== undefined && this.__reflectingProperty !== propName) { + const options = ctor.getPropertyOptions(propName); + const converter = typeof options.converter === 'function' + ? { fromAttribute: options.converter } + : options.converter?.fromAttribute !== undefined + ? options.converter + : defaultConverter; + // mark state reflecting + this.__reflectingProperty = propName; + this[propName] = converter.fromAttribute(value, options.type + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ); + // mark state not reflecting + this.__reflectingProperty = null; + } + } + /** + * Requests an update which is processed asynchronously. This should be called + * when an element should update based on some state not triggered by setting + * a reactive property. In this case, pass no arguments. It should also be + * called when manually implementing a property setter. In this case, pass the + * property `name` and `oldValue` to ensure that any configured property + * options are honored. + * + * @param name name of requesting property + * @param oldValue old value of requesting property + * @param options property options to use instead of the previously + * configured options + * @category updates + */ + requestUpdate(name, oldValue, options) { + // If we have a property key, perform property update steps. + if (name !== undefined) { + if (name instanceof Event) { + issueWarning$3(``, `The requestUpdate() method was called with an Event as the property name. This is probably a mistake caused by binding this.requestUpdate as an event listener. Instead bind a function that will call it with no arguments: () => this.requestUpdate()`); + } + options ??= this.constructor.getPropertyOptions(name); + const hasChanged = options.hasChanged ?? notEqual; + const newValue = this[name]; + if (hasChanged(newValue, oldValue)) { + this._$changeProperty(name, oldValue, options); + } + else { + // Abort the request if the property should not be considered changed. + return; + } + } + if (this.isUpdatePending === false) { + this.__updatePromise = this.__enqueueUpdate(); + } + } + /** + * @internal + */ + _$changeProperty(name, oldValue, options) { + // TODO (justinfagnani): Create a benchmark of Map.has() + Map.set( + // vs just Map.set() + if (!this._$changedProperties.has(name)) { + this._$changedProperties.set(name, oldValue); + } + // Add to reflecting properties set. + // Note, it's important that every change has a chance to add the + // property to `__reflectingProperties`. This ensures setting + // attribute + property reflects correctly. + if (options.reflect === true && this.__reflectingProperty !== name) { + (this.__reflectingProperties ??= new Set()).add(name); + } + } + /** + * Sets up the element to asynchronously update. + */ + async __enqueueUpdate() { + this.isUpdatePending = true; + try { + // Ensure any previous update has resolved before updating. + // This `await` also ensures that property changes are batched. + await this.__updatePromise; + } + catch (e) { + // Refire any previous errors async so they do not disrupt the update + // cycle. Errors are refired so developers have a chance to observe + // them, and this can be done by implementing + // `window.onunhandledrejection`. + Promise.reject(e); + } + const result = this.scheduleUpdate(); + // If `scheduleUpdate` returns a Promise, we await it. This is done to + // enable coordinating updates with a scheduler. Note, the result is + // checked to avoid delaying an additional microtask unless we need to. + if (result != null) { + await result; + } + return !this.isUpdatePending; + } + /** + * Schedules an element update. You can override this method to change the + * timing of updates by returning a Promise. The update will await the + * returned Promise, and you should resolve the Promise to allow the update + * to proceed. If this method is overridden, `super.scheduleUpdate()` + * must be called. + * + * For instance, to schedule updates to occur just before the next frame: + * + * ```ts + * override protected async scheduleUpdate(): Promise { + * await new Promise((resolve) => requestAnimationFrame(() => resolve())); + * super.scheduleUpdate(); + * } + * ``` + * @category updates + */ + scheduleUpdate() { + const result = this.performUpdate(); + if (this.constructor.enabledWarnings.includes('async-perform-update') && + typeof result?.then === + 'function') { + issueWarning$3('async-perform-update', `Element ${this.localName} returned a Promise from performUpdate(). ` + + `This behavior is deprecated and will be removed in a future ` + + `version of ReactiveElement.`); + } + return result; + } + /** + * Performs an element update. Note, if an exception is thrown during the + * update, `firstUpdated` and `updated` will not be called. + * + * Call `performUpdate()` to immediately process a pending update. This should + * generally not be needed, but it can be done in rare cases when you need to + * update synchronously. + * + * @category updates + */ + performUpdate() { + // Abort any update if one is not pending when this is called. + // This can happen if `performUpdate` is called early to "flush" + // the update. + if (!this.isUpdatePending) { + return; + } + debugLogEvent$1?.({ kind: 'update' }); + if (!this.hasUpdated) { + // Create renderRoot before first update. This occurs in `connectedCallback` + // but is done here to support out of tree calls to `enableUpdating`/`performUpdate`. + this.renderRoot ??= + this.createRenderRoot(); + { + // Produce warning if any reactive properties on the prototype are + // shadowed by class fields. Instance fields set before upgrade are + // deleted by this point, so any own property is caused by class field + // initialization in the constructor. + const ctor = this.constructor; + const shadowedProperties = [...ctor.elementProperties.keys()].filter((p) => this.hasOwnProperty(p) && p in getPrototypeOf(this)); + if (shadowedProperties.length) { + throw new Error(`The following properties on element ${this.localName} will not ` + + `trigger updates as expected because they are set using class ` + + `fields: ${shadowedProperties.join(', ')}. ` + + `Native class fields and some compiled output will overwrite ` + + `accessors used for detecting changes. See ` + + `https://lit.dev/msg/class-field-shadowing ` + + `for more information.`); + } + } + // Mixin instance properties once, if they exist. + if (this.__instanceProperties) { + // TODO (justinfagnani): should we use the stored value? Could a new value + // have been set since we stored the own property value? + for (const [p, value] of this.__instanceProperties) { + this[p] = value; + } + this.__instanceProperties = undefined; + } + // Trigger initial value reflection and populate the initial + // changedProperties map, but only for the case of experimental + // decorators on accessors, which will not have already populated the + // changedProperties map. We can't know if these accessors had + // initializers, so we just set them anyway - a difference from + // experimental decorators on fields and standard decorators on + // auto-accessors. + // For context why experimentalDecorators with auto accessors are handled + // specifically also see: + // https://github.com/lit/lit/pull/4183#issuecomment-1711959635 + const elementProperties = this.constructor + .elementProperties; + if (elementProperties.size > 0) { + for (const [p, options] of elementProperties) { + if (options.wrapped === true && + !this._$changedProperties.has(p) && + this[p] !== undefined) { + this._$changeProperty(p, this[p], options); + } + } + } + } + let shouldUpdate = false; + const changedProperties = this._$changedProperties; + try { + shouldUpdate = this.shouldUpdate(changedProperties); + if (shouldUpdate) { + this.willUpdate(changedProperties); + this.__controllers?.forEach((c) => c.hostUpdate?.()); + this.update(changedProperties); + } + else { + this.__markUpdated(); + } + } + catch (e) { + // Prevent `firstUpdated` and `updated` from running when there's an + // update exception. + shouldUpdate = false; + // Ensure element can accept additional updates after an exception. + this.__markUpdated(); + throw e; + } + // The update is no longer considered pending and further updates are now allowed. + if (shouldUpdate) { + this._$didUpdate(changedProperties); + } + } + /** + * Invoked before `update()` to compute values needed during the update. + * + * Implement `willUpdate` to compute property values that depend on other + * properties and are used in the rest of the update process. + * + * ```ts + * willUpdate(changedProperties) { + * // only need to check changed properties for an expensive computation. + * if (changedProperties.has('firstName') || changedProperties.has('lastName')) { + * this.sha = computeSHA(`${this.firstName} ${this.lastName}`); + * } + * } + * + * render() { + * return html`SHA: ${this.sha}`; + * } + * ``` + * + * @category updates + */ + willUpdate(_changedProperties) { } + // Note, this is an override point for polyfill-support. + // @internal + _$didUpdate(changedProperties) { + this.__controllers?.forEach((c) => c.hostUpdated?.()); + if (!this.hasUpdated) { + this.hasUpdated = true; + this.firstUpdated(changedProperties); + } + this.updated(changedProperties); + if (this.isUpdatePending && + this.constructor.enabledWarnings.includes('change-in-update')) { + issueWarning$3('change-in-update', `Element ${this.localName} scheduled an update ` + + `(generally because a property was set) ` + + `after an update completed, causing a new update to be scheduled. ` + + `This is inefficient and should be avoided unless the next update ` + + `can only be scheduled as a side effect of the previous update.`); + } + } + __markUpdated() { + this._$changedProperties = new Map(); + this.isUpdatePending = false; + } + /** + * Returns a Promise that resolves when the element has completed updating. + * The Promise value is a boolean that is `true` if the element completed the + * update without triggering another update. The Promise result is `false` if + * a property was set inside `updated()`. If the Promise is rejected, an + * exception was thrown during the update. + * + * To await additional asynchronous work, override the `getUpdateComplete` + * method. For example, it is sometimes useful to await a rendered element + * before fulfilling this Promise. To do this, first await + * `super.getUpdateComplete()`, then any subsequent state. + * + * @return A promise of a boolean that resolves to true if the update completed + * without triggering another update. + * @category updates + */ + get updateComplete() { + return this.getUpdateComplete(); + } + /** + * Override point for the `updateComplete` promise. + * + * It is not safe to override the `updateComplete` getter directly due to a + * limitation in TypeScript which means it is not possible to call a + * superclass getter (e.g. `super.updateComplete.then(...)`) when the target + * language is ES5 (https://github.com/microsoft/TypeScript/issues/338). + * This method should be overridden instead. For example: + * + * ```ts + * class MyElement extends LitElement { + * override async getUpdateComplete() { + * const result = await super.getUpdateComplete(); + * await this._myChild.updateComplete; + * return result; + * } + * } + * ``` + * + * @return A promise of a boolean that resolves to true if the update completed + * without triggering another update. + * @category updates + */ + getUpdateComplete() { + return this.__updatePromise; + } + /** + * Controls whether or not `update()` should be called when the element requests + * an update. By default, this method always returns `true`, but this can be + * customized to control when to update. + * + * @param _changedProperties Map of changed properties with old values + * @category updates + */ + shouldUpdate(_changedProperties) { + return true; + } + /** + * Updates the element. This method reflects property values to attributes. + * It can be overridden to render and keep updated element DOM. + * Setting properties inside this method will *not* trigger + * another update. + * + * @param _changedProperties Map of changed properties with old values + * @category updates + */ + update(_changedProperties) { + // The forEach() expression will only run when when __reflectingProperties is + // defined, and it returns undefined, setting __reflectingProperties to + // undefined + this.__reflectingProperties &&= this.__reflectingProperties.forEach((p) => this.__propertyToAttribute(p, this[p])); + this.__markUpdated(); + } + /** + * Invoked whenever the element is updated. Implement to perform + * post-updating tasks via DOM APIs, for example, focusing an element. + * + * Setting properties inside this method will trigger the element to update + * again after this update cycle completes. + * + * @param _changedProperties Map of changed properties with old values + * @category updates + */ + updated(_changedProperties) { } + /** + * Invoked when the element is first updated. Implement to perform one time + * work on the element after update. + * + * ```ts + * firstUpdated() { + * this.renderRoot.getElementById('my-text-area').focus(); + * } + * ``` + * + * Setting properties inside this method will trigger the element to update + * again after this update cycle completes. + * + * @param _changedProperties Map of changed properties with old values + * @category updates + */ + firstUpdated(_changedProperties) { } +} +/** + * Memoized list of all element styles. + * Created lazily on user subclasses when finalizing the class. + * @nocollapse + * @category styles + */ +ReactiveElement.elementStyles = []; +/** + * Options used when calling `attachShadow`. Set this property to customize + * the options for the shadowRoot; for example, to create a closed + * shadowRoot: `{mode: 'closed'}`. + * + * Note, these options are used in `createRenderRoot`. If this method + * is customized, options should be respected if possible. + * @nocollapse + * @category rendering + */ +ReactiveElement.shadowRootOptions = { mode: 'open' }; +// Assigned here to work around a jscompiler bug with static fields +// when compiling to ES5. +// https://github.com/google/closure-compiler/issues/3177 +ReactiveElement[JSCompiler_renameProperty$1('elementProperties')] = new Map(); +ReactiveElement[JSCompiler_renameProperty$1('finalized')] = new Map(); +// Apply polyfills if available +polyfillSupport$2?.({ ReactiveElement }); +// Dev mode warnings... +{ + // Default warning set. + ReactiveElement.enabledWarnings = [ + 'change-in-update', + 'async-perform-update', + ]; + const ensureOwnWarnings = function (ctor) { + if (!ctor.hasOwnProperty(JSCompiler_renameProperty$1('enabledWarnings'))) { + ctor.enabledWarnings = ctor.enabledWarnings.slice(); + } + }; + ReactiveElement.enableWarning = function (warning) { + ensureOwnWarnings(this); + if (!this.enabledWarnings.includes(warning)) { + this.enabledWarnings.push(warning); + } + }; + ReactiveElement.disableWarning = function (warning) { + ensureOwnWarnings(this); + const i = this.enabledWarnings.indexOf(warning); + if (i >= 0) { + this.enabledWarnings.splice(i, 1); + } + }; +} +// IMPORTANT: do not change the property name or the assignment expression. +// This line will be used in regexes to search for ReactiveElement usage. +(global$1.reactiveElementVersions ??= []).push('2.0.4'); +if (global$1.reactiveElementVersions.length > 1) { + issueWarning$3('multiple-versions', `Multiple versions of Lit loaded. Loading multiple versions ` + + `is not recommended.`); +} + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +/* + * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all + * property decorators (but not class decorators) in this file that have + * an @ExportDecoratedItems annotation must be defined as a regular function, + * not an arrow function. + */ +let issueWarning$2; +{ + // Ensure warnings are issued only 1x, even if multiple versions of Lit + // are loaded. + const issuedWarnings = (globalThis.litIssuedWarnings ??= new Set()); + // Issue a warning, if we haven't already. + issueWarning$2 = (code, warning) => { + warning += ` See https://lit.dev/msg/${code} for more information.`; + if (!issuedWarnings.has(warning)) { + console.warn(warning); + issuedWarnings.add(warning); + } + }; +} +const legacyProperty = (options, proto, name) => { + const hasOwnProperty = proto.hasOwnProperty(name); + proto.constructor.createProperty(name, hasOwnProperty ? { ...options, wrapped: true } : options); + // For accessors (which have a descriptor on the prototype) we need to + // return a descriptor, otherwise TypeScript overwrites the descriptor we + // define in createProperty() with the original descriptor. We don't do this + // for fields, which don't have a descriptor, because this could overwrite + // descriptor defined by other decorators. + return hasOwnProperty + ? Object.getOwnPropertyDescriptor(proto, name) + : undefined; +}; +// This is duplicated from a similar variable in reactive-element.ts, but +// actually makes sense to have this default defined with the decorator, so +// that different decorators could have different defaults. +const defaultPropertyDeclaration = { + attribute: true, + type: String, + converter: defaultConverter, + reflect: false, + hasChanged: notEqual, +}; +/** + * Wraps a class accessor or setter so that `requestUpdate()` is called with the + * property name and old value when the accessor is set. + */ +const standardProperty = (options = defaultPropertyDeclaration, target, context) => { + const { kind, metadata } = context; + if (metadata == null) { + issueWarning$2('missing-class-metadata', `The class ${target} is missing decorator metadata. This ` + + `could mean that you're using a compiler that supports decorators ` + + `but doesn't support decorator metadata, such as TypeScript 5.1. ` + + `Please update your compiler.`); + } + // Store the property options + let properties = globalThis.litPropertyMetadata.get(metadata); + if (properties === undefined) { + globalThis.litPropertyMetadata.set(metadata, (properties = new Map())); + } + properties.set(context.name, options); + if (kind === 'accessor') { + // Standard decorators cannot dynamically modify the class, so we can't + // replace a field with accessors. The user must use the new `accessor` + // keyword instead. + const { name } = context; + return { + set(v) { + const oldValue = target.get.call(this); + target.set.call(this, v); + this.requestUpdate(name, oldValue, options); + }, + init(v) { + if (v !== undefined) { + this._$changeProperty(name, undefined, options); + } + return v; + }, + }; + } + else if (kind === 'setter') { + const { name } = context; + return function (value) { + const oldValue = this[name]; + target.call(this, value); + this.requestUpdate(name, oldValue, options); + }; + } + throw new Error(`Unsupported decorator location: ${kind}`); +}; +/** + * A class field or accessor decorator which creates a reactive property that + * reflects a corresponding attribute value. When a decorated property is set + * the element will update and render. A {@linkcode PropertyDeclaration} may + * optionally be supplied to configure property features. + * + * This decorator should only be used for public fields. As public fields, + * properties should be considered as primarily settable by element users, + * either via attribute or the property itself. + * + * Generally, properties that are changed by the element should be private or + * protected fields and should use the {@linkcode state} decorator. + * + * However, sometimes element code does need to set a public property. This + * should typically only be done in response to user interaction, and an event + * should be fired informing the user; for example, a checkbox sets its + * `checked` property when clicked and fires a `changed` event. Mutating public + * properties should typically not be done for non-primitive (object or array) + * properties. In other cases when an element needs to manage state, a private + * property decorated via the {@linkcode state} decorator should be used. When + * needed, state properties can be initialized via public properties to + * facilitate complex interactions. + * + * ```ts + * class MyElement { + * @property({ type: Boolean }) + * clicked = false; + * } + * ``` + * @category Decorator + * @ExportDecoratedItems + */ +function property(options) { + return (protoOrTarget, nameOrContext + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) => { + return (typeof nameOrContext === 'object' + ? standardProperty(options, protoOrTarget, nameOrContext) + : legacyProperty(options, protoOrTarget, nameOrContext)); + }; +} + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +{ + // Ensure warnings are issued only 1x, even if multiple versions of Lit + // are loaded. + (globalThis.litIssuedWarnings ??= new Set()); +} + +/** + * @license + * Copyright 2010-2025 Three.js Authors + * SPDX-License-Identifier: MIT + */ +const REVISION = '174'; +const CullFaceNone = 0; +const CullFaceBack = 1; +const CullFaceFront = 2; +const PCFShadowMap = 1; +const PCFSoftShadowMap = 2; +const VSMShadowMap = 3; +const FrontSide = 0; +const BackSide = 1; +const DoubleSide = 2; +const NoBlending = 0; +const NormalBlending = 1; +const AdditiveBlending = 2; +const SubtractiveBlending = 3; +const MultiplyBlending = 4; +const CustomBlending = 5; +const AddEquation = 100; +const SubtractEquation = 101; +const ReverseSubtractEquation = 102; +const MinEquation = 103; +const MaxEquation = 104; +const ZeroFactor = 200; +const OneFactor = 201; +const SrcColorFactor = 202; +const OneMinusSrcColorFactor = 203; +const SrcAlphaFactor = 204; +const OneMinusSrcAlphaFactor = 205; +const DstAlphaFactor = 206; +const OneMinusDstAlphaFactor = 207; +const DstColorFactor = 208; +const OneMinusDstColorFactor = 209; +const SrcAlphaSaturateFactor = 210; +const ConstantColorFactor = 211; +const OneMinusConstantColorFactor = 212; +const ConstantAlphaFactor = 213; +const OneMinusConstantAlphaFactor = 214; +const NeverDepth = 0; +const AlwaysDepth = 1; +const LessDepth = 2; +const LessEqualDepth = 3; +const EqualDepth = 4; +const GreaterEqualDepth = 5; +const GreaterDepth = 6; +const NotEqualDepth = 7; +const MultiplyOperation = 0; +const MixOperation = 1; +const AddOperation = 2; +const NoToneMapping = 0; +const LinearToneMapping = 1; +const ReinhardToneMapping = 2; +const CineonToneMapping = 3; +const ACESFilmicToneMapping = 4; +const CustomToneMapping = 5; +const AgXToneMapping = 6; +const NeutralToneMapping = 7; +const AttachedBindMode = 'attached'; +const DetachedBindMode = 'detached'; + +const UVMapping = 300; +const CubeReflectionMapping = 301; +const CubeRefractionMapping = 302; +const EquirectangularReflectionMapping = 303; +const EquirectangularRefractionMapping = 304; +const CubeUVReflectionMapping = 306; +const RepeatWrapping = 1000; +const ClampToEdgeWrapping = 1001; +const MirroredRepeatWrapping = 1002; +const NearestFilter = 1003; +const NearestMipmapNearestFilter = 1004; +const NearestMipmapLinearFilter = 1005; +const LinearFilter = 1006; +const LinearMipmapNearestFilter = 1007; +const LinearMipmapLinearFilter = 1008; +const LinearMipMapLinearFilter = 1008; +const UnsignedByteType = 1009; +const ByteType = 1010; +const ShortType = 1011; +const UnsignedShortType = 1012; +const IntType = 1013; +const UnsignedIntType = 1014; +const FloatType = 1015; +const HalfFloatType = 1016; +const UnsignedShort4444Type = 1017; +const UnsignedShort5551Type = 1018; +const UnsignedInt248Type = 1020; +const UnsignedInt5999Type = 35902; +const AlphaFormat = 1021; +const RGBFormat = 1022; +const RGBAFormat = 1023; +const LuminanceFormat = 1024; +const LuminanceAlphaFormat = 1025; +const DepthFormat = 1026; +const DepthStencilFormat = 1027; +const RedFormat = 1028; +const RedIntegerFormat = 1029; +const RGFormat = 1030; +const RGIntegerFormat = 1031; +const RGBAIntegerFormat = 1033; + +const RGB_S3TC_DXT1_Format = 33776; +const RGBA_S3TC_DXT1_Format = 33777; +const RGBA_S3TC_DXT3_Format = 33778; +const RGBA_S3TC_DXT5_Format = 33779; +const RGB_PVRTC_4BPPV1_Format = 35840; +const RGB_PVRTC_2BPPV1_Format = 35841; +const RGBA_PVRTC_4BPPV1_Format = 35842; +const RGBA_PVRTC_2BPPV1_Format = 35843; +const RGB_ETC1_Format = 36196; +const RGB_ETC2_Format = 37492; +const RGBA_ETC2_EAC_Format = 37496; +const RGBA_ASTC_4x4_Format = 37808; +const RGBA_ASTC_5x4_Format = 37809; +const RGBA_ASTC_5x5_Format = 37810; +const RGBA_ASTC_6x5_Format = 37811; +const RGBA_ASTC_6x6_Format = 37812; +const RGBA_ASTC_8x5_Format = 37813; +const RGBA_ASTC_8x6_Format = 37814; +const RGBA_ASTC_8x8_Format = 37815; +const RGBA_ASTC_10x5_Format = 37816; +const RGBA_ASTC_10x6_Format = 37817; +const RGBA_ASTC_10x8_Format = 37818; +const RGBA_ASTC_10x10_Format = 37819; +const RGBA_ASTC_12x10_Format = 37820; +const RGBA_ASTC_12x12_Format = 37821; +const RGBA_BPTC_Format = 36492; +const RGB_BPTC_SIGNED_Format = 36494; +const RGB_BPTC_UNSIGNED_Format = 36495; +const RED_RGTC1_Format = 36283; +const SIGNED_RED_RGTC1_Format = 36284; +const RED_GREEN_RGTC2_Format = 36285; +const SIGNED_RED_GREEN_RGTC2_Format = 36286; +const LoopOnce = 2200; +const LoopRepeat = 2201; +const LoopPingPong = 2202; +const InterpolateDiscrete = 2300; +const InterpolateLinear = 2301; +const InterpolateSmooth = 2302; +const ZeroCurvatureEnding = 2400; +const ZeroSlopeEnding = 2401; +const WrapAroundEnding = 2402; +const NormalAnimationBlendMode = 2500; +const AdditiveAnimationBlendMode = 2501; +const TrianglesDrawMode = 0; +const TriangleStripDrawMode = 1; +const TriangleFanDrawMode = 2; +const BasicDepthPacking = 3200; +const RGBADepthPacking = 3201; +const TangentSpaceNormalMap = 0; +const ObjectSpaceNormalMap = 1; + +// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available. +const NoColorSpace = ''; +const SRGBColorSpace = 'srgb'; +const LinearSRGBColorSpace = 'srgb-linear'; + +const LinearTransfer = 'linear'; +const SRGBTransfer = 'srgb'; +const KeepStencilOp = 7680; +const AlwaysStencilFunc = 519; + +const NeverCompare = 512; +const LessCompare = 513; +const EqualCompare = 514; +const LessEqualCompare = 515; +const GreaterCompare = 516; +const NotEqualCompare = 517; +const GreaterEqualCompare = 518; +const AlwaysCompare = 519; + +const StaticDrawUsage = 35044; +const GLSL3 = '300 es'; + +const WebGLCoordinateSystem = 2000; +const WebGPUCoordinateSystem = 2001; + +/** + * This modules allows to dispatch event objects on custom JavaScript objects. + * + * Main repository: [eventdispatcher.js]{@link https://github.com/mrdoob/eventdispatcher.js/} + * + * Code Example: + * ```js + * class Car extends EventDispatcher { + * start() { + * this.dispatchEvent( { type: 'start', message: 'vroom vroom!' } ); + * } + *}; + * + * // Using events with the custom object + * const car = new Car(); + * car.addEventListener( 'start', function ( event ) { + * alert( event.message ); + * } ); + * + * car.start(); + * ``` + */ +class EventDispatcher { + + /** + * Adds the given event listener to the given event type. + * + * @param {string} type - The type of event to listen to. + * @param {Function} listener - The function that gets called when the event is fired. + */ + addEventListener( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + const listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === -1 ) { + + listeners[ type ].push( listener ); + + } + + } + + /** + * Returns `true` if the given event listener has been added to the given event type. + * + * @param {string} type - The type of event. + * @param {Function} listener - The listener to check. + * @return {boolean} Whether the given event listener has been added to the given event type. + */ + hasEventListener( type, listener ) { + + const listeners = this._listeners; + + if ( listeners === undefined ) return false; + + return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1; + + } + + /** + * Removes the given event listener from the given event type. + * + * @param {string} type - The type of event. + * @param {Function} listener - The listener to remove. + */ + removeEventListener( type, listener ) { + + const listeners = this._listeners; + + if ( listeners === undefined ) return; + + const listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + const index = listenerArray.indexOf( listener ); + + if ( index !== -1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + } + + /** + * Dispatches an event object. + * + * @param {Object} event - The event that gets fired. + */ + dispatchEvent( event ) { + + const listeners = this._listeners; + + if ( listeners === undefined ) return; + + const listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + // Make a copy, in case listeners are removed while iterating. + const array = listenerArray.slice( 0 ); + + for ( let i = 0, l = array.length; i < l; i ++ ) { + + array[ i ].call( this, event ); + + } + + event.target = null; + + } + + } + +} + +const _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ]; + +let _seed = 1234567; + + +const DEG2RAD = Math.PI / 180; +const RAD2DEG = 180 / Math.PI; + +/** + * Generate a [UUID]{@link https://en.wikipedia.org/wiki/Universally_unique_identifier} + * (universally unique identifier). + * + * @return {string} The UUID. + */ +function generateUUID() { + + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 + + const d0 = Math.random() * 0xffffffff | 0; + const d1 = Math.random() * 0xffffffff | 0; + const d2 = Math.random() * 0xffffffff | 0; + const d3 = Math.random() * 0xffffffff | 0; + const uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' + + _lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' + + _lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] + + _lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ]; + + // .toLowerCase() here flattens concatenated strings to save heap memory space. + return uuid.toLowerCase(); + +} + +/** + * Clamps the given value between min and max. + * + * @param {number} value - The value to clamp. + * @param {number} min - The min value. + * @param {number} max - The max value. + * @return {number} The clamped value. + */ +function clamp$1( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + +} + +/** + * Computes the Euclidean modulo of the given parameters that + * is `( ( n % m ) + m ) % m`. + * + * @param {number} n - The first parameter. + * @param {number} m - The second parameter. + * @return {number} The Euclidean modulo. + */ +function euclideanModulo( n, m ) { + + // https://en.wikipedia.org/wiki/Modulo_operation + + return ( ( n % m ) + m ) % m; + +} + +/** + * Performs a linear mapping from range `` to range `` + * for the given value. + * + * @param {number} x - The value to be mapped. + * @param {number} a1 - Minimum value for range A. + * @param {number} a2 - Maximum value for range A. + * @param {number} b1 - Minimum value for range B. + * @param {number} b2 - Maximum value for range B. + * @return {number} The mapped value. + */ +function mapLinear( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + +} + +/** + * Returns the percentage in the closed interval `[0, 1]` of the given value + * between the start and end point. + * + * @param {number} x - The start point + * @param {number} y - The end point. + * @param {number} value - A value between start and end. + * @return {number} The interpolation factor. + */ +function inverseLerp( x, y, value ) { + + // https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/ + + if ( x !== y ) { + + return ( value - x ) / ( y - x ); + + } else { + + return 0; + + } + +} + +/** + * Returns a value linearly interpolated from two known points based on the given interval - + * `t = 0` will return `x` and `t = 1` will return `y`. + * + * @param {number} x - The start point + * @param {number} y - The end point. + * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. + * @return {number} The interpolated value. + */ +function lerp$1( x, y, t ) { + + return ( 1 - t ) * x + t * y; + +} + +/** + * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta + * time to maintain frame rate independent movement. For details, see + * [Frame rate independent damping using lerp]{@link http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/}. + * + * @param {number} x - The current point. + * @param {number} y - The target point. + * @param {number} lambda - A higher lambda value will make the movement more sudden, + * and a lower value will make the movement more gradual. + * @param {number} dt - Delta time in seconds. + * @return {number} The interpolated value. + */ +function damp( x, y, lambda, dt ) { + + return lerp$1( x, y, 1 - Math.exp( - lambda * dt ) ); + +} + +/** + * Returns a value that alternates between `0` and the given `length` parameter. + * + * @param {number} x - The value to pingpong. + * @param {number} [length=1] - The positive value the function will pingpong to. + * @return {number} The alternated value. + */ +function pingpong( x, length = 1 ) { + + // https://www.desmos.com/calculator/vcsjnyz7x4 + + return length - Math.abs( euclideanModulo( x, length * 2 ) - length ); + +} + +/** + * Returns a value in the range `[0,1]` that represents the percentage that `x` has + * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to + * the `min` and `max`. + * + * See [Smoothstep]{@link http://en.wikipedia.org/wiki/Smoothstep} for more details. + * + * @param {number} x - The value to evaluate based on its position between min and max. + * @param {number} min - The min value. Any x value below min will be `0`. + * @param {number} max - The max value. Any x value above max will be `1`. + * @return {number} The alternated value. + */ +function smoothstep( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + +} + +/** + * A [variation on smoothstep]{@link https://en.wikipedia.org/wiki/Smoothstep#Variations} + * that has zero 1st and 2nd order derivatives at x=0 and x=1. + * + * @param {number} x - The value to evaluate based on its position between min and max. + * @param {number} min - The min value. Any x value below min will be `0`. + * @param {number} max - The max value. Any x value above max will be `1`. + * @return {number} The alternated value. + */ +function smootherstep( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + +} + +/** + * Returns a random integer from `` interval. + * + * @param {number} low - The lower value boundary. + * @param {number} high - The upper value boundary + * @return {number} A random integer. + */ +function randInt( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + +} + +/** + * Returns a random float from `` interval. + * + * @param {number} low - The lower value boundary. + * @param {number} high - The upper value boundary + * @return {number} A random float. + */ +function randFloat( low, high ) { + + return low + Math.random() * ( high - low ); + +} + +/** + * Returns a random integer from `<-range/2, range/2>` interval. + * + * @param {number} range - Defines the value range. + * @return {number} A random float. + */ +function randFloatSpread( range ) { + + return range * ( 0.5 - Math.random() ); + +} + +/** + * Returns a deterministic pseudo-random float in the interval `[0, 1]`. + * + * @param {number} [s] - The integer seed. + * @return {number} A random float. + */ +function seededRandom( s ) { + + if ( s !== undefined ) _seed = s; + + // Mulberry32 generator + + let t = _seed += 0x6D2B79F5; + + t = Math.imul( t ^ t >>> 15, t | 1 ); + + t ^= t + Math.imul( t ^ t >>> 7, t | 61 ); + + return ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296; + +} + +/** + * Converts degrees to radians. + * + * @param {number} degrees - A value in degrees. + * @return {number} The converted value in radians. + */ +function degToRad( degrees ) { + + return degrees * DEG2RAD; + +} + +/** + * Converts radians to degrees. + * + * @param {number} radians - A value in radians. + * @return {number} The converted value in degrees. + */ +function radToDeg( radians ) { + + return radians * RAD2DEG; + +} + +/** + * Returns `true` if the given number is a power of two. + * + * @param {number} value - The value to check. + * @return {boolean} Whether the given number is a power of two or not. + */ +function isPowerOfTwo( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + +} + +/** + * Returns the smallest power of two that is greater than or equal to the given number. + * + * @param {number} value - The value to find a POT for. + * @return {number} The smallest power of two that is greater than or equal to the given number. + */ +function ceilPowerOfTwo( value ) { + + return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) ); + +} + +/** + * Returns the largest power of two that is less than or equal to the given number. + * + * @param {number} value - The value to find a POT for. + * @return {number} The largest power of two that is less than or equal to the given number. + */ +function floorPowerOfTwo( value ) { + + return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) ); + +} + +/** + * Sets the given quaternion from the [Intrinsic Proper Euler Angles]{@link https://en.wikipedia.org/wiki/Euler_angles} + * defined by the given angles and order. + * + * Rotations are applied to the axes in the order specified by order: + * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`. + * + * @param {Quaternion} q - The quaternion to set. + * @param {number} a - The rotation applied to the first axis, in radians. + * @param {number} b - The rotation applied to the second axis, in radians. + * @param {number} c - The rotation applied to the third axis, in radians. + * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order. + */ +function setQuaternionFromProperEuler( q, a, b, c, order ) { + + const cos = Math.cos; + const sin = Math.sin; + + const c2 = cos( b / 2 ); + const s2 = sin( b / 2 ); + + const c13 = cos( ( a + c ) / 2 ); + const s13 = sin( ( a + c ) / 2 ); + + const c1_3 = cos( ( a - c ) / 2 ); + const s1_3 = sin( ( a - c ) / 2 ); + + const c3_1 = cos( ( c - a ) / 2 ); + const s3_1 = sin( ( c - a ) / 2 ); + + switch ( order ) { + + case 'XYX': + q.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 ); + break; + + case 'YZY': + q.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 ); + break; + + case 'ZXZ': + q.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 ); + break; + + case 'XZX': + q.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 ); + break; + + case 'YXY': + q.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 ); + break; + + case 'ZYZ': + q.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 ); + break; + + default: + console.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order ); + + } + +} + +/** + * Denormalizes the given value according to the given typed array. + * + * @param {number} value - The value to denormalize. + * @param {TypedArray} array - The typed array that defines the data type of the value. + * @return {number} The denormalize (float) value in the range `[0,1]`. + */ +function denormalize( value, array ) { + + switch ( array.constructor ) { + + case Float32Array: + + return value; + + case Uint32Array: + + return value / 4294967295.0; + + case Uint16Array: + + return value / 65535.0; + + case Uint8Array: + + return value / 255.0; + + case Int32Array: + + return Math.max( value / 2147483647.0, -1 ); + + case Int16Array: + + return Math.max( value / 32767.0, -1 ); + + case Int8Array: + + return Math.max( value / 127.0, -1 ); + + default: + + throw new Error( 'Invalid component type.' ); + + } + +} + +/** + * Normalizes the given value according to the given typed array. + * + * @param {number} value - The float value in the range `[0,1]` to normalize. + * @param {TypedArray} array - The typed array that defines the data type of the value. + * @return {number} The normalize value. + */ +function normalize( value, array ) { + + switch ( array.constructor ) { + + case Float32Array: + + return value; + + case Uint32Array: + + return Math.round( value * 4294967295.0 ); + + case Uint16Array: + + return Math.round( value * 65535.0 ); + + case Uint8Array: + + return Math.round( value * 255.0 ); + + case Int32Array: + + return Math.round( value * 2147483647.0 ); + + case Int16Array: + + return Math.round( value * 32767.0 ); + + case Int8Array: + + return Math.round( value * 127.0 ); + + default: + + throw new Error( 'Invalid component type.' ); + + } + +} + +const MathUtils = { + DEG2RAD: DEG2RAD, + RAD2DEG: RAD2DEG, + generateUUID: generateUUID, + clamp: clamp$1, + euclideanModulo: euclideanModulo, + mapLinear: mapLinear, + inverseLerp: inverseLerp, + lerp: lerp$1, + damp: damp, + pingpong: pingpong, + smoothstep: smoothstep, + smootherstep: smootherstep, + randInt: randInt, + randFloat: randFloat, + randFloatSpread: randFloatSpread, + seededRandom: seededRandom, + degToRad: degToRad, + radToDeg: radToDeg, + isPowerOfTwo: isPowerOfTwo, + ceilPowerOfTwo: ceilPowerOfTwo, + floorPowerOfTwo: floorPowerOfTwo, + setQuaternionFromProperEuler: setQuaternionFromProperEuler, + normalize: normalize, + denormalize: denormalize +}; + +/** + * Class representing a 2D vector. A 2D vector is an ordered pair of numbers + * (labeled x and y), which can be used to represent a number of things, such as: + * + * - A point in 2D space (i.e. a position on a plane). + * - A direction and length across a plane. In three.js the length will + * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)` + * and the direction is also measured from `(0, 0)` towards `(x, y)`. + * - Any arbitrary ordered pair of numbers. + * + * There are other things a 2D vector can be used to represent, such as + * momentum vectors, complex numbers and so on, however these are the most + * common uses in three.js. + * + * Iterating through a vector instance will yield its components `(x, y)` in + * the corresponding order. + * ```js + * const a = new THREE.Vector2( 0, 1 ); + * + * //no arguments; will be initialised to (0, 0) + * const b = new THREE.Vector2( ); + * + * const d = a.distanceTo( b ); + * ``` + */ +class Vector2 { + + /** + * Constructs a new 2D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + */ + constructor( x = 0, y = 0 ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Vector2.prototype.isVector2 = true; + + /** + * The x value of this vector. + * + * @type {number} + */ + this.x = x; + + /** + * The y value of this vector. + * + * @type {number} + */ + this.y = y; + + } + + /** + * Alias for {@link Vector2#x}. + * + * @type {number} + */ + get width() { + + return this.x; + + } + + set width( value ) { + + this.x = value; + + } + + /** + * Alias for {@link Vector2#y}. + * + * @type {number} + */ + get height() { + + return this.y; + + } + + set height( value ) { + + this.y = value; + + } + + /** + * Sets the vector components. + * + * @param {number} x - The value of the x component. + * @param {number} y - The value of the y component. + * @return {Vector2} A reference to this vector. + */ + set( x, y ) { + + this.x = x; + this.y = y; + + return this; + + } + + /** + * Sets the vector components to the same value. + * + * @param {number} scalar - The value to set for all vector components. + * @return {Vector2} A reference to this vector. + */ + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + } + + /** + * Sets the vector's x component to the given value + * + * @param {number} x - The value to set. + * @return {Vector2} A reference to this vector. + */ + setX( x ) { + + this.x = x; + + return this; + + } + + /** + * Sets the vector's y component to the given value + * + * @param {number} y - The value to set. + * @return {Vector2} A reference to this vector. + */ + setY( y ) { + + this.y = y; + + return this; + + } + + /** + * Allows to set a vector component with an index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y. + * @param {number} value - The value to set. + * @return {Vector2} A reference to this vector. + */ + setComponent( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + } + + /** + * Returns the value of the vector component which matches the given index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y. + * @return {number} A vector component value. + */ + getComponent( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + } + + /** + * Returns a new vector with copied values from this instance. + * + * @return {Vector2} A clone of this instance. + */ + clone() { + + return new this.constructor( this.x, this.y ); + + } + + /** + * Copies the values of the given vector to this instance. + * + * @param {Vector2} v - The vector to copy. + * @return {Vector2} A reference to this vector. + */ + copy( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + } + + /** + * Adds the given vector to this instance. + * + * @param {Vector2} v - The vector to add. + * @return {Vector2} A reference to this vector. + */ + add( v ) { + + this.x += v.x; + this.y += v.y; + + return this; + + } + + /** + * Adds the given scalar value to all components of this instance. + * + * @param {number} s - The scalar to add. + * @return {Vector2} A reference to this vector. + */ + addScalar( s ) { + + this.x += s; + this.y += s; + + return this; + + } + + /** + * Adds the given vectors and stores the result in this instance. + * + * @param {Vector2} a - The first vector. + * @param {Vector2} b - The second vector. + * @return {Vector2} A reference to this vector. + */ + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + } + + /** + * Adds the given vector scaled by the given factor to this instance. + * + * @param {Vector2} v - The vector. + * @param {number} s - The factor that scales `v`. + * @return {Vector2} A reference to this vector. + */ + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + } + + /** + * Subtracts the given vector from this instance. + * + * @param {Vector2} v - The vector to subtract. + * @return {Vector2} A reference to this vector. + */ + sub( v ) { + + this.x -= v.x; + this.y -= v.y; + + return this; + + } + + /** + * Subtracts the given scalar value from all components of this instance. + * + * @param {number} s - The scalar to subtract. + * @return {Vector2} A reference to this vector. + */ + subScalar( s ) { + + this.x -= s; + this.y -= s; + + return this; + + } + + /** + * Subtracts the given vectors and stores the result in this instance. + * + * @param {Vector2} a - The first vector. + * @param {Vector2} b - The second vector. + * @return {Vector2} A reference to this vector. + */ + subVectors( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + } + + /** + * Multiplies the given vector with this instance. + * + * @param {Vector2} v - The vector to multiply. + * @return {Vector2} A reference to this vector. + */ + multiply( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + } + + /** + * Multiplies the given scalar value with all components of this instance. + * + * @param {number} scalar - The scalar to multiply. + * @return {Vector2} A reference to this vector. + */ + multiplyScalar( scalar ) { + + this.x *= scalar; + this.y *= scalar; + + return this; + + } + + /** + * Divides this instance by the given vector. + * + * @param {Vector2} v - The vector to divide. + * @return {Vector2} A reference to this vector. + */ + divide( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + } + + /** + * Divides this vector by the given scalar. + * + * @param {number} scalar - The scalar to divide. + * @return {Vector2} A reference to this vector. + */ + divideScalar( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + } + + /** + * Multiplies this vector (with an implicit 1 as the 3rd component) by + * the given 3x3 matrix. + * + * @param {Matrix3} m - The matrix to apply. + * @return {Vector2} A reference to this vector. + */ + applyMatrix3( m ) { + + const x = this.x, y = this.y; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ]; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ]; + + return this; + + } + + /** + * If this vector's x or y value is greater than the given vector's x or y + * value, replace that value with the corresponding min value. + * + * @param {Vector2} v - The vector. + * @return {Vector2} A reference to this vector. + */ + min( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + } + + /** + * If this vector's x or y value is less than the given vector's x or y + * value, replace that value with the corresponding max value. + * + * @param {Vector2} v - The vector. + * @return {Vector2} A reference to this vector. + */ + max( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + } + + /** + * If this vector's x or y value is greater than the max vector's x or y + * value, it is replaced by the corresponding value. + * If this vector's x or y value is less than the min vector's x or y value, + * it is replaced by the corresponding value. + * + * @param {Vector2} min - The minimum x and y values. + * @param {Vector2} max - The maximum x and y values in the desired range. + * @return {Vector2} A reference to this vector. + */ + clamp( min, max ) { + + // assumes min < max, componentwise + + this.x = clamp$1( this.x, min.x, max.x ); + this.y = clamp$1( this.y, min.y, max.y ); + + return this; + + } + + /** + * If this vector's x or y values are greater than the max value, they are + * replaced by the max value. + * If this vector's x or y values are less than the min value, they are + * replaced by the min value. + * + * @param {number} minVal - The minimum value the components will be clamped to. + * @param {number} maxVal - The maximum value the components will be clamped to. + * @return {Vector2} A reference to this vector. + */ + clampScalar( minVal, maxVal ) { + + this.x = clamp$1( this.x, minVal, maxVal ); + this.y = clamp$1( this.y, minVal, maxVal ); + + return this; + + } + + /** + * If this vector's length is greater than the max value, it is replaced by + * the max value. + * If this vector's length is less than the min value, it is replaced by the + * min value. + * + * @param {number} min - The minimum value the vector length will be clamped to. + * @param {number} max - The maximum value the vector length will be clamped to. + * @return {Vector2} A reference to this vector. + */ + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( clamp$1( length, min, max ) ); + + } + + /** + * The components of this vector are rounded down to the nearest integer value. + * + * @return {Vector2} A reference to this vector. + */ + floor() { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + } + + /** + * The components of this vector are rounded up to the nearest integer value. + * + * @return {Vector2} A reference to this vector. + */ + ceil() { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + } + + /** + * The components of this vector are rounded to the nearest integer value + * + * @return {Vector2} A reference to this vector. + */ + round() { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + } + + /** + * The components of this vector are rounded towards zero (up if negative, + * down if positive) to an integer value. + * + * @return {Vector2} A reference to this vector. + */ + roundToZero() { + + this.x = Math.trunc( this.x ); + this.y = Math.trunc( this.y ); + + return this; + + } + + /** + * Inverts this vector - i.e. sets x = -x and y = -y. + * + * @return {Vector2} A reference to this vector. + */ + negate() { + + this.x = - this.x; + this.y = - this.y; + + return this; + + } + + /** + * Calculates the dot product of the given vector with this instance. + * + * @param {Vector2} v - The vector to compute the dot product with. + * @return {number} The result of the dot product. + */ + dot( v ) { + + return this.x * v.x + this.y * v.y; + + } + + /** + * Calculates the cross product of the given vector with this instance. + * + * @param {Vector2} v - The vector to compute the cross product with. + * @return {number} The result of the cross product. + */ + cross( v ) { + + return this.x * v.y - this.y * v.x; + + } + + /** + * Computes the square of the Euclidean length (straight-line length) from + * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should + * compare the length squared instead as it is slightly more efficient to calculate. + * + * @return {number} The square length of this vector. + */ + lengthSq() { + + return this.x * this.x + this.y * this.y; + + } + + /** + * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y). + * + * @return {number} The length of this vector. + */ + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + } + + /** + * Computes the Manhattan length of this vector. + * + * @return {number} The length of this vector. + */ + manhattanLength() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + } + + /** + * Converts this vector to a unit vector - that is, sets it equal to a vector + * with the same direction as this one, but with a vector length of `1`. + * + * @return {Vector2} A reference to this vector. + */ + normalize() { + + return this.divideScalar( this.length() || 1 ); + + } + + /** + * Computes the angle in radians of this vector with respect to the positive x-axis. + * + * @return {number} The angle in radians. + */ + angle() { + + const angle = Math.atan2( - this.y, - this.x ) + Math.PI; + + return angle; + + } + + /** + * Returns the angle between the given vector and this instance in radians. + * + * @param {Vector2} v - The vector to compute the angle with. + * @return {number} The angle in radians. + */ + angleTo( v ) { + + const denominator = Math.sqrt( this.lengthSq() * v.lengthSq() ); + + if ( denominator === 0 ) return Math.PI / 2; + + const theta = this.dot( v ) / denominator; + + // clamp, to handle numerical problems + + return Math.acos( clamp$1( theta, -1, 1 ) ); + + } + + /** + * Computes the distance from the given vector to this instance. + * + * @param {Vector2} v - The vector to compute the distance to. + * @return {number} The distance. + */ + distanceTo( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + } + + /** + * Computes the squared distance from the given vector to this instance. + * If you are just comparing the distance with another distance, you should compare + * the distance squared instead as it is slightly more efficient to calculate. + * + * @param {Vector2} v - The vector to compute the squared distance to. + * @return {number} The squared distance. + */ + distanceToSquared( v ) { + + const dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + } + + /** + * Computes the Manhattan distance from the given vector to this instance. + * + * @param {Vector2} v - The vector to compute the Manhattan distance to. + * @return {number} The Manhattan distance. + */ + manhattanDistanceTo( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + } + + /** + * Sets this vector to a vector with the same direction as this one, but + * with the specified length. + * + * @param {number} length - The new length of this vector. + * @return {Vector2} A reference to this vector. + */ + setLength( length ) { + + return this.normalize().multiplyScalar( length ); + + } + + /** + * Linearly interpolates between the given vector and this instance, where + * alpha is the percent distance along the line - alpha = 0 will be this + * vector, and alpha = 1 will be the given one. + * + * @param {Vector2} v - The vector to interpolate towards. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector2} A reference to this vector. + */ + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + } + + /** + * Linearly interpolates between the given vectors, where alpha is the percent + * distance along the line - alpha = 0 will be first vector, and alpha = 1 will + * be the second one. The result is stored in this instance. + * + * @param {Vector2} v1 - The first vector. + * @param {Vector2} v2 - The second vector. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector2} A reference to this vector. + */ + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + + return this; + + } + + /** + * Returns `true` if this vector is equal with the given one. + * + * @param {Vector2} v - The vector to test for equality. + * @return {boolean} Whether this vector is equal with the given one. + */ + equals( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + } + + /** + * Sets this vector's x value to be `array[ offset ]` and y + * value to be `array[ offset + 1 ]`. + * + * @param {Array} array - An array holding the vector component values. + * @param {number} [offset=0] - The offset into the array. + * @return {Vector2} A reference to this vector. + */ + fromArray( array, offset = 0 ) { + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + } + + /** + * Writes the components of this vector to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the vector components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The vector components. + */ + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + } + + /** + * Sets the components of this vector from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding vector data. + * @param {number} index - The index into the attribute. + * @return {Vector2} A reference to this vector. + */ + fromBufferAttribute( attribute, index ) { + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + + return this; + + } + + /** + * Rotates this vector around the given center by the given angle. + * + * @param {Vector2} center - The point around which to rotate. + * @param {number} angle - The angle to rotate, in radians. + * @return {Vector2} A reference to this vector. + */ + rotateAround( center, angle ) { + + const c = Math.cos( angle ), s = Math.sin( angle ); + + const x = this.x - center.x; + const y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + /** + * Sets each component of this vector to a pseudo-random value between `0` and + * `1`, excluding `1`. + * + * @return {Vector2} A reference to this vector. + */ + random() { + + this.x = Math.random(); + this.y = Math.random(); + + return this; + + } + + *[ Symbol.iterator ]() { + + yield this.x; + yield this.y; + + } + +} + +/** + * Represents a 3x3 matrix. + * + * A Note on Row-Major and Column-Major Ordering: + * + * The constructor and {@link Matrix3#set} method take arguments in + * [row-major]{@link https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order} + * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order. + * This means that calling: + * ```js + * const m = new THREE.Matrix(); + * m.set( 11, 12, 13, + * 21, 22, 23, + * 31, 32, 33 ); + * ``` + * will result in the elements array containing: + * ```js + * m.elements = [ 11, 21, 31, + * 12, 22, 32, + * 13, 23, 33 ]; + * ``` + * and internally all calculations are performed using column-major ordering. + * However, as the actual ordering makes no difference mathematically and + * most people are used to thinking about matrices in row-major order, the + * three.js documentation shows matrices in row-major order. Just bear in + * mind that if you are reading the source code, you'll have to take the + * transpose of any matrices outlined here to make sense of the calculations. + */ +class Matrix3 { + + /** + * Constructs a new 3x3 matrix. The arguments are supposed to be + * in row-major order. If no arguments are provided, the constructor + * initializes the matrix as an identity matrix. + * + * @param {number} [n11] - 1-1 matrix element. + * @param {number} [n12] - 1-2 matrix element. + * @param {number} [n13] - 1-3 matrix element. + * @param {number} [n21] - 2-1 matrix element. + * @param {number} [n22] - 2-2 matrix element. + * @param {number} [n23] - 2-3 matrix element. + * @param {number} [n31] - 3-1 matrix element. + * @param {number} [n32] - 3-2 matrix element. + * @param {number} [n33] - 3-3 matrix element. + */ + constructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Matrix3.prototype.isMatrix3 = true; + + /** + * A column-major list of matrix values. + * + * @type {Array} + */ + this.elements = [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ]; + + if ( n11 !== undefined ) { + + this.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 ); + + } + + } + + /** + * Sets the elements of the matrix.The arguments are supposed to be + * in row-major order. + * + * @param {number} [n11] - 1-1 matrix element. + * @param {number} [n12] - 1-2 matrix element. + * @param {number} [n13] - 1-3 matrix element. + * @param {number} [n21] - 2-1 matrix element. + * @param {number} [n22] - 2-2 matrix element. + * @param {number} [n23] - 2-3 matrix element. + * @param {number} [n31] - 3-1 matrix element. + * @param {number} [n32] - 3-2 matrix element. + * @param {number} [n33] - 3-3 matrix element. + * @return {Matrix3} A reference to this matrix. + */ + set( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + const te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + } + + /** + * Sets this matrix to the 3x3 identity matrix. + * + * @return {Matrix3} A reference to this matrix. + */ + identity() { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + } + + /** + * Copies the values of the given matrix to this instance. + * + * @param {Matrix3} m - The matrix to copy. + * @return {Matrix3} A reference to this matrix. + */ + copy( m ) { + + const te = this.elements; + const me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; + te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; + te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; + + return this; + + } + + /** + * Extracts the basis of this matrix into the three axis vectors provided. + * + * @param {Vector3} xAxis - The basis's x axis. + * @param {Vector3} yAxis - The basis's y axis. + * @param {Vector3} zAxis - The basis's z axis. + * @return {Matrix3} A reference to this matrix. + */ + extractBasis( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrix3Column( this, 0 ); + yAxis.setFromMatrix3Column( this, 1 ); + zAxis.setFromMatrix3Column( this, 2 ); + + return this; + + } + + /** + * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Matrix3} A reference to this matrix. + */ + setFromMatrix4( m ) { + + const me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + } + + /** + * Post-multiplies this matrix by the given 3x3 matrix. + * + * @param {Matrix3} m - The matrix to multiply with. + * @return {Matrix3} A reference to this matrix. + */ + multiply( m ) { + + return this.multiplyMatrices( this, m ); + + } + + /** + * Pre-multiplies this matrix by the given 3x3 matrix. + * + * @param {Matrix3} m - The matrix to multiply with. + * @return {Matrix3} A reference to this matrix. + */ + premultiply( m ) { + + return this.multiplyMatrices( m, this ); + + } + + /** + * Multiples the given 3x3 matrices and stores the result + * in this matrix. + * + * @param {Matrix3} a - The first matrix. + * @param {Matrix3} b - The second matrix. + * @return {Matrix3} A reference to this matrix. + */ + multiplyMatrices( a, b ) { + + const ae = a.elements; + const be = b.elements; + const te = this.elements; + + const a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; + const a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; + const a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; + + const b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; + const b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; + const b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; + te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; + te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; + te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; + te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; + te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; + te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; + + return this; + + } + + /** + * Multiplies every component of the matrix by the given scalar. + * + * @param {number} s - The scalar. + * @return {Matrix3} A reference to this matrix. + */ + multiplyScalar( s ) { + + const te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + } + + /** + * Computes and returns the determinant of this matrix. + * + * @return {number} The determinant. + */ + determinant() { + + const te = this.elements; + + const a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + } + + /** + * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}. + * You can not invert with a determinant of zero. If you attempt this, the method produces + * a zero matrix instead. + * + * @return {Matrix3} A reference to this matrix. + */ + invert() { + + const te = this.elements, + + n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], + n12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ], + n13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 ); + + const detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + } + + /** + * Transposes this matrix in place. + * + * @return {Matrix3} A reference to this matrix. + */ + transpose() { + + let tmp; + const m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + } + + /** + * Computes the normal matrix which is the inverse transpose of the upper + * left 3x3 portion of the given 4x4 matrix. + * + * @param {Matrix4} matrix4 - The 4x4 matrix. + * @return {Matrix3} A reference to this matrix. + */ + getNormalMatrix( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).invert().transpose(); + + } + + /** + * Transposes this matrix into the supplied array, and returns itself unchanged. + * + * @param {Array} r - An array to store the transposed matrix elements. + * @return {Matrix3} A reference to this matrix. + */ + transposeIntoArray( r ) { + + const m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + } + + /** + * Sets the UV transform matrix from offset, repeat, rotation, and center. + * + * @param {number} tx - Offset x. + * @param {number} ty - Offset y. + * @param {number} sx - Repeat x. + * @param {number} sy - Repeat y. + * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise. + * @param {number} cx - Center x of rotation. + * @param {number} cy - Center y of rotation + * @return {Matrix3} A reference to this matrix. + */ + setUvTransform( tx, ty, sx, sy, rotation, cx, cy ) { + + const c = Math.cos( rotation ); + const s = Math.sin( rotation ); + + this.set( + sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx, + - sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty, + 0, 0, 1 + ); + + return this; + + } + + /** + * Scales this matrix with the given scalar values. + * + * @param {number} sx - The amount to scale in the X axis. + * @param {number} sy - The amount to scale in the Y axis. + * @return {Matrix3} A reference to this matrix. + */ + scale( sx, sy ) { + + this.premultiply( _m3.makeScale( sx, sy ) ); + + return this; + + } + + /** + * Rotates this matrix by the given angle. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix3} A reference to this matrix. + */ + rotate( theta ) { + + this.premultiply( _m3.makeRotation( - theta ) ); + + return this; + + } + + /** + * Translates this matrix by the given scalar values. + * + * @param {number} tx - The amount to translate in the X axis. + * @param {number} ty - The amount to translate in the Y axis. + * @return {Matrix3} A reference to this matrix. + */ + translate( tx, ty ) { + + this.premultiply( _m3.makeTranslation( tx, ty ) ); + + return this; + + } + + // for 2D Transforms + + /** + * Sets this matrix as a 2D translation transform. + * + * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector. + * @param {number} y - The amount to translate in the Y axis. + * @return {Matrix3} A reference to this matrix. + */ + makeTranslation( x, y ) { + + if ( x.isVector2 ) { + + this.set( + + 1, 0, x.x, + 0, 1, x.y, + 0, 0, 1 + + ); + + } else { + + this.set( + + 1, 0, x, + 0, 1, y, + 0, 0, 1 + + ); + + } + + return this; + + } + + /** + * Sets this matrix as a 2D rotational transformation. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix3} A reference to this matrix. + */ + makeRotation( theta ) { + + // counterclockwise + + const c = Math.cos( theta ); + const s = Math.sin( theta ); + + this.set( + + c, - s, 0, + s, c, 0, + 0, 0, 1 + + ); + + return this; + + } + + /** + * Sets this matrix as a 2D scale transform. + * + * @param {number} x - The amount to scale in the X axis. + * @param {number} y - The amount to scale in the Y axis. + * @return {Matrix3} A reference to this matrix. + */ + makeScale( x, y ) { + + this.set( + + x, 0, 0, + 0, y, 0, + 0, 0, 1 + + ); + + return this; + + } + + /** + * Returns `true` if this matrix is equal with the given one. + * + * @param {Matrix3} matrix - The matrix to test for equality. + * @return {boolean} Whether this matrix is equal with the given one. + */ + equals( matrix ) { + + const te = this.elements; + const me = matrix.elements; + + for ( let i = 0; i < 9; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + } + + /** + * Sets the elements of the matrix from the given array. + * + * @param {Array} array - The matrix elements in column-major order. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Matrix3} A reference to this matrix. + */ + fromArray( array, offset = 0 ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + } + + /** + * Writes the elements of this matrix to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The matrix elements in column-major order. + */ + toArray( array = [], offset = 0 ) { + + const te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + /** + * Returns a matrix with copied values from this instance. + * + * @return {Matrix3} A clone of this instance. + */ + clone() { + + return new this.constructor().fromArray( this.elements ); + + } + +} + +const _m3 = /*@__PURE__*/ new Matrix3(); + +function arrayNeedsUint32( array ) { + + // assumes larger values usually on last + + for ( let i = array.length - 1; i >= 0; -- i ) { + + if ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565 + + } + + return false; + +} + +function createElementNS( name ) { + + return document.createElementNS( 'http://www.w3.org/1999/xhtml', name ); + +} + +function createCanvasElement() { + + const canvas = createElementNS( 'canvas' ); + canvas.style.display = 'block'; + return canvas; + +} + +const _cache = {}; + +function warnOnce( message ) { + + if ( message in _cache ) return; + + _cache[ message ] = true; + + console.warn( message ); + +} + +function probeAsync( gl, sync, interval ) { + + return new Promise( function ( resolve, reject ) { + + function probe() { + + switch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) { + + case gl.WAIT_FAILED: + reject(); + break; + + case gl.TIMEOUT_EXPIRED: + setTimeout( probe, interval ); + break; + + default: + resolve(); + + } + + } + + setTimeout( probe, interval ); + + } ); + +} + +function toNormalizedProjectionMatrix( projectionMatrix ) { + + const m = projectionMatrix.elements; + + // Convert [-1, 1] to [0, 1] projection matrix + m[ 2 ] = 0.5 * m[ 2 ] + 0.5 * m[ 3 ]; + m[ 6 ] = 0.5 * m[ 6 ] + 0.5 * m[ 7 ]; + m[ 10 ] = 0.5 * m[ 10 ] + 0.5 * m[ 11 ]; + m[ 14 ] = 0.5 * m[ 14 ] + 0.5 * m[ 15 ]; + +} + +function toReversedProjectionMatrix( projectionMatrix ) { + + const m = projectionMatrix.elements; + const isPerspectiveMatrix = m[ 11 ] === -1; + + // Reverse [0, 1] projection matrix + if ( isPerspectiveMatrix ) { + + m[ 10 ] = - m[ 10 ] - 1; + m[ 14 ] = - m[ 14 ]; + + } else { + + m[ 10 ] = - m[ 10 ]; + m[ 14 ] = - m[ 14 ] + 1; + + } + +} + +const LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set( + 0.4123908, 0.3575843, 0.1804808, + 0.2126390, 0.7151687, 0.0721923, + 0.0193308, 0.1191948, 0.9505322 +); + +const XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set( + 3.2409699, -1.5373832, -0.4986108, + -0.9692436, 1.8759675, 0.0415551, + 0.0556301, -0.203977, 1.0569715 +); + +function createColorManagement() { + + const ColorManagement = { + + enabled: true, + + workingColorSpace: LinearSRGBColorSpace, + + /** + * Implementations of supported color spaces. + * + * Required: + * - primaries: chromaticity coordinates [ rx ry gx gy bx by ] + * - whitePoint: reference white [ x y ] + * - transfer: transfer function (pre-defined) + * - toXYZ: Matrix3 RGB to XYZ transform + * - fromXYZ: Matrix3 XYZ to RGB transform + * - luminanceCoefficients: RGB luminance coefficients + * + * Optional: + * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace } + * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace } + * + * Reference: + * - https://www.russellcottrell.com/photo/matrixCalculator.htm + */ + spaces: {}, + + convert: function ( color, sourceColorSpace, targetColorSpace ) { + + if ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) { + + return color; + + } + + if ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) { + + color.r = SRGBToLinear( color.r ); + color.g = SRGBToLinear( color.g ); + color.b = SRGBToLinear( color.b ); + + } + + if ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) { + + color.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ ); + color.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ ); + + } + + if ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) { + + color.r = LinearToSRGB( color.r ); + color.g = LinearToSRGB( color.g ); + color.b = LinearToSRGB( color.b ); + + } + + return color; + + }, + + fromWorkingColorSpace: function ( color, targetColorSpace ) { + + return this.convert( color, this.workingColorSpace, targetColorSpace ); + + }, + + toWorkingColorSpace: function ( color, sourceColorSpace ) { + + return this.convert( color, sourceColorSpace, this.workingColorSpace ); + + }, + + getPrimaries: function ( colorSpace ) { + + return this.spaces[ colorSpace ].primaries; + + }, + + getTransfer: function ( colorSpace ) { + + if ( colorSpace === NoColorSpace ) return LinearTransfer; + + return this.spaces[ colorSpace ].transfer; + + }, + + getLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) { + + return target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients ); + + }, + + define: function ( colorSpaces ) { + + Object.assign( this.spaces, colorSpaces ); + + }, + + // Internal APIs + + _getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) { + + return targetMatrix + .copy( this.spaces[ sourceColorSpace ].toXYZ ) + .multiply( this.spaces[ targetColorSpace ].fromXYZ ); + + }, + + _getDrawingBufferColorSpace: function ( colorSpace ) { + + return this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace; + + }, + + _getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) { + + return this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace; + + } + + }; + + /****************************************************************************** + * sRGB definitions + */ + + const REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ]; + const REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ]; + const D65 = [ 0.3127, 0.3290 ]; + + ColorManagement.define( { + + [ LinearSRGBColorSpace ]: { + primaries: REC709_PRIMARIES, + whitePoint: D65, + transfer: LinearTransfer, + toXYZ: LINEAR_REC709_TO_XYZ, + fromXYZ: XYZ_TO_LINEAR_REC709, + luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS, + workingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace }, + outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace } + }, + + [ SRGBColorSpace ]: { + primaries: REC709_PRIMARIES, + whitePoint: D65, + transfer: SRGBTransfer, + toXYZ: LINEAR_REC709_TO_XYZ, + fromXYZ: XYZ_TO_LINEAR_REC709, + luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS, + outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace } + }, + + } ); + + return ColorManagement; + +} + +const ColorManagement = /*@__PURE__*/ createColorManagement(); + +function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + +} + +function LinearToSRGB( c ) { + + return ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055; + +} + +let _canvas; + +/** + * A class containing utility functions for images. + * + * @hideconstructor + */ +class ImageUtils { + + /** + * Returns a data URI containing a representation of the given image. + * + * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object. + * @return {string} The data URI. + */ + static getDataURL( image ) { + + if ( /^data:/i.test( image.src ) ) { + + return image.src; + + } + + if ( typeof HTMLCanvasElement === 'undefined' ) { + + return image.src; + + } + + let canvas; + + if ( image instanceof HTMLCanvasElement ) { + + canvas = image; + + } else { + + if ( _canvas === undefined ) _canvas = createElementNS( 'canvas' ); + + _canvas.width = image.width; + _canvas.height = image.height; + + const context = _canvas.getContext( '2d' ); + + if ( image instanceof ImageData ) { + + context.putImageData( image, 0, 0 ); + + } else { + + context.drawImage( image, 0, 0, image.width, image.height ); + + } + + canvas = _canvas; + + } + + return canvas.toDataURL( 'image/png' ); + + } + + /** + * Converts the given sRGB image data to linear color space. + * + * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object. + * @return {HTMLCanvasElement|Object} The converted image. + */ + static sRGBToLinear( image ) { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + const canvas = createElementNS( 'canvas' ); + + canvas.width = image.width; + canvas.height = image.height; + + const context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height ); + + const imageData = context.getImageData( 0, 0, image.width, image.height ); + const data = imageData.data; + + for ( let i = 0; i < data.length; i ++ ) { + + data[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255; + + } + + context.putImageData( imageData, 0, 0 ); + + return canvas; + + } else if ( image.data ) { + + const data = image.data.slice( 0 ); + + for ( let i = 0; i < data.length; i ++ ) { + + if ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) { + + data[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 ); + + } else { + + // assuming float + + data[ i ] = SRGBToLinear( data[ i ] ); + + } + + } + + return { + data: data, + width: image.width, + height: image.height + }; + + } else { + + console.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' ); + return image; + + } + + } + +} + +let _sourceId = 0; + +class Source { + + constructor( data = null ) { + + this.isSource = true; + + Object.defineProperty( this, 'id', { value: _sourceId ++ } ); + + this.uuid = generateUUID(); + + this.data = data; + this.dataReady = true; + + this.version = 0; + + } + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + toJSON( meta ) { + + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) { + + return meta.images[ this.uuid ]; + + } + + const output = { + uuid: this.uuid, + url: '' + }; + + const data = this.data; + + if ( data !== null ) { + + let url; + + if ( Array.isArray( data ) ) { + + // cube texture + + url = []; + + for ( let i = 0, l = data.length; i < l; i ++ ) { + + if ( data[ i ].isDataTexture ) { + + url.push( serializeImage( data[ i ].image ) ); + + } else { + + url.push( serializeImage( data[ i ] ) ); + + } + + } + + } else { + + // texture + + url = serializeImage( data ); + + } + + output.url = url; + + } + + if ( ! isRootObject ) { + + meta.images[ this.uuid ] = output; + + } + + return output; + + } + +} + +function serializeImage( image ) { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + // default images + + return ImageUtils.getDataURL( image ); + + } else { + + if ( image.data ) { + + // images of DataTexture + + return { + data: Array.from( image.data ), + width: image.width, + height: image.height, + type: image.data.constructor.name + }; + + } else { + + console.warn( 'THREE.Texture: Unable to serialize Texture.' ); + return {}; + + } + + } + +} + +let _textureId = 0; + +/** + * Base class for all textures. + * + * Note: After the initial use of a texture, its dimensions, format, and type + * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one. + * + * @augments EventDispatcher + */ +let Texture$1 = class Texture extends EventDispatcher { + + /** + * Constructs a new texture. + * + * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data. + * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=LinearFilter] - The mag filter value. + * @param {number} [minFilter=LinearFilter] - The min filter value. + * @param {number} [format=RGBAFormat] - The min filter value. + * @param {number} [type=UnsignedByteType] - The min filter value. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The min filter value. + * @param {string} [colorSpace=NoColorSpace] - The min filter value. + */ + constructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isTexture = true; + + /** + * The ID of the texture. + * + * @name Texture#id + * @type {number} + * @readonly + */ + Object.defineProperty( this, 'id', { value: _textureId ++ } ); + + /** + * The UUID of the material. + * + * @type {string} + * @readonly + */ + this.uuid = generateUUID(); + + /** + * The name of the material. + * + * @type {string} + */ + this.name = ''; + + /** + * The data definition of a texture. A reference to the data source can be + * shared across textures. This is often useful in context of spritesheets + * where multiple textures render the same data but with different texture + * transformations. + * + * @type {Source} + */ + this.source = new Source( image ); + + /** + * An array holding user-defined mipmaps. + * + * @type {Array} + */ + this.mipmaps = []; + + /** + * How the texture is applied to the object. The value `UVMapping` + * is the default, where texture or uv coordinates are used to apply the map. + * + * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)} + * @default UVMapping + */ + this.mapping = mapping; + + /** + * Lets you select the uv attribute to map the texture to. `0` for `uv`, + * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`. + * + * @type {number} + * @default 0 + */ + this.channel = 0; + + /** + * This defines how the texture is wrapped horizontally and corresponds to + * *U* in UV mapping. + * + * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)} + * @default ClampToEdgeWrapping + */ + this.wrapS = wrapS; + + /** + * This defines how the texture is wrapped horizontally and corresponds to + * *V* in UV mapping. + * + * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)} + * @default ClampToEdgeWrapping + */ + this.wrapT = wrapT; + + /** + * How the texture is sampled when a texel covers more than one pixel. + * + * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)} + * @default LinearFilter + */ + this.magFilter = magFilter; + + /** + * How the texture is sampled when a texel covers less than one pixel. + * + * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)} + * @default LinearMipmapLinearFilter + */ + this.minFilter = minFilter; + + /** + * The number of samples taken along the axis through the pixel that has the + * highest density of texels. By default, this value is `1`. A higher value + * gives a less blurry result than a basic mipmap, at the cost of more + * texture samples being used. + * + * @type {number} + * @default 0 + */ + this.anisotropy = anisotropy; + + /** + * The format of the texture. + * + * @type {number} + * @default RGBAFormat + */ + this.format = format; + + /** + * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and + * defines how the texture data is going to be stored on the GPU. + * + * This property allows to overwrite the default format. + * + * @type {?string} + * @default null + */ + this.internalFormat = null; + + /** + * The data type of the texture. + * + * @type {number} + * @default UnsignedByteType + */ + this.type = type; + + /** + * How much a single repetition of the texture is offset from the beginning, + * in each direction U and V. Typical range is `0.0` to `1.0`. + * + * @type {Vector2} + * @default (0,0) + */ + this.offset = new Vector2( 0, 0 ); + + /** + * How many times the texture is repeated across the surface, in each + * direction U and V. If repeat is set greater than `1` in either direction, + * the corresponding wrap parameter should also be set to `RepeatWrapping` + * or `MirroredRepeatWrapping` to achieve the desired tiling effect. + * + * @type {Vector2} + * @default (1,1) + */ + this.repeat = new Vector2( 1, 1 ); + + /** + * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds + * to the center of the texture. Default is `(0, 0)`, the lower left. + * + * @type {Vector2} + * @default (0,0) + */ + this.center = new Vector2( 0, 0 ); + + /** + * How much the texture is rotated around the center point, in radians. + * Positive values are counter-clockwise. + * + * @type {number} + * @default 0 + */ + this.rotation = 0; + + /** + * Whether to update the texture's uv-transformation {@link Texture#matrix} + * from the properties {@link Texture#offset}, {@link Texture#repeat}, + * {@link Texture#rotation}, and {@link Texture#center}. + * + * Set this to `false` if you are specifying the uv-transform matrix directly. + * + * @type {boolean} + * @default true + */ + this.matrixAutoUpdate = true; + + /** + * The uv-transformation matrix of the texture. + * + * @type {Matrix3} + */ + this.matrix = new Matrix3(); + + /** + * Whether to generate mipmaps (if possible) for a texture. + * + * Set this to `false` if you are creating mipmaps manually. + * + * @type {boolean} + * @default true + */ + this.generateMipmaps = true; + + /** + * If set to `true`, the alpha channel, if present, is multiplied into the + * color channels when the texture is uploaded to the GPU. + * + * Note that this property has no effect when using `ImageBitmap`. You need to + * configure premultiply alpha on bitmap creation instead. + * + * @type {boolean} + * @default false + */ + this.premultiplyAlpha = false; + + /** + * If set to `true`, the texture is flipped along the vertical axis when + * uploaded to the GPU. + * + * Note that this property has no effect when using `ImageBitmap`. You need to + * configure the flip on bitmap creation instead. + * + * @type {boolean} + * @default true + */ + this.flipY = true; + + /** + * Specifies the alignment requirements for the start of each pixel row in memory. + * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes), + * `4` (word-alignment), and `8` (rows start on double-word boundaries). + * + * @type {number} + * @default 4 + */ + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + /** + * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`. + * + * @type {string} + * @default NoColorSpace + */ + this.colorSpace = colorSpace; + + /** + * An object that can be used to store custom data about the texture. It + * should not hold references to functions as these will not be cloned. + * + * @type {Object} + */ + this.userData = {}; + + /** + * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`. + * + * @type {number} + * @readonly + * @default 0 + */ + this.version = 0; + + /** + * A callback function, called when the texture is updated (e.g., when + * {@link Texture#needsUpdate} has been set to true and then the texture is used). + * + * @type {?Function} + * @default null + */ + this.onUpdate = null; + + /** + * An optional back reference to the textures render target. + * + * @type {?(RenderTarget|WebGLRenderTarget)} + * @default null + */ + this.renderTarget = null; + + /** + * Indicates whether a texture belongs to a render target or not. + * + * @type {boolean} + * @readonly + * @default false + */ + this.isRenderTargetTexture = false; + + /** + * Indicates whether this texture should be processed by `PMREMGenerator` or not + * (only relevant for render target textures). + * + * @type {number} + * @readonly + * @default 0 + */ + this.pmremVersion = 0; + + } + + /** + * The image object holding the texture data. + * + * @type {?Object} + */ + get image() { + + return this.source.data; + + } + + set image( value = null ) { + + this.source.data = value; + + } + + /** + * Updates the texture transformation matrix from the from the properties {@link Texture#offset}, + * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}. + */ + updateMatrix() { + + this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); + + } + + /** + * Returns a new texture with copied values from this instance. + * + * @return {Texture} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + + /** + * Copies the values of the given texture to this instance. + * + * @param {Texture} source - The texture to copy. + * @return {Texture} A reference to this instance. + */ + copy( source ) { + + this.name = source.name; + + this.source = source.source; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + this.channel = source.channel; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.internalFormat = source.internalFormat; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + this.center.copy( source.center ); + this.rotation = source.rotation; + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy( source.matrix ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.colorSpace = source.colorSpace; + + this.renderTarget = source.renderTarget; + this.isRenderTargetTexture = source.isRenderTargetTexture; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + this.needsUpdate = true; + + return this; + + } + + /** + * Serializes the texture into JSON. + * + * @param {?(Object|string)} meta - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized texture. + * @see {@link ObjectLoader#parse} + */ + toJSON( meta ) { + + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + const output = { + + metadata: { + version: 4.6, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + image: this.source.toJSON( meta ).uuid, + + mapping: this.mapping, + channel: this.channel, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + center: [ this.center.x, this.center.y ], + rotation: this.rotation, + + wrap: [ this.wrapS, this.wrapT ], + + format: this.format, + internalFormat: this.internalFormat, + type: this.type, + colorSpace: this.colorSpace, + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY, + + generateMipmaps: this.generateMipmaps, + premultiplyAlpha: this.premultiplyAlpha, + unpackAlignment: this.unpackAlignment + + }; + + if ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData; + + if ( ! isRootObject ) { + + meta.textures[ this.uuid ] = output; + + } + + return output; + + } + + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + * + * @fires Texture#dispose + */ + dispose() { + + /** + * Fires when the texture has been disposed of. + * + * @event Texture#dispose + * @type {Object} + */ + this.dispatchEvent( { type: 'dispose' } ); + + } + + /** + * Transforms the given uv vector with the textures uv transformation matrix. + * + * @param {Vector2} uv - The uv vector. + * @return {Vector2} The transformed uv vector. + */ + transformUv( uv ) { + + if ( this.mapping !== UVMapping ) return uv; + + uv.applyMatrix3( this.matrix ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + return uv; + + } + + /** + * Setting this property to `true` indicates the engine the texture + * must be updated in the next render. This triggers a texture upload + * to the GPU and ensures correct texture parameter configuration. + * + * @type {boolean} + * @default false + * @param {boolean} value + */ + set needsUpdate( value ) { + + if ( value === true ) { + + this.version ++; + this.source.needsUpdate = true; + + } + + } + + /** + * Setting this property to `true` indicates the engine the PMREM + * must be regenerated. + * + * @type {boolean} + * @default false + * @param {boolean} value + */ + set needsPMREMUpdate( value ) { + + if ( value === true ) { + + this.pmremVersion ++; + + } + + } + +}; + +/** + * The default image for all textures. + * + * @static + * @type {?Image} + * @default null + */ +Texture$1.DEFAULT_IMAGE = null; + +/** + * The default mapping for all textures. + * + * @static + * @type {number} + * @default UVMapping + */ +Texture$1.DEFAULT_MAPPING = UVMapping; + +/** + * The default anisotropy value for all textures. + * + * @static + * @type {number} + * @default 1 + */ +Texture$1.DEFAULT_ANISOTROPY = 1; + +/** + * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers + * (labeled x, y, z and w), which can be used to represent a number of things, such as: + * + * - A point in 4D space. + * - A direction and length in 4D space. In three.js the length will + * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)` + * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`. + * - Any arbitrary ordered quadruplet of numbers. + * + * There are other things a 4D vector can be used to represent, however these + * are the most common uses in *three.js*. + * + * Iterating through a vector instance will yield its components `(x, y, z, w)` in + * the corresponding order. + * ```js + * const a = new THREE.Vector4( 0, 1, 0, 0 ); + * + * //no arguments; will be initialised to (0, 0, 0, 1) + * const b = new THREE.Vector4( ); + * + * const d = a.dot( b ); + * ``` + */ +class Vector4 { + + /** + * Constructs a new 4D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + * @param {number} [z=0] - The z value of this vector. + * @param {number} [w=1] - The w value of this vector. + */ + constructor( x = 0, y = 0, z = 0, w = 1 ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Vector4.prototype.isVector4 = true; + + /** + * The x value of this vector. + * + * @type {number} + */ + this.x = x; + + /** + * The y value of this vector. + * + * @type {number} + */ + this.y = y; + + /** + * The z value of this vector. + * + * @type {number} + */ + this.z = z; + + /** + * The w value of this vector. + * + * @type {number} + */ + this.w = w; + + } + + /** + * Alias for {@link Vector4#z}. + * + * @type {number} + */ + get width() { + + return this.z; + + } + + set width( value ) { + + this.z = value; + + } + + /** + * Alias for {@link Vector4#w}. + * + * @type {number} + */ + get height() { + + return this.w; + + } + + set height( value ) { + + this.w = value; + + } + + /** + * Sets the vector components. + * + * @param {number} x - The value of the x component. + * @param {number} y - The value of the y component. + * @param {number} z - The value of the z component. + * @param {number} w - The value of the w component. + * @return {Vector4} A reference to this vector. + */ + set( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + } + + /** + * Sets the vector components to the same value. + * + * @param {number} scalar - The value to set for all vector components. + * @return {Vector4} A reference to this vector. + */ + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + } + + /** + * Sets the vector's x component to the given value + * + * @param {number} x - The value to set. + * @return {Vector4} A reference to this vector. + */ + setX( x ) { + + this.x = x; + + return this; + + } + + /** + * Sets the vector's y component to the given value + * + * @param {number} y - The value to set. + * @return {Vector4} A reference to this vector. + */ + setY( y ) { + + this.y = y; + + return this; + + } + + /** + * Sets the vector's z component to the given value + * + * @param {number} z - The value to set. + * @return {Vector4} A reference to this vector. + */ + setZ( z ) { + + this.z = z; + + return this; + + } + + /** + * Sets the vector's w component to the given value + * + * @param {number} w - The value to set. + * @return {Vector4} A reference to this vector. + */ + setW( w ) { + + this.w = w; + + return this; + + } + + /** + * Allows to set a vector component with an index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y, + * `2` equals to z, `3` equals to w. + * @param {number} value - The value to set. + * @return {Vector4} A reference to this vector. + */ + setComponent( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + } + + /** + * Returns the value of the vector component which matches the given index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y, + * `2` equals to z, `3` equals to w. + * @return {number} A vector component value. + */ + getComponent( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + } + + /** + * Returns a new vector with copied values from this instance. + * + * @return {Vector4} A clone of this instance. + */ + clone() { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + } + + /** + * Copies the values of the given vector to this instance. + * + * @param {Vector3|Vector4} v - The vector to copy. + * @return {Vector4} A reference to this vector. + */ + copy( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + } + + /** + * Adds the given vector to this instance. + * + * @param {Vector4} v - The vector to add. + * @return {Vector4} A reference to this vector. + */ + add( v ) { + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + } + + /** + * Adds the given scalar value to all components of this instance. + * + * @param {number} s - The scalar to add. + * @return {Vector4} A reference to this vector. + */ + addScalar( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + } + + /** + * Adds the given vectors and stores the result in this instance. + * + * @param {Vector4} a - The first vector. + * @param {Vector4} b - The second vector. + * @return {Vector4} A reference to this vector. + */ + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + } + + /** + * Adds the given vector scaled by the given factor to this instance. + * + * @param {Vector4} v - The vector. + * @param {number} s - The factor that scales `v`. + * @return {Vector4} A reference to this vector. + */ + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + } + + /** + * Subtracts the given vector from this instance. + * + * @param {Vector4} v - The vector to subtract. + * @return {Vector4} A reference to this vector. + */ + sub( v ) { + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + } + + /** + * Subtracts the given scalar value from all components of this instance. + * + * @param {number} s - The scalar to subtract. + * @return {Vector4} A reference to this vector. + */ + subScalar( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + } + + /** + * Subtracts the given vectors and stores the result in this instance. + * + * @param {Vector4} a - The first vector. + * @param {Vector4} b - The second vector. + * @return {Vector4} A reference to this vector. + */ + subVectors( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + } + + /** + * Multiplies the given vector with this instance. + * + * @param {Vector4} v - The vector to multiply. + * @return {Vector4} A reference to this vector. + */ + multiply( v ) { + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + this.w *= v.w; + + return this; + + } + + /** + * Multiplies the given scalar value with all components of this instance. + * + * @param {number} scalar - The scalar to multiply. + * @return {Vector4} A reference to this vector. + */ + multiplyScalar( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + return this; + + } + + /** + * Multiplies this vector with the given 4x4 matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Vector4} A reference to this vector. + */ + applyMatrix4( m ) { + + const x = this.x, y = this.y, z = this.z, w = this.w; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + } + + /** + * Divides this instance by the given vector. + * + * @param {Vector4} v - The vector to divide. + * @return {Vector4} A reference to this vector. + */ + divide( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + this.w /= v.w; + + return this; + + } + + /** + * Divides this vector by the given scalar. + * + * @param {number} scalar - The scalar to divide. + * @return {Vector4} A reference to this vector. + */ + divideScalar( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + } + + /** + * Sets the x, y and z components of this + * vector to the quaternion's axis and w to the angle. + * + * @param {Quaternion} q - The Quaternion to set. + * @return {Vector4} A reference to this vector. + */ + setAxisAngleFromQuaternion( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + const s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + } + + /** + * Sets the x, y and z components of this + * vector to the axis of rotation and w to the angle. + * + * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix. + * @return {Vector4} A reference to this vector. + */ + setAxisAngleFromRotationMatrix( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + let angle, x, y, z; // variables for result + const epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + const xx = ( m11 + 1 ) / 2; + const yy = ( m22 + 1 ) / 2; + const zz = ( m33 + 1 ) / 2; + const xy = ( m12 + m21 ) / 4; + const xz = ( m13 + m31 ) / 4; + const yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + let s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + } + + /** + * Sets the vector components to the position elements of the + * given transformation matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Vector4} A reference to this vector. + */ + setFromMatrixPosition( m ) { + + const e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + this.w = e[ 15 ]; + + return this; + + } + + /** + * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w + * value, replace that value with the corresponding min value. + * + * @param {Vector4} v - The vector. + * @return {Vector4} A reference to this vector. + */ + min( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + } + + /** + * If this vector's x, y, z or w value is less than the given vector's x, y, z or w + * value, replace that value with the corresponding max value. + * + * @param {Vector4} v - The vector. + * @return {Vector4} A reference to this vector. + */ + max( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + } + + /** + * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w + * value, it is replaced by the corresponding value. + * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value, + * it is replaced by the corresponding value. + * + * @param {Vector4} min - The minimum x, y and z values. + * @param {Vector4} max - The maximum x, y and z values in the desired range. + * @return {Vector4} A reference to this vector. + */ + clamp( min, max ) { + + // assumes min < max, componentwise + + this.x = clamp$1( this.x, min.x, max.x ); + this.y = clamp$1( this.y, min.y, max.y ); + this.z = clamp$1( this.z, min.z, max.z ); + this.w = clamp$1( this.w, min.w, max.w ); + + return this; + + } + + /** + * If this vector's x, y, z or w values are greater than the max value, they are + * replaced by the max value. + * If this vector's x, y, z or w values are less than the min value, they are + * replaced by the min value. + * + * @param {number} minVal - The minimum value the components will be clamped to. + * @param {number} maxVal - The maximum value the components will be clamped to. + * @return {Vector4} A reference to this vector. + */ + clampScalar( minVal, maxVal ) { + + this.x = clamp$1( this.x, minVal, maxVal ); + this.y = clamp$1( this.y, minVal, maxVal ); + this.z = clamp$1( this.z, minVal, maxVal ); + this.w = clamp$1( this.w, minVal, maxVal ); + + return this; + + } + + /** + * If this vector's length is greater than the max value, it is replaced by + * the max value. + * If this vector's length is less than the min value, it is replaced by the + * min value. + * + * @param {number} min - The minimum value the vector length will be clamped to. + * @param {number} max - The maximum value the vector length will be clamped to. + * @return {Vector4} A reference to this vector. + */ + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( clamp$1( length, min, max ) ); + + } + + /** + * The components of this vector are rounded down to the nearest integer value. + * + * @return {Vector4} A reference to this vector. + */ + floor() { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + } + + /** + * The components of this vector are rounded up to the nearest integer value. + * + * @return {Vector4} A reference to this vector. + */ + ceil() { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + } + + /** + * The components of this vector are rounded to the nearest integer value + * + * @return {Vector4} A reference to this vector. + */ + round() { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + } + + /** + * The components of this vector are rounded towards zero (up if negative, + * down if positive) to an integer value. + * + * @return {Vector4} A reference to this vector. + */ + roundToZero() { + + this.x = Math.trunc( this.x ); + this.y = Math.trunc( this.y ); + this.z = Math.trunc( this.z ); + this.w = Math.trunc( this.w ); + + return this; + + } + + /** + * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w. + * + * @return {Vector4} A reference to this vector. + */ + negate() { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + } + + /** + * Calculates the dot product of the given vector with this instance. + * + * @param {Vector4} v - The vector to compute the dot product with. + * @return {number} The result of the dot product. + */ + dot( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + } + + /** + * Computes the square of the Euclidean length (straight-line length) from + * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should + * compare the length squared instead as it is slightly more efficient to calculate. + * + * @return {number} The square length of this vector. + */ + lengthSq() { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + } + + /** + * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w). + * + * @return {number} The length of this vector. + */ + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + } + + /** + * Computes the Manhattan length of this vector. + * + * @return {number} The length of this vector. + */ + manhattanLength() { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + } + + /** + * Converts this vector to a unit vector - that is, sets it equal to a vector + * with the same direction as this one, but with a vector length of `1`. + * + * @return {Vector4} A reference to this vector. + */ + normalize() { + + return this.divideScalar( this.length() || 1 ); + + } + + /** + * Sets this vector to a vector with the same direction as this one, but + * with the specified length. + * + * @param {number} length - The new length of this vector. + * @return {Vector4} A reference to this vector. + */ + setLength( length ) { + + return this.normalize().multiplyScalar( length ); + + } + + /** + * Linearly interpolates between the given vector and this instance, where + * alpha is the percent distance along the line - alpha = 0 will be this + * vector, and alpha = 1 will be the given one. + * + * @param {Vector4} v - The vector to interpolate towards. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector4} A reference to this vector. + */ + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + } + + /** + * Linearly interpolates between the given vectors, where alpha is the percent + * distance along the line - alpha = 0 will be first vector, and alpha = 1 will + * be the second one. The result is stored in this instance. + * + * @param {Vector4} v1 - The first vector. + * @param {Vector4} v2 - The second vector. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector4} A reference to this vector. + */ + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + this.z = v1.z + ( v2.z - v1.z ) * alpha; + this.w = v1.w + ( v2.w - v1.w ) * alpha; + + return this; + + } + + /** + * Returns `true` if this vector is equal with the given one. + * + * @param {Vector4} v - The vector to test for equality. + * @return {boolean} Whether this vector is equal with the given one. + */ + equals( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + } + + /** + * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`, + * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`. + * + * @param {Array} array - An array holding the vector component values. + * @param {number} [offset=0] - The offset into the array. + * @return {Vector4} A reference to this vector. + */ + fromArray( array, offset = 0 ) { + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + } + + /** + * Writes the components of this vector to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the vector components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The vector components. + */ + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + } + + /** + * Sets the components of this vector from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding vector data. + * @param {number} index - The index into the attribute. + * @return {Vector4} A reference to this vector. + */ + fromBufferAttribute( attribute, index ) { + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + this.w = attribute.getW( index ); + + return this; + + } + + /** + * Sets each component of this vector to a pseudo-random value between `0` and + * `1`, excluding `1`. + * + * @return {Vector4} A reference to this vector. + */ + random() { + + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + this.w = Math.random(); + + return this; + + } + + *[ Symbol.iterator ]() { + + yield this.x; + yield this.y; + yield this.z; + yield this.w; + + } + +} + +/* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers +*/ +class RenderTarget extends EventDispatcher { + + constructor( width = 1, height = 1, options = {} ) { + + super(); + + this.isRenderTarget = true; + + this.width = width; + this.height = height; + this.depth = 1; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + const image = { width: width, height: height, depth: 1 }; + + options = Object.assign( { + generateMipmaps: false, + internalFormat: null, + minFilter: LinearFilter, + depthBuffer: true, + stencilBuffer: false, + resolveDepthBuffer: true, + resolveStencilBuffer: true, + depthTexture: null, + samples: 0, + count: 1 + }, options ); + + const texture = new Texture$1( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace ); + + texture.flipY = false; + texture.generateMipmaps = options.generateMipmaps; + texture.internalFormat = options.internalFormat; + + this.textures = []; + + const count = options.count; + for ( let i = 0; i < count; i ++ ) { + + this.textures[ i ] = texture.clone(); + this.textures[ i ].isRenderTargetTexture = true; + this.textures[ i ].renderTarget = this; + + } + + this.depthBuffer = options.depthBuffer; + this.stencilBuffer = options.stencilBuffer; + + this.resolveDepthBuffer = options.resolveDepthBuffer; + this.resolveStencilBuffer = options.resolveStencilBuffer; + + this._depthTexture = null; + this.depthTexture = options.depthTexture; + + this.samples = options.samples; + + } + + get texture() { + + return this.textures[ 0 ]; + + } + + set texture( value ) { + + this.textures[ 0 ] = value; + + } + + set depthTexture( current ) { + + if ( this._depthTexture !== null ) this._depthTexture.renderTarget = null; + if ( current !== null ) current.renderTarget = this; + + this._depthTexture = current; + + } + + get depthTexture() { + + return this._depthTexture; + + } + + setSize( width, height, depth = 1 ) { + + if ( this.width !== width || this.height !== height || this.depth !== depth ) { + + this.width = width; + this.height = height; + this.depth = depth; + + for ( let i = 0, il = this.textures.length; i < il; i ++ ) { + + this.textures[ i ].image.width = width; + this.textures[ i ].image.height = height; + this.textures[ i ].image.depth = depth; + + } + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + this.width = source.width; + this.height = source.height; + this.depth = source.depth; + + this.scissor.copy( source.scissor ); + this.scissorTest = source.scissorTest; + + this.viewport.copy( source.viewport ); + + this.textures.length = 0; + + for ( let i = 0, il = source.textures.length; i < il; i ++ ) { + + this.textures[ i ] = source.textures[ i ].clone(); + this.textures[ i ].isRenderTargetTexture = true; + this.textures[ i ].renderTarget = this; + + // ensure image object is not shared, see #20328 + + const image = Object.assign( {}, source.textures[ i ].image ); + this.textures[ i ].source = new Source( image ); + + } + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + + this.resolveDepthBuffer = source.resolveDepthBuffer; + this.resolveStencilBuffer = source.resolveStencilBuffer; + + if ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone(); + + this.samples = source.samples; + + return this; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} + +class WebGLRenderTarget extends RenderTarget { + + constructor( width = 1, height = 1, options = {} ) { + + super( width, height, options ); + + this.isWebGLRenderTarget = true; + + } + +} + +class DataArrayTexture extends Texture$1 { + + constructor( data = null, width = 1, height = 1, depth = 1 ) { + + super( null ); + + this.isDataArrayTexture = true; + + this.image = { data, width, height, depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.wrapR = ClampToEdgeWrapping; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + this.layerUpdates = new Set(); + + } + + addLayerUpdate( layerIndex ) { + + this.layerUpdates.add( layerIndex ); + + } + + clearLayerUpdates() { + + this.layerUpdates.clear(); + + } + +} + +class Data3DTexture extends Texture$1 { + + constructor( data = null, width = 1, height = 1, depth = 1 ) { + + // We're going to add .setXXX() methods for setting properties later. + // Users can still set in Data3DTexture directly. + // + // const texture = new THREE.Data3DTexture( data, width, height, depth ); + // texture.anisotropy = 16; + // + // See #14839 + + super( null ); + + this.isData3DTexture = true; + + this.image = { data, width, height, depth }; + + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + + this.wrapR = ClampToEdgeWrapping; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + +} + +/** + * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations. + * + * Iterating through a vector instance will yield its components `(x, y, z, w)` in + * the corresponding order. + * + * Note that three.js expects Quaternions to be normalized. + * ```js + * const quaternion = new THREE.Quaternion(); + * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 ); + * + * const vector = new THREE.Vector3( 1, 0, 0 ); + * vector.applyQuaternion( quaternion ); + * ``` + */ +class Quaternion { + + /** + * Constructs a new quaternion. + * + * @param {number} [x=0] - The x value of this quaternion. + * @param {number} [y=0] - The y value of this quaternion. + * @param {number} [z=0] - The z value of this quaternion. + * @param {number} [w=1] - The w value of this quaternion. + */ + constructor( x = 0, y = 0, z = 0, w = 1 ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isQuaternion = true; + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + } + + /** + * Interpolates between two quaternions via SLERP. This implementation assumes the + * quaternion data are managed in flat arrays. + * + * @param {Array} dst - The destination array. + * @param {number} dstOffset - An offset into the destination array. + * @param {Array} src0 - The source array of the first quaternion. + * @param {number} srcOffset0 - An offset into the first source array. + * @param {Array} src1 - The source array of the second quaternion. + * @param {number} srcOffset1 - An offset into the second source array. + * @param {number} t - The interpolation factor in the range `[0,1]`. + * @see {@link Quaternion#slerp} + */ + static slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + let x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ]; + + const x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( t === 0 ) { + + dst[ dstOffset + 0 ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + return; + + } + + if ( t === 1 ) { + + dst[ dstOffset + 0 ] = x1; + dst[ dstOffset + 1 ] = y1; + dst[ dstOffset + 2 ] = z1; + dst[ dstOffset + 3 ] = w1; + return; + + } + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + let s = 1 - t; + const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + dir = ( cos >= 0 ? 1 : -1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + const sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + const tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + const f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + /** + * Multiplies two quaternions. This implementation assumes the quaternion data are managed + * in flat arrays. + * + * @param {Array} dst - The destination array. + * @param {number} dstOffset - An offset into the destination array. + * @param {Array} src0 - The source array of the first quaternion. + * @param {number} srcOffset0 - An offset into the first source array. + * @param {Array} src1 - The source array of the second quaternion. + * @param {number} srcOffset1 - An offset into the second source array. + * @return {Array} The destination array. + * @see {@link Quaternion#multiplyQuaternions}. + */ + static multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) { + + const x0 = src0[ srcOffset0 ]; + const y0 = src0[ srcOffset0 + 1 ]; + const z0 = src0[ srcOffset0 + 2 ]; + const w0 = src0[ srcOffset0 + 3 ]; + + const x1 = src1[ srcOffset1 ]; + const y1 = src1[ srcOffset1 + 1 ]; + const z1 = src1[ srcOffset1 + 2 ]; + const w1 = src1[ srcOffset1 + 3 ]; + + dst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; + dst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; + dst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; + dst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; + + return dst; + + } + + /** + * The x value of this quaternion. + * + * @type {number} + * @default 0 + */ + get x() { + + return this._x; + + } + + set x( value ) { + + this._x = value; + this._onChangeCallback(); + + } + + /** + * The y value of this quaternion. + * + * @type {number} + * @default 0 + */ + get y() { + + return this._y; + + } + + set y( value ) { + + this._y = value; + this._onChangeCallback(); + + } + + /** + * The z value of this quaternion. + * + * @type {number} + * @default 0 + */ + get z() { + + return this._z; + + } + + set z( value ) { + + this._z = value; + this._onChangeCallback(); + + } + + /** + * The w value of this quaternion. + * + * @type {number} + * @default 1 + */ + get w() { + + return this._w; + + } + + set w( value ) { + + this._w = value; + this._onChangeCallback(); + + } + + /** + * Sets the quaternion components. + * + * @param {number} x - The x value of this quaternion. + * @param {number} y - The y value of this quaternion. + * @param {number} z - The z value of this quaternion. + * @param {number} w - The w value of this quaternion. + * @return {Quaternion} A reference to this quaternion. + */ + set( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this._onChangeCallback(); + + return this; + + } + + /** + * Returns a new quaternion with copied values from this instance. + * + * @return {Quaternion} A clone of this instance. + */ + clone() { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + } + + /** + * Copies the values of the given quaternion to this instance. + * + * @param {Quaternion} quaternion - The quaternion to copy. + * @return {Quaternion} A reference to this quaternion. + */ + copy( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this._onChangeCallback(); + + return this; + + } + + /** + * Sets this quaternion from the rotation specified by the given + * Euler angles. + * + * @param {Euler} euler - The Euler angles. + * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not. + * @return {Quaternion} A reference to this quaternion. + */ + setFromEuler( euler, update = true ) { + + const x = euler._x, y = euler._y, z = euler._z, order = euler._order; + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + const cos = Math.cos; + const sin = Math.sin; + + const c1 = cos( x / 2 ); + const c2 = cos( y / 2 ); + const c3 = cos( z / 2 ); + + const s1 = sin( x / 2 ); + const s2 = sin( y / 2 ); + const s3 = sin( z / 2 ); + + switch ( order ) { + + case 'XYZ': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + + case 'YXZ': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + + case 'ZXY': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + + case 'ZYX': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + + case 'YZX': + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + + case 'XZY': + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + + default: + console.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order ); + + } + + if ( update === true ) this._onChangeCallback(); + + return this; + + } + + /** + * Sets this quaternion from the given axis and angle. + * + * @param {Vector3} axis - The normalized axis. + * @param {number} angle - The angle in radians. + * @return {Quaternion} A reference to this quaternion. + */ + setFromAxisAngle( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + const halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this._onChangeCallback(); + + return this; + + } + + /** + * Sets this quaternion from the given rotation matrix. + * + * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled). + * @return {Quaternion} A reference to this quaternion. + */ + setFromRotationMatrix( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + const te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33; + + if ( trace > 0 ) { + + const s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + const s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + const s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + const s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this._onChangeCallback(); + + return this; + + } + + /** + * Sets this quaternion to the rotation required to rotate the direction vector + * `vFrom` to the direction vector `vTo`. + * + * @param {Vector3} vFrom - The first (normalized) direction vector. + * @param {Vector3} vTo - The second (normalized) direction vector. + * @return {Quaternion} A reference to this quaternion. + */ + setFromUnitVectors( vFrom, vTo ) { + + // assumes direction vectors vFrom and vTo are normalized + + let r = vFrom.dot( vTo ) + 1; + + if ( r < Number.EPSILON ) { + + // vFrom and vTo point in opposite directions + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + this._x = - vFrom.y; + this._y = vFrom.x; + this._z = 0; + this._w = r; + + } else { + + this._x = 0; + this._y = - vFrom.z; + this._z = vFrom.y; + this._w = r; + + } + + } else { + + // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3 + + this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; + this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; + this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; + this._w = r; + + } + + return this.normalize(); + + } + + /** + * Returns the angle between this quaternion and the given one in radians. + * + * @param {Quaternion} q - The quaternion to compute the angle with. + * @return {number} The angle in radians. + */ + angleTo( q ) { + + return 2 * Math.acos( Math.abs( clamp$1( this.dot( q ), -1, 1 ) ) ); + + } + + /** + * Rotates this quaternion by a given angular step to the given quaternion. + * The method ensures that the final quaternion will not overshoot `q`. + * + * @param {Quaternion} q - The target quaternion. + * @param {number} step - The angular step in radians. + * @return {Quaternion} A reference to this quaternion. + */ + rotateTowards( q, step ) { + + const angle = this.angleTo( q ); + + if ( angle === 0 ) return this; + + const t = Math.min( 1, step / angle ); + + this.slerp( q, t ); + + return this; + + } + + /** + * Sets this quaternion to the identity quaternion; that is, to the + * quaternion that represents "no rotation". + * + * @return {Quaternion} A reference to this quaternion. + */ + identity() { + + return this.set( 0, 0, 0, 1 ); + + } + + /** + * Inverts this quaternion via {@link Quaternion#conjugate}. The + * quaternion is assumed to have unit length. + * + * @return {Quaternion} A reference to this quaternion. + */ + invert() { + + return this.conjugate(); + + } + + /** + * Returns the rotational conjugate of this quaternion. The conjugate of a + * quaternion represents the same rotation in the opposite direction about + * the rotational axis. + * + * @return {Quaternion} A reference to this quaternion. + */ + conjugate() { + + this._x *= -1; + this._y *= -1; + this._z *= -1; + + this._onChangeCallback(); + + return this; + + } + + /** + * Calculates the dot product of this quaternion and the given one. + * + * @param {Quaternion} v - The quaternion to compute the dot product with. + * @return {number} The result of the dot product. + */ + dot( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + } + + /** + * Computes the squared Euclidean length (straight-line length) of this quaternion, + * considered as a 4 dimensional vector. This can be useful if you are comparing the + * lengths of two quaternions, as this is a slightly more efficient calculation than + * {@link Quaternion#length}. + * + * @return {number} The squared Euclidean length. + */ + lengthSq() { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + } + + /** + * Computes the Euclidean length (straight-line length) of this quaternion, + * considered as a 4 dimensional vector. + * + * @return {number} The Euclidean length. + */ + length() { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + } + + /** + * Normalizes this quaternion - that is, calculated the quaternion that performs + * the same rotation as this one, but has a length equal to `1`. + * + * @return {Quaternion} A reference to this quaternion. + */ + normalize() { + + let l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this._onChangeCallback(); + + return this; + + } + + /** + * Multiplies this quaternion by the given one. + * + * @param {Quaternion} q - The quaternion. + * @return {Quaternion} A reference to this quaternion. + */ + multiply( q ) { + + return this.multiplyQuaternions( this, q ); + + } + + /** + * Pre-multiplies this quaternion by the given one. + * + * @param {Quaternion} q - The quaternion. + * @return {Quaternion} A reference to this quaternion. + */ + premultiply( q ) { + + return this.multiplyQuaternions( q, this ); + + } + + /** + * Multiplies the given quaternions and stores the result in this instance. + * + * @param {Quaternion} a - The first quaternion. + * @param {Quaternion} b - The second quaternion. + * @return {Quaternion} A reference to this quaternion. + */ + multiplyQuaternions( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this._onChangeCallback(); + + return this; + + } + + /** + * Performs a spherical linear interpolation between quaternions. + * + * @param {Quaternion} qb - The target quaternion. + * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. + * @return {Quaternion} A reference to this quaternion. + */ + slerp( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + const x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta; + + if ( sqrSinHalfTheta <= Number.EPSILON ) { + + const s = 1 - t; + this._w = s * w + t * this._w; + this._x = s * x + t * this._x; + this._y = s * y + t * this._y; + this._z = s * z + t * this._z; + + this.normalize(); // normalize calls _onChangeCallback() + + return this; + + } + + const sinHalfTheta = Math.sqrt( sqrSinHalfTheta ); + const halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + const ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this._onChangeCallback(); + + return this; + + } + + /** + * Performs a spherical linear interpolation between the given quaternions + * and stores the result in this quaternion. + * + * @param {Quaternion} qa - The source quaternion. + * @param {Quaternion} qb - The target quaternion. + * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. + * @return {Quaternion} A reference to this quaternion. + */ + slerpQuaternions( qa, qb, t ) { + + return this.copy( qa ).slerp( qb, t ); + + } + + /** + * Sets this quaternion to a uniformly random, normalized quaternion. + * + * @return {Quaternion} A reference to this quaternion. + */ + random() { + + // Ken Shoemake + // Uniform random rotations + // D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992. + + const theta1 = 2 * Math.PI * Math.random(); + const theta2 = 2 * Math.PI * Math.random(); + + const x0 = Math.random(); + const r1 = Math.sqrt( 1 - x0 ); + const r2 = Math.sqrt( x0 ); + + return this.set( + r1 * Math.sin( theta1 ), + r1 * Math.cos( theta1 ), + r2 * Math.sin( theta2 ), + r2 * Math.cos( theta2 ), + ); + + } + + /** + * Returns `true` if this quaternion is equal with the given one. + * + * @param {Quaternion} quaternion - The quaternion to test for equality. + * @return {boolean} Whether this quaternion is equal with the given one. + */ + equals( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + } + + /** + * Sets this quaternion's components from the given array. + * + * @param {Array} array - An array holding the quaternion component values. + * @param {number} [offset=0] - The offset into the array. + * @return {Quaternion} A reference to this quaternion. + */ + fromArray( array, offset = 0 ) { + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this._onChangeCallback(); + + return this; + + } + + /** + * Writes the components of this quaternion to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the quaternion components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The quaternion components. + */ + toArray( array = [], offset = 0 ) { + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + } + + /** + * Sets the components of this quaternion from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data. + * @param {number} index - The index into the attribute. + * @return {Quaternion} A reference to this quaternion. + */ + fromBufferAttribute( attribute, index ) { + + this._x = attribute.getX( index ); + this._y = attribute.getY( index ); + this._z = attribute.getZ( index ); + this._w = attribute.getW( index ); + + this._onChangeCallback(); + + return this; + + } + + /** + * This methods defines the serialization result of this class. Returns the + * numerical elements of this quaternion in an array of format `[x, y, z, w]`. + * + * @return {Array} The serialized quaternion. + */ + toJSON() { + + return this.toArray(); + + } + + _onChange( callback ) { + + this._onChangeCallback = callback; + + return this; + + } + + _onChangeCallback() {} + + *[ Symbol.iterator ]() { + + yield this._x; + yield this._y; + yield this._z; + yield this._w; + + } + +} + +/** + * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers + * (labeled x, y and z), which can be used to represent a number of things, such as: + * + * - A point in 3D space. + * - A direction and length in 3D space. In three.js the length will + * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)` + * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`. + * - Any arbitrary ordered triplet of numbers. + * + * There are other things a 3D vector can be used to represent, such as + * momentum vectors and so on, however these are the most + * common uses in three.js. + * + * Iterating through a vector instance will yield its components `(x, y, z)` in + * the corresponding order. + * ```js + * const a = new THREE.Vector3( 0, 1, 0 ); + * + * //no arguments; will be initialised to (0, 0, 0) + * const b = new THREE.Vector3( ); + * + * const d = a.distanceTo( b ); + * ``` + */ +class Vector3 { + + /** + * Constructs a new 3D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + * @param {number} [z=0] - The z value of this vector. + */ + constructor( x = 0, y = 0, z = 0 ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Vector3.prototype.isVector3 = true; + + /** + * The x value of this vector. + * + * @type {number} + */ + this.x = x; + + /** + * The y value of this vector. + * + * @type {number} + */ + this.y = y; + + /** + * The z value of this vector. + * + * @type {number} + */ + this.z = z; + + } + + /** + * Sets the vector components. + * + * @param {number} x - The value of the x component. + * @param {number} y - The value of the y component. + * @param {number} z - The value of the z component. + * @return {Vector3} A reference to this vector. + */ + set( x, y, z ) { + + if ( z === undefined ) z = this.z; // sprite.scale.set(x,y) + + this.x = x; + this.y = y; + this.z = z; + + return this; + + } + + /** + * Sets the vector components to the same value. + * + * @param {number} scalar - The value to set for all vector components. + * @return {Vector3} A reference to this vector. + */ + setScalar( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + } + + /** + * Sets the vector's x component to the given value + * + * @param {number} x - The value to set. + * @return {Vector3} A reference to this vector. + */ + setX( x ) { + + this.x = x; + + return this; + + } + + /** + * Sets the vector's y component to the given value + * + * @param {number} y - The value to set. + * @return {Vector3} A reference to this vector. + */ + setY( y ) { + + this.y = y; + + return this; + + } + + /** + * Sets the vector's z component to the given value + * + * @param {number} z - The value to set. + * @return {Vector3} A reference to this vector. + */ + setZ( z ) { + + this.z = z; + + return this; + + } + + /** + * Allows to set a vector component with an index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z. + * @param {number} value - The value to set. + * @return {Vector3} A reference to this vector. + */ + setComponent( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + } + + /** + * Returns the value of the vector component which matches the given index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z. + * @return {number} A vector component value. + */ + getComponent( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + } + + /** + * Returns a new vector with copied values from this instance. + * + * @return {Vector3} A clone of this instance. + */ + clone() { + + return new this.constructor( this.x, this.y, this.z ); + + } + + /** + * Copies the values of the given vector to this instance. + * + * @param {Vector3} v - The vector to copy. + * @return {Vector3} A reference to this vector. + */ + copy( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + } + + /** + * Adds the given vector to this instance. + * + * @param {Vector3} v - The vector to add. + * @return {Vector3} A reference to this vector. + */ + add( v ) { + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + } + + /** + * Adds the given scalar value to all components of this instance. + * + * @param {number} s - The scalar to add. + * @return {Vector3} A reference to this vector. + */ + addScalar( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + } + + /** + * Adds the given vectors and stores the result in this instance. + * + * @param {Vector3} a - The first vector. + * @param {Vector3} b - The second vector. + * @return {Vector3} A reference to this vector. + */ + addVectors( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + } + + /** + * Adds the given vector scaled by the given factor to this instance. + * + * @param {Vector3|Vector4} v - The vector. + * @param {number} s - The factor that scales `v`. + * @return {Vector3} A reference to this vector. + */ + addScaledVector( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + } + + /** + * Subtracts the given vector from this instance. + * + * @param {Vector3} v - The vector to subtract. + * @return {Vector3} A reference to this vector. + */ + sub( v ) { + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + } + + /** + * Subtracts the given scalar value from all components of this instance. + * + * @param {number} s - The scalar to subtract. + * @return {Vector3} A reference to this vector. + */ + subScalar( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + } + + /** + * Subtracts the given vectors and stores the result in this instance. + * + * @param {Vector3} a - The first vector. + * @param {Vector3} b - The second vector. + * @return {Vector3} A reference to this vector. + */ + subVectors( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + } + + /** + * Multiplies the given vector with this instance. + * + * @param {Vector3} v - The vector to multiply. + * @return {Vector3} A reference to this vector. + */ + multiply( v ) { + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + } + + /** + * Multiplies the given scalar value with all components of this instance. + * + * @param {number} scalar - The scalar to multiply. + * @return {Vector3} A reference to this vector. + */ + multiplyScalar( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + } + + /** + * Multiplies the given vectors and stores the result in this instance. + * + * @param {Vector3} a - The first vector. + * @param {Vector3} b - The second vector. + * @return {Vector3} A reference to this vector. + */ + multiplyVectors( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + } + + /** + * Applies the given Euler rotation to this vector. + * + * @param {Euler} euler - The Euler angles. + * @return {Vector3} A reference to this vector. + */ + applyEuler( euler ) { + + return this.applyQuaternion( _quaternion$4.setFromEuler( euler ) ); + + } + + /** + * Applies a rotation specified by an axis and an angle to this vector. + * + * @param {Vector3} axis - A normalized vector representing the rotation axis. + * @param {number} angle - The angle in radians. + * @return {Vector3} A reference to this vector. + */ + applyAxisAngle( axis, angle ) { + + return this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) ); + + } + + /** + * Multiplies this vector with the given 3x3 matrix. + * + * @param {Matrix3} m - The 3x3 matrix. + * @return {Vector3} A reference to this vector. + */ + applyMatrix3( m ) { + + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + } + + /** + * Multiplies this vector by the given normal matrix and normalizes + * the result. + * + * @param {Matrix3} m - The normal matrix. + * @return {Vector3} A reference to this vector. + */ + applyNormalMatrix( m ) { + + return this.applyMatrix3( m ).normalize(); + + } + + /** + * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and + * divides by perspective. + * + * @param {Matrix4} m - The matrix to apply. + * @return {Vector3} A reference to this vector. + */ + applyMatrix4( m ) { + + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + const w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w; + + return this; + + } + + /** + * Applies the given Quaternion to this vector. + * + * @param {Quaternion} q - The Quaternion. + * @return {Vector3} A reference to this vector. + */ + applyQuaternion( q ) { + + // quaternion q is assumed to have unit length + + const vx = this.x, vy = this.y, vz = this.z; + const qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // t = 2 * cross( q.xyz, v ); + const tx = 2 * ( qy * vz - qz * vy ); + const ty = 2 * ( qz * vx - qx * vz ); + const tz = 2 * ( qx * vy - qy * vx ); + + // v + q.w * t + cross( q.xyz, t ); + this.x = vx + qw * tx + qy * tz - qz * ty; + this.y = vy + qw * ty + qz * tx - qx * tz; + this.z = vz + qw * tz + qx * ty - qy * tx; + + return this; + + } + + /** + * Projects this vector from world space into the camera's normalized + * device coordinate (NDC) space. + * + * @param {Camera} camera - The camera. + * @return {Vector3} A reference to this vector. + */ + project( camera ) { + + return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix ); + + } + + /** + * Unprojects this vector from the camera's normalized device coordinate (NDC) + * space into world space. + * + * @param {Camera} camera - The camera. + * @return {Vector3} A reference to this vector. + */ + unproject( camera ) { + + return this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld ); + + } + + /** + * Transforms the direction of this vector by a matrix (the upper left 3 x 3 + * subset of the given 4x4 matrix and then normalizes the result. + * + * @param {Matrix4} m - The matrix. + * @return {Vector3} A reference to this vector. + */ + transformDirection( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + } + + /** + * Divides this instance by the given vector. + * + * @param {Vector3} v - The vector to divide. + * @return {Vector3} A reference to this vector. + */ + divide( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + } + + /** + * Divides this vector by the given scalar. + * + * @param {number} scalar - The scalar to divide. + * @return {Vector3} A reference to this vector. + */ + divideScalar( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + } + + /** + * If this vector's x, y or z value is greater than the given vector's x, y or z + * value, replace that value with the corresponding min value. + * + * @param {Vector3} v - The vector. + * @return {Vector3} A reference to this vector. + */ + min( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + } + + /** + * If this vector's x, y or z value is less than the given vector's x, y or z + * value, replace that value with the corresponding max value. + * + * @param {Vector3} v - The vector. + * @return {Vector3} A reference to this vector. + */ + max( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + } + + /** + * If this vector's x, y or z value is greater than the max vector's x, y or z + * value, it is replaced by the corresponding value. + * If this vector's x, y or z value is less than the min vector's x, y or z value, + * it is replaced by the corresponding value. + * + * @param {Vector3} min - The minimum x, y and z values. + * @param {Vector3} max - The maximum x, y and z values in the desired range. + * @return {Vector3} A reference to this vector. + */ + clamp( min, max ) { + + // assumes min < max, componentwise + + this.x = clamp$1( this.x, min.x, max.x ); + this.y = clamp$1( this.y, min.y, max.y ); + this.z = clamp$1( this.z, min.z, max.z ); + + return this; + + } + + /** + * If this vector's x, y or z values are greater than the max value, they are + * replaced by the max value. + * If this vector's x, y or z values are less than the min value, they are + * replaced by the min value. + * + * @param {number} minVal - The minimum value the components will be clamped to. + * @param {number} maxVal - The maximum value the components will be clamped to. + * @return {Vector3} A reference to this vector. + */ + clampScalar( minVal, maxVal ) { + + this.x = clamp$1( this.x, minVal, maxVal ); + this.y = clamp$1( this.y, minVal, maxVal ); + this.z = clamp$1( this.z, minVal, maxVal ); + + return this; + + } + + /** + * If this vector's length is greater than the max value, it is replaced by + * the max value. + * If this vector's length is less than the min value, it is replaced by the + * min value. + * + * @param {number} min - The minimum value the vector length will be clamped to. + * @param {number} max - The maximum value the vector length will be clamped to. + * @return {Vector3} A reference to this vector. + */ + clampLength( min, max ) { + + const length = this.length(); + + return this.divideScalar( length || 1 ).multiplyScalar( clamp$1( length, min, max ) ); + + } + + /** + * The components of this vector are rounded down to the nearest integer value. + * + * @return {Vector3} A reference to this vector. + */ + floor() { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + } + + /** + * The components of this vector are rounded up to the nearest integer value. + * + * @return {Vector3} A reference to this vector. + */ + ceil() { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + } + + /** + * The components of this vector are rounded to the nearest integer value + * + * @return {Vector3} A reference to this vector. + */ + round() { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + } + + /** + * The components of this vector are rounded towards zero (up if negative, + * down if positive) to an integer value. + * + * @return {Vector3} A reference to this vector. + */ + roundToZero() { + + this.x = Math.trunc( this.x ); + this.y = Math.trunc( this.y ); + this.z = Math.trunc( this.z ); + + return this; + + } + + /** + * Inverts this vector - i.e. sets x = -x, y = -y and z = -z. + * + * @return {Vector3} A reference to this vector. + */ + negate() { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + } + + /** + * Calculates the dot product of the given vector with this instance. + * + * @param {Vector3} v - The vector to compute the dot product with. + * @return {number} The result of the dot product. + */ + dot( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + } + + // TODO lengthSquared? + + /** + * Computes the square of the Euclidean length (straight-line length) from + * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should + * compare the length squared instead as it is slightly more efficient to calculate. + * + * @return {number} The square length of this vector. + */ + lengthSq() { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + } + + /** + * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z). + * + * @return {number} The length of this vector. + */ + length() { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + } + + /** + * Computes the Manhattan length of this vector. + * + * @return {number} The length of this vector. + */ + manhattanLength() { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + } + + /** + * Converts this vector to a unit vector - that is, sets it equal to a vector + * with the same direction as this one, but with a vector length of `1`. + * + * @return {Vector3} A reference to this vector. + */ + normalize() { + + return this.divideScalar( this.length() || 1 ); + + } + + /** + * Sets this vector to a vector with the same direction as this one, but + * with the specified length. + * + * @param {number} length - The new length of this vector. + * @return {Vector3} A reference to this vector. + */ + setLength( length ) { + + return this.normalize().multiplyScalar( length ); + + } + + /** + * Linearly interpolates between the given vector and this instance, where + * alpha is the percent distance along the line - alpha = 0 will be this + * vector, and alpha = 1 will be the given one. + * + * @param {Vector3} v - The vector to interpolate towards. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector3} A reference to this vector. + */ + lerp( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + } + + /** + * Linearly interpolates between the given vectors, where alpha is the percent + * distance along the line - alpha = 0 will be first vector, and alpha = 1 will + * be the second one. The result is stored in this instance. + * + * @param {Vector3} v1 - The first vector. + * @param {Vector3} v2 - The second vector. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector3} A reference to this vector. + */ + lerpVectors( v1, v2, alpha ) { + + this.x = v1.x + ( v2.x - v1.x ) * alpha; + this.y = v1.y + ( v2.y - v1.y ) * alpha; + this.z = v1.z + ( v2.z - v1.z ) * alpha; + + return this; + + } + + /** + * Calculates the cross product of the given vector with this instance. + * + * @param {Vector3} v - The vector to compute the cross product with. + * @return {Vector3} The result of the cross product. + */ + cross( v ) { + + return this.crossVectors( this, v ); + + } + + /** + * Calculates the cross product of the given vectors and stores the result + * in this instance. + * + * @param {Vector3} a - The first vector. + * @param {Vector3} b - The second vector. + * @return {Vector3} A reference to this vector. + */ + crossVectors( a, b ) { + + const ax = a.x, ay = a.y, az = a.z; + const bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + } + + /** + * Projects this vector onto the given one. + * + * @param {Vector3} v - The vector to project to. + * @return {Vector3} A reference to this vector. + */ + projectOnVector( v ) { + + const denominator = v.lengthSq(); + + if ( denominator === 0 ) return this.set( 0, 0, 0 ); + + const scalar = v.dot( this ) / denominator; + + return this.copy( v ).multiplyScalar( scalar ); + + } + + /** + * Projects this vector onto a plane by subtracting this + * vector projected onto the plane's normal from this vector. + * + * @param {Vector3} planeNormal - The plane normal. + * @return {Vector3} A reference to this vector. + */ + projectOnPlane( planeNormal ) { + + _vector$c.copy( this ).projectOnVector( planeNormal ); + + return this.sub( _vector$c ); + + } + + /** + * Reflects this vector off a plane orthogonal to the given normal vector. + * + * @param {Vector3} normal - The (normalized) normal vector. + * @return {Vector3} A reference to this vector. + */ + reflect( normal ) { + + return this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + } + /** + * Returns the angle between the given vector and this instance in radians. + * + * @param {Vector3} v - The vector to compute the angle with. + * @return {number} The angle in radians. + */ + angleTo( v ) { + + const denominator = Math.sqrt( this.lengthSq() * v.lengthSq() ); + + if ( denominator === 0 ) return Math.PI / 2; + + const theta = this.dot( v ) / denominator; + + // clamp, to handle numerical problems + + return Math.acos( clamp$1( theta, -1, 1 ) ); + + } + + /** + * Computes the distance from the given vector to this instance. + * + * @param {Vector3} v - The vector to compute the distance to. + * @return {number} The distance. + */ + distanceTo( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + } + + /** + * Computes the squared distance from the given vector to this instance. + * If you are just comparing the distance with another distance, you should compare + * the distance squared instead as it is slightly more efficient to calculate. + * + * @param {Vector3} v - The vector to compute the squared distance to. + * @return {number} The squared distance. + */ + distanceToSquared( v ) { + + const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + } + + /** + * Computes the Manhattan distance from the given vector to this instance. + * + * @param {Vector3} v - The vector to compute the Manhattan distance to. + * @return {number} The Manhattan distance. + */ + manhattanDistanceTo( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + } + + /** + * Sets the vector components from the given spherical coordinates. + * + * @param {Spherical} s - The spherical coordinates. + * @return {Vector3} A reference to this vector. + */ + setFromSpherical( s ) { + + return this.setFromSphericalCoords( s.radius, s.phi, s.theta ); + + } + + /** + * Sets the vector components from the given spherical coordinates. + * + * @param {number} radius - The radius. + * @param {number} phi - The phi angle in radians. + * @param {number} theta - The theta angle in radians. + * @return {Vector3} A reference to this vector. + */ + setFromSphericalCoords( radius, phi, theta ) { + + const sinPhiRadius = Math.sin( phi ) * radius; + + this.x = sinPhiRadius * Math.sin( theta ); + this.y = Math.cos( phi ) * radius; + this.z = sinPhiRadius * Math.cos( theta ); + + return this; + + } + + /** + * Sets the vector components from the given cylindrical coordinates. + * + * @param {Cylindrical} c - The cylindrical coordinates. + * @return {Vector3} A reference to this vector. + */ + setFromCylindrical( c ) { + + return this.setFromCylindricalCoords( c.radius, c.theta, c.y ); + + } + + /** + * Sets the vector components from the given cylindrical coordinates. + * + * @param {number} radius - The radius. + * @param {number} theta - The theta angle in radians. + * @param {number} y - The y value. + * @return {Vector3} A reference to this vector. + */ + setFromCylindricalCoords( radius, theta, y ) { + + this.x = radius * Math.sin( theta ); + this.y = y; + this.z = radius * Math.cos( theta ); + + return this; + + } + + /** + * Sets the vector components to the position elements of the + * given transformation matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Vector3} A reference to this vector. + */ + setFromMatrixPosition( m ) { + + const e = m.elements; + + this.x = e[ 12 ]; + this.y = e[ 13 ]; + this.z = e[ 14 ]; + + return this; + + } + + /** + * Sets the vector components to the scale elements of the + * given transformation matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Vector3} A reference to this vector. + */ + setFromMatrixScale( m ) { + + const sx = this.setFromMatrixColumn( m, 0 ).length(); + const sy = this.setFromMatrixColumn( m, 1 ).length(); + const sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + } + + /** + * Sets the vector components from the specified matrix column. + * + * @param {Matrix4} m - The 4x4 matrix. + * @param {number} index - The column index. + * @return {Vector3} A reference to this vector. + */ + setFromMatrixColumn( m, index ) { + + return this.fromArray( m.elements, index * 4 ); + + } + + /** + * Sets the vector components from the specified matrix column. + * + * @param {Matrix3} m - The 3x3 matrix. + * @param {number} index - The column index. + * @return {Vector3} A reference to this vector. + */ + setFromMatrix3Column( m, index ) { + + return this.fromArray( m.elements, index * 3 ); + + } + + /** + * Sets the vector components from the given Euler angles. + * + * @param {Euler} e - The Euler angles to set. + * @return {Vector3} A reference to this vector. + */ + setFromEuler( e ) { + + this.x = e._x; + this.y = e._y; + this.z = e._z; + + return this; + + } + + /** + * Sets the vector components from the RGB components of the + * given color. + * + * @param {Color} c - The color to set. + * @return {Vector3} A reference to this vector. + */ + setFromColor( c ) { + + this.x = c.r; + this.y = c.g; + this.z = c.b; + + return this; + + } + + /** + * Returns `true` if this vector is equal with the given one. + * + * @param {Vector3} v - The vector to test for equality. + * @return {boolean} Whether this vector is equal with the given one. + */ + equals( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + } + + /** + * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]` + * and z value to be `array[ offset + 2 ]`. + * + * @param {Array} array - An array holding the vector component values. + * @param {number} [offset=0] - The offset into the array. + * @return {Vector3} A reference to this vector. + */ + fromArray( array, offset = 0 ) { + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + } + + /** + * Writes the components of this vector to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the vector components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The vector components. + */ + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + } + + /** + * Sets the components of this vector from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding vector data. + * @param {number} index - The index into the attribute. + * @return {Vector3} A reference to this vector. + */ + fromBufferAttribute( attribute, index ) { + + this.x = attribute.getX( index ); + this.y = attribute.getY( index ); + this.z = attribute.getZ( index ); + + return this; + + } + + /** + * Sets each component of this vector to a pseudo-random value between `0` and + * `1`, excluding `1`. + * + * @return {Vector3} A reference to this vector. + */ + random() { + + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + + return this; + + } + + /** + * Sets this vector to a uniformly random point on a unit sphere. + * + * @return {Vector3} A reference to this vector. + */ + randomDirection() { + + // https://mathworld.wolfram.com/SpherePointPicking.html + + const theta = Math.random() * Math.PI * 2; + const u = Math.random() * 2 - 1; + const c = Math.sqrt( 1 - u * u ); + + this.x = c * Math.cos( theta ); + this.y = u; + this.z = c * Math.sin( theta ); + + return this; + + } + + *[ Symbol.iterator ]() { + + yield this.x; + yield this.y; + yield this.z; + + } + +} + +const _vector$c = /*@__PURE__*/ new Vector3(); +const _quaternion$4 = /*@__PURE__*/ new Quaternion(); + +/** + * Represents an axis-aligned bounding box (AABB) in 3D space. + */ +class Box3 { + + /** + * Constructs a new bounding box. + * + * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box. + * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box. + */ + constructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isBox3 = true; + + /** + * The lower boundary of the box. + * + * @type {Vector3} + */ + this.min = min; + + /** + * The upper boundary of the box. + * + * @type {Vector3} + */ + this.max = max; + + } + + /** + * Sets the lower and upper boundaries of this box. + * Please note that this method only copies the values from the given objects. + * + * @param {Vector3} min - The lower boundary of the box. + * @param {Vector3} max - The upper boundary of the box. + * @return {Box3} A reference to this bounding box. + */ + set( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + } + + /** + * Sets the upper and lower bounds of this box so it encloses the position data + * in the given array. + * + * @param {Array} array - An array holding 3D position data. + * @return {Box3} A reference to this bounding box. + */ + setFromArray( array ) { + + this.makeEmpty(); + + for ( let i = 0, il = array.length; i < il; i += 3 ) { + + this.expandByPoint( _vector$b.fromArray( array, i ) ); + + } + + return this; + + } + + /** + * Sets the upper and lower bounds of this box so it encloses the position data + * in the given buffer attribute. + * + * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data. + * @return {Box3} A reference to this bounding box. + */ + setFromBufferAttribute( attribute ) { + + this.makeEmpty(); + + for ( let i = 0, il = attribute.count; i < il; i ++ ) { + + this.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) ); + + } + + return this; + + } + + /** + * Sets the upper and lower bounds of this box so it encloses the position data + * in the given array. + * + * @param {Array} points - An array holding 3D position data as instances of {@link Vector3}. + * @return {Box3} A reference to this bounding box. + */ + setFromPoints( points ) { + + this.makeEmpty(); + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + } + + /** + * Centers this box on the given center vector and sets this box's width, height and + * depth to the given size values. + * + * @param {Vector3} center - The center of the box. + * @param {Vector3} size - The x, y and z dimensions of the box. + * @return {Box3} A reference to this bounding box. + */ + setFromCenterAndSize( center, size ) { + + const halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + } + + /** + * Computes the world-axis-aligned bounding box for the given 3D object + * (including its children), accounting for the object's, and children's, + * world transforms. The function may result in a larger box than strictly necessary. + * + * @param {Object3D} object - The 3D object to compute the bounding box for. + * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest + * world-axis-aligned bounding box at the expense of more computation. + * @return {Box3} A reference to this bounding box. + */ + setFromObject( object, precise = false ) { + + this.makeEmpty(); + + return this.expandByObject( object, precise ); + + } + + /** + * Returns a new box with copied values from this instance. + * + * @return {Box3} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + + /** + * Copies the values of the given box to this instance. + * + * @param {Box3} box - The box to copy. + * @return {Box3} A reference to this bounding box. + */ + copy( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + } + + /** + * Makes this box empty which means in encloses a zero space in 3D. + * + * @return {Box3} A reference to this bounding box. + */ + makeEmpty() { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + } + + /** + * Returns true if this box includes zero points within its bounds. + * Note that a box with equal lower and upper bounds still includes one + * point, the one both bounds share. + * + * @return {boolean} Whether this box is empty or not. + */ + isEmpty() { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + } + + /** + * Returns the center point of this box. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The center point. + */ + getCenter( target ) { + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + } + + /** + * Returns the dimensions of this box. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The size. + */ + getSize( target ) { + + return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min ); + + } + + /** + * Expands the boundaries of this box to include the given point. + * + * @param {Vector3} point - The point that should be included by the bounding box. + * @return {Box3} A reference to this bounding box. + */ + expandByPoint( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + } + + /** + * Expands this box equilaterally by the given vector. The width of this + * box will be expanded by the x component of the vector in both + * directions. The height of this box will be expanded by the y component of + * the vector in both directions. The depth of this box will be + * expanded by the z component of the vector in both directions. + * + * @param {Vector3} vector - The vector that should expand the bounding box. + * @return {Box3} A reference to this bounding box. + */ + expandByVector( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + } + + /** + * Expands each dimension of the box by the given scalar. If negative, the + * dimensions of the box will be contracted. + * + * @param {number} scalar - The scalar value that should expand the bounding box. + * @return {Box3} A reference to this bounding box. + */ + expandByScalar( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + } + + /** + * Expands the boundaries of this box to include the given 3D object and + * its children, accounting for the object's, and children's, world + * transforms. The function may result in a larger box than strictly + * necessary (unless the precise parameter is set to true). + * + * @param {Object3D} object - The 3D object that should expand the bounding box. + * @param {boolean} precise - If set to `true`, the method expands the bounding box + * as little as necessary at the expense of more computation. + * @return {Box3} A reference to this bounding box. + */ + expandByObject( object, precise = false ) { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + object.updateWorldMatrix( false, false ); + + const geometry = object.geometry; + + if ( geometry !== undefined ) { + + const positionAttribute = geometry.getAttribute( 'position' ); + + // precise AABB computation based on vertex data requires at least a position attribute. + // instancing isn't supported so far and uses the normal (conservative) code path. + + if ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) { + + for ( let i = 0, l = positionAttribute.count; i < l; i ++ ) { + + if ( object.isMesh === true ) { + + object.getVertexPosition( i, _vector$b ); + + } else { + + _vector$b.fromBufferAttribute( positionAttribute, i ); + + } + + _vector$b.applyMatrix4( object.matrixWorld ); + this.expandByPoint( _vector$b ); + + } + + } else { + + if ( object.boundingBox !== undefined ) { + + // object-level bounding box + + if ( object.boundingBox === null ) { + + object.computeBoundingBox(); + + } + + _box$4.copy( object.boundingBox ); + + + } else { + + // geometry-level bounding box + + if ( geometry.boundingBox === null ) { + + geometry.computeBoundingBox(); + + } + + _box$4.copy( geometry.boundingBox ); + + } + + _box$4.applyMatrix4( object.matrixWorld ); + + this.union( _box$4 ); + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + this.expandByObject( children[ i ], precise ); + + } + + return this; + + } + + /** + * Returns `true` if the given point lies within or on the boundaries of this box. + * + * @param {Vector3} point - The point to test. + * @return {boolean} Whether the bounding box contains the given point or not. + */ + containsPoint( point ) { + + return point.x >= this.min.x && point.x <= this.max.x && + point.y >= this.min.y && point.y <= this.max.y && + point.z >= this.min.z && point.z <= this.max.z; + + } + + /** + * Returns `true` if this bounding box includes the entirety of the given bounding box. + * If this box and the given one are identical, this function also returns `true`. + * + * @param {Box3} box - The bounding box to test. + * @return {boolean} Whether the bounding box contains the given bounding box or not. + */ + containsBox( box ) { + + return this.min.x <= box.min.x && box.max.x <= this.max.x && + this.min.y <= box.min.y && box.max.y <= this.max.y && + this.min.z <= box.min.z && box.max.z <= this.max.z; + + } + + /** + * Returns a point as a proportion of this box's width, height and depth. + * + * @param {Vector3} point - A point in 3D space. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} A point as a proportion of this box's width, height and depth. + */ + getParameter( point, target ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + return target.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + } + + /** + * Returns `true` if the given bounding box intersects with this bounding box. + * + * @param {Box3} box - The bounding box to test. + * @return {boolean} Whether the given bounding box intersects with this bounding box. + */ + intersectsBox( box ) { + + // using 6 splitting planes to rule out intersections. + return box.max.x >= this.min.x && box.min.x <= this.max.x && + box.max.y >= this.min.y && box.min.y <= this.max.y && + box.max.z >= this.min.z && box.min.z <= this.max.z; + + } + + /** + * Returns `true` if the given bounding sphere intersects with this bounding box. + * + * @param {Sphere} sphere - The bounding sphere to test. + * @return {boolean} Whether the given bounding sphere intersects with this bounding box. + */ + intersectsSphere( sphere ) { + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, _vector$b ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + } + + /** + * Returns `true` if the given plane intersects with this bounding box. + * + * @param {Plane} plane - The plane to test. + * @return {boolean} Whether the given plane intersects with this bounding box. + */ + intersectsPlane( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + let min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= - plane.constant && max >= - plane.constant ); + + } + + /** + * Returns `true` if the given triangle intersects with this bounding box. + * + * @param {Triangle} triangle - The triangle to test. + * @return {boolean} Whether the given triangle intersects with this bounding box. + */ + intersectsTriangle( triangle ) { + + if ( this.isEmpty() ) { + + return false; + + } + + // compute box center and extents + this.getCenter( _center ); + _extents.subVectors( this.max, _center ); + + // translate triangle to aabb origin + _v0$2.subVectors( triangle.a, _center ); + _v1$7.subVectors( triangle.b, _center ); + _v2$4.subVectors( triangle.c, _center ); + + // compute edge vectors for triangle + _f0.subVectors( _v1$7, _v0$2 ); + _f1.subVectors( _v2$4, _v1$7 ); + _f2.subVectors( _v0$2, _v2$4 ); + + // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb + // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation + // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) + let axes = [ + 0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y, + _f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x, + - _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0 + ]; + if ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) { + + return false; + + } + + // test 3 face normals from the aabb + axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; + if ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) { + + return false; + + } + + // finally testing the face normal of the triangle + // use already existing triangle edge vectors here + _triangleNormal.crossVectors( _f0, _f1 ); + axes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ]; + + return satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ); + + } + + /** + * Clamps the given point within the bounds of this box. + * + * @param {Vector3} point - The point to clamp. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The clamped point. + */ + clampPoint( point, target ) { + + return target.copy( point ).clamp( this.min, this.max ); + + } + + /** + * Returns the euclidean distance from any edge of this box to the specified point. If + * the given point lies inside of this box, the distance will be `0`. + * + * @param {Vector3} point - The point to compute the distance to. + * @return {number} The euclidean distance. + */ + distanceToPoint( point ) { + + return this.clampPoint( point, _vector$b ).distanceTo( point ); + + } + + /** + * Returns a bounding sphere that encloses this bounding box. + * + * @param {Sphere} target - The target sphere that is used to store the method's result. + * @return {Sphere} The bounding sphere that encloses this bounding box. + */ + getBoundingSphere( target ) { + + if ( this.isEmpty() ) { + + target.makeEmpty(); + + } else { + + this.getCenter( target.center ); + + target.radius = this.getSize( _vector$b ).length() * 0.5; + + } + + return target; + + } + + /** + * Computes the intersection of this bounding box and the given one, setting the upper + * bound of this box to the lesser of the two boxes' upper bounds and the + * lower bound of this box to the greater of the two boxes' lower bounds. If + * there's no overlap, makes this box empty. + * + * @param {Box3} box - The bounding box to intersect with. + * @return {Box3} A reference to this bounding box. + */ + intersect( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if ( this.isEmpty() ) this.makeEmpty(); + + return this; + + } + + /** + * Computes the union of this box and another and the given one, setting the upper + * bound of this box to the greater of the two boxes' upper bounds and the + * lower bound of this box to the lesser of the two boxes' lower bounds. + * + * @param {Box3} box - The bounding box that will be unioned with this instance. + * @return {Box3} A reference to this bounding box. + */ + union( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + } + + /** + * Transforms this bounding box by the given 4x4 transformation matrix. + * + * @param {Matrix4} matrix - The transformation matrix. + * @return {Box3} A reference to this bounding box. + */ + applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if ( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + _points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + _points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + _points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + _points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + _points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + _points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + _points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + _points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( _points ); + + return this; + + } + + /** + * Adds the given offset to both the upper and lower bounds of this bounding box, + * effectively moving it in 3D space. + * + * @param {Vector3} offset - The offset that should be used to translate the bounding box. + * @return {Box3} A reference to this bounding box. + */ + translate( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + } + + /** + * Returns `true` if this bounding box is equal with the given one. + * + * @param {Box3} box - The box to test for equality. + * @return {boolean} Whether this bounding box is equal with the given one. + */ + equals( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +} + +const _points = [ + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3(), + /*@__PURE__*/ new Vector3() +]; + +const _vector$b = /*@__PURE__*/ new Vector3(); + +const _box$4 = /*@__PURE__*/ new Box3(); + +// triangle centered vertices + +const _v0$2 = /*@__PURE__*/ new Vector3(); +const _v1$7 = /*@__PURE__*/ new Vector3(); +const _v2$4 = /*@__PURE__*/ new Vector3(); + +// triangle edge vectors + +const _f0 = /*@__PURE__*/ new Vector3(); +const _f1 = /*@__PURE__*/ new Vector3(); +const _f2 = /*@__PURE__*/ new Vector3(); + +const _center = /*@__PURE__*/ new Vector3(); +const _extents = /*@__PURE__*/ new Vector3(); +const _triangleNormal = /*@__PURE__*/ new Vector3(); +const _testAxis = /*@__PURE__*/ new Vector3(); + +function satForAxes( axes, v0, v1, v2, extents ) { + + for ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) { + + _testAxis.fromArray( axes, i ); + // project the aabb onto the separating axis + const r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z ); + // project all 3 vertices of the triangle onto the separating axis + const p0 = v0.dot( _testAxis ); + const p1 = v1.dot( _testAxis ); + const p2 = v2.dot( _testAxis ); + // actual test, basically see if either of the most extreme of the triangle points intersects r + if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) { + + // points of the projected triangle are outside the projected half-length of the aabb + // the axis is separating and we can exit + return false; + + } + + } + + return true; + +} + +const _box$3 = /*@__PURE__*/ new Box3(); +const _v1$6 = /*@__PURE__*/ new Vector3(); +const _v2$3 = /*@__PURE__*/ new Vector3(); + +/** + * An analytical 3D sphere defined by a center and radius. This class is mainly + * used as a Bounding Sphere for 3D objects. + */ +class Sphere { + + /** + * Constructs a new sphere. + * + * @param {Vector3} [center=(0,0,0)] - The center of the sphere + * @param {number} [radius=-1] - The radius of the sphere. + */ + constructor( center = new Vector3(), radius = -1 ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isSphere = true; + + /** + * The center of the sphere + * + * @type {Vector3} + */ + this.center = center; + + /** + * The radius of the sphere. + * + * @type {number} + */ + this.radius = radius; + + } + + /** + * Sets the sphere's components by copying the given values. + * + * @param {Vector3} center - The center. + * @param {number} radius - The radius. + * @return {Sphere} A reference to this sphere. + */ + set( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + } + + /** + * Computes the minimum bounding sphere for list of points. + * If the optional center point is given, it is used as the sphere's + * center. Otherwise, the center of the axis-aligned bounding box + * encompassing the points is calculated. + * + * @param {Array} points - A list of points in 3D space. + * @param {Vector3} [optionalCenter] - The center of the sphere. + * @return {Sphere} A reference to this sphere. + */ + setFromPoints( points, optionalCenter ) { + + const center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + _box$3.setFromPoints( points ).getCenter( center ); + + } + + let maxRadiusSq = 0; + + for ( let i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + } + + /** + * Copies the values of the given sphere to this instance. + * + * @param {Sphere} sphere - The sphere to copy. + * @return {Sphere} A reference to this sphere. + */ + copy( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + } + + /** + * Returns `true` if the sphere is empty (the radius set to a negative number). + * + * Spheres with a radius of `0` contain only their center point and are not + * considered to be empty. + * + * @return {boolean} Whether this sphere is empty or not. + */ + isEmpty() { + + return ( this.radius < 0 ); + + } + + /** + * Makes this sphere empty which means in encloses a zero space in 3D. + * + * @return {Sphere} A reference to this sphere. + */ + makeEmpty() { + + this.center.set( 0, 0, 0 ); + this.radius = -1; + + return this; + + } + + /** + * Returns `true` if this sphere contains the given point inclusive of + * the surface of the sphere. + * + * @param {Vector3} point - The point to check. + * @return {boolean} Whether this sphere contains the given point or not. + */ + containsPoint( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + } + + /** + * Returns the closest distance from the boundary of the sphere to the + * given point. If the sphere contains the point, the distance will + * be negative. + * + * @param {Vector3} point - The point to compute the distance to. + * @return {number} The distance to the point. + */ + distanceToPoint( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + } + + /** + * Returns `true` if this sphere intersects with the given one. + * + * @param {Sphere} sphere - The sphere to test. + * @return {boolean} Whether this sphere intersects with the given one or not. + */ + intersectsSphere( sphere ) { + + const radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + } + + /** + * Returns `true` if this sphere intersects with the given box. + * + * @param {Box3} box - The box to test. + * @return {boolean} Whether this sphere intersects with the given box or not. + */ + intersectsBox( box ) { + + return box.intersectsSphere( this ); + + } + + /** + * Returns `true` if this sphere intersects with the given plane. + * + * @param {Plane} plane - The plane to test. + * @return {boolean} Whether this sphere intersects with the given plane or not. + */ + intersectsPlane( plane ) { + + return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; + + } + + /** + * Clamps a point within the sphere. If the point is outside the sphere, it + * will clamp it to the closest point on the edge of the sphere. Points + * already inside the sphere will not be affected. + * + * @param {Vector3} point - The plane to clamp. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The clamped point. + */ + clampPoint( point, target ) { + + const deltaLengthSq = this.center.distanceToSquared( point ); + + target.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + target.sub( this.center ).normalize(); + target.multiplyScalar( this.radius ).add( this.center ); + + } + + return target; + + } + + /** + * Returns a bounding box that encloses this sphere. + * + * @param {Box3} target - The target box that is used to store the method's result. + * @return {Box3} The bounding box that encloses this sphere. + */ + getBoundingBox( target ) { + + if ( this.isEmpty() ) { + + // Empty sphere produces empty bounding box + target.makeEmpty(); + return target; + + } + + target.set( this.center, this.center ); + target.expandByScalar( this.radius ); + + return target; + + } + + /** + * Transforms this sphere with the given 4x4 transformation matrix. + * + * @param {Matrix4} matrix - The transformation matrix. + * @return {Sphere} A reference to this sphere. + */ + applyMatrix4( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + } + + /** + * Translates the sphere's center by the given offset. + * + * @param {Vector3} offset - The offset. + * @return {Sphere} A reference to this sphere. + */ + translate( offset ) { + + this.center.add( offset ); + + return this; + + } + + /** + * Expands the boundaries of this sphere to include the given point. + * + * @param {Vector3} point - The point to include. + * @return {Sphere} A reference to this sphere. + */ + expandByPoint( point ) { + + if ( this.isEmpty() ) { + + this.center.copy( point ); + + this.radius = 0; + + return this; + + } + + _v1$6.subVectors( point, this.center ); + + const lengthSq = _v1$6.lengthSq(); + + if ( lengthSq > ( this.radius * this.radius ) ) { + + // calculate the minimal sphere + + const length = Math.sqrt( lengthSq ); + + const delta = ( length - this.radius ) * 0.5; + + this.center.addScaledVector( _v1$6, delta / length ); + + this.radius += delta; + + } + + return this; + + } + + /** + * Expands this sphere to enclose both the original sphere and the given sphere. + * + * @param {Sphere} sphere - The sphere to include. + * @return {Sphere} A reference to this sphere. + */ + union( sphere ) { + + if ( sphere.isEmpty() ) { + + return this; + + } + + if ( this.isEmpty() ) { + + this.copy( sphere ); + + return this; + + } + + if ( this.center.equals( sphere.center ) === true ) { + + this.radius = Math.max( this.radius, sphere.radius ); + + } else { + + _v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius ); + + this.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) ); + + this.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) ); + + } + + return this; + + } + + /** + * Returns `true` if this sphere is equal with the given one. + * + * @param {Sphere} sphere - The sphere to test for equality. + * @return {boolean} Whether this bounding sphere is equal with the given one. + */ + equals( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + /** + * Returns a new sphere with copied values from this instance. + * + * @return {Sphere} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _vector$a = /*@__PURE__*/ new Vector3(); +const _segCenter = /*@__PURE__*/ new Vector3(); +const _segDir = /*@__PURE__*/ new Vector3(); +const _diff = /*@__PURE__*/ new Vector3(); + +const _edge1 = /*@__PURE__*/ new Vector3(); +const _edge2 = /*@__PURE__*/ new Vector3(); +const _normal$1 = /*@__PURE__*/ new Vector3(); + +/** + * A ray that emits from an origin in a certain direction. The class is used by + * {@link Raycaster} to assist with raycasting. Raycasting is used for + * mouse picking (working out what objects in the 3D space the mouse is over) + * amongst other things. + */ +class Ray { + + /** + * Constructs a new ray. + * + * @param {Vector3} [origin=(0,0,0)] - The origin of the ray. + * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray. + */ + constructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) { + + /** + * The origin of the ray. + * + * @type {Vector3} + */ + this.origin = origin; + + /** + * The (normalized) direction of the ray. + * + * @type {Vector3} + */ + this.direction = direction; + + } + + /** + * Sets the ray's components by copying the given values. + * + * @param {Vector3} origin - The origin. + * @param {Vector3} direction - The direction. + * @return {Ray} A reference to this ray. + */ + set( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + } + + /** + * Copies the values of the given ray to this instance. + * + * @param {Ray} ray - The ray to copy. + * @return {Ray} A reference to this ray. + */ + copy( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + } + + /** + * Returns a vector that is located at a given distance along this ray. + * + * @param {number} t - The distance along the ray to retrieve a position for. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} A position on the ray. + */ + at( t, target ) { + + return target.copy( this.origin ).addScaledVector( this.direction, t ); + + } + + /** + * Adjusts the direction of the ray to point at the given vector in world space. + * + * @param {Vector3} v - The target position. + * @return {Ray} A reference to this ray. + */ + lookAt( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + } + + /** + * Shift the origin of this ray along its direction by the given distance. + * + * @param {number} t - The distance along the ray to interpolate. + * @return {Ray} A reference to this ray. + */ + recast( t ) { + + this.origin.copy( this.at( t, _vector$a ) ); + + return this; + + } + + /** + * Returns the point along this ray that is closest to the given point. + * + * @param {Vector3} point - A point in 3D space to get the closet location on the ray for. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The closest point on this ray. + */ + closestPointToPoint( point, target ) { + + target.subVectors( point, this.origin ); + + const directionDistance = target.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return target.copy( this.origin ); + + } + + return target.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + + } + + /** + * Returns the distance of the closest approach between this ray and the given point. + * + * @param {Vector3} point - A point in 3D space to compute the distance to. + * @return {number} The distance. + */ + distanceToPoint( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + } + + /** + * Returns the squared distance of the closest approach between this ray and the given point. + * + * @param {Vector3} point - A point in 3D space to compute the distance to. + * @return {number} The squared distance. + */ + distanceSqToPoint( point ) { + + const directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + _vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance ); + + return _vector$a.distanceToSquared( point ); + + } + + /** + * Returns the squared distance between this ray and the given line segment. + * + * @param {Vector3} v0 - The start point of the line segment. + * @param {Vector3} v1 - The end point of the line segment. + * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment. + * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray. + * @return {number} The squared distance. + */ + distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + _segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + _segDir.copy( v1 ).sub( v0 ).normalize(); + _diff.copy( this.origin ).sub( _segCenter ); + + const segExtent = v0.distanceTo( v1 ) * 0.5; + const a01 = - this.direction.dot( _segDir ); + const b0 = _diff.dot( this.direction ); + const b1 = - _diff.dot( _segDir ); + const c = _diff.lengthSq(); + const det = Math.abs( 1 - a01 * a01 ); + let s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + const invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 ); + + } + + return sqrDist; + + } + + /** + * Intersects this ray with the given sphere, returning the intersection + * point or `null` if there is no intersection. + * + * @param {Sphere} sphere - The sphere to intersect. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectSphere( sphere, target ) { + + _vector$a.subVectors( sphere.center, this.origin ); + const tca = _vector$a.dot( this.direction ); + const d2 = _vector$a.dot( _vector$a ) - tca * tca; + const radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + const thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + const t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + const t1 = tca + thc; + + // test to see if t1 is behind the ray - if so, return null + if ( t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, target ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, target ); + + } + + /** + * Returns `true` if this ray intersects with the given sphere. + * + * @param {Sphere} sphere - The sphere to intersect. + * @return {boolean} Whether this ray intersects with the given sphere or not. + */ + intersectsSphere( sphere ) { + + return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius ); + + } + + /** + * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray + * does not intersect with the plane. + * + * @param {Plane} plane - The plane to compute the distance to. + * @return {?number} Whether this ray intersects with the given sphere or not. + */ + distanceToPlane( plane ) { + + const denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + const t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + } + + /** + * Intersects this ray with the given plane, returning the intersection + * point or `null` if there is no intersection. + * + * @param {Plane} plane - The plane to intersect. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectPlane( plane, target ) { + + const t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, target ); + + } + + /** + * Returns `true` if this ray intersects with the given plane. + * + * @param {Plane} plane - The plane to intersect. + * @return {boolean} Whether this ray intersects with the given plane or not. + */ + intersectsPlane( plane ) { + + // check if the ray lies on the plane first + + const distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + const denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + } + + /** + * Intersects this ray with the given bounding box, returning the intersection + * point or `null` if there is no intersection. + * + * @param {Box3} box - The box to intersect. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectBox( box, target ) { + + let tmin, tmax, tymin, tymax, tzmin, tzmax; + + const invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + const origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + if ( tymin > tmin || isNaN( tmin ) ) tmin = tymin; + + if ( tymax < tmax || isNaN( tmax ) ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, target ); + + } + + /** + * Returns `true` if this ray intersects with the given box. + * + * @param {Box3} box - The box to intersect. + * @return {boolean} Whether this ray intersects with the given box or not. + */ + intersectsBox( box ) { + + return this.intersectBox( box, _vector$a ) !== null; + + } + + /** + * Intersects this ray with the given triangle, returning the intersection + * point or `null` if there is no intersection. + * + * @param {Vector3} a - The first vertex of the triangle. + * @param {Vector3} b - The second vertex of the triangle. + * @param {Vector3} c - The third vertex of the triangle. + * @param {boolean} backfaceCulling - Whether to use backface culling or not. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectTriangle( a, b, c, backfaceCulling, target ) { + + // Compute the offset origin, edges, and normal. + + // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + _edge1.subVectors( b, a ); + _edge2.subVectors( c, a ); + _normal$1.crossVectors( _edge1, _edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + let DdN = this.direction.dot( _normal$1 ); + let sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = -1; + DdN = - DdN; + + } else { + + return null; + + } + + _diff.subVectors( this.origin, a ); + const DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + const DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + const QdN = - sign * _diff.dot( _normal$1 ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, target ); + + } + + /** + * Transforms this ray with the given 4x4 transformation matrix. + * + * @param {Matrix4} matrix4 - The transformation matrix. + * @return {Ray} A reference to this ray. + */ + applyMatrix4( matrix4 ) { + + this.origin.applyMatrix4( matrix4 ); + this.direction.transformDirection( matrix4 ); + + return this; + + } + + /** + * Returns `true` if this ray is equal with the given one. + * + * @param {Ray} ray - The ray to test for equality. + * @return {boolean} Whether this ray is equal with the given one. + */ + equals( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + /** + * Returns a new ray with copied values from this instance. + * + * @return {Ray} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + +} + +/** + * Represents a 4x4 matrix. + * + * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix. + * For an introduction to transformation matrices as used in WebGL, check out [this tutorial]{@link https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices} + * + * This allows a 3D vector representing a point in 3D space to undergo + * transformations such as translation, rotation, shear, scale, reflection, + * orthogonal or perspective projection and so on, by being multiplied by the + * matrix. This is known as `applying` the matrix to the vector. + * + * A Note on Row-Major and Column-Major Ordering: + * + * The constructor and {@link Matrix3#set} method take arguments in + * [row-major]{@link https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order} + * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order. + * This means that calling: + * ```js + * const m = new THREE.Matrix4(); + * m.set( 11, 12, 13, 14, + * 21, 22, 23, 24, + * 31, 32, 33, 34, + * 41, 42, 43, 44 ); + * ``` + * will result in the elements array containing: + * ```js + * m.elements = [ 11, 21, 31, 41, + * 12, 22, 32, 42, + * 13, 23, 33, 43, + * 14, 24, 34, 44 ]; + * ``` + * and internally all calculations are performed using column-major ordering. + * However, as the actual ordering makes no difference mathematically and + * most people are used to thinking about matrices in row-major order, the + * three.js documentation shows matrices in row-major order. Just bear in + * mind that if you are reading the source code, you'll have to take the + * transpose of any matrices outlined here to make sense of the calculations. + */ +class Matrix4 { + + /** + * Constructs a new 4x4 matrix. The arguments are supposed to be + * in row-major order. If no arguments are provided, the constructor + * initializes the matrix as an identity matrix. + * + * @param {number} [n11] - 1-1 matrix element. + * @param {number} [n12] - 1-2 matrix element. + * @param {number} [n13] - 1-3 matrix element. + * @param {number} [n14] - 1-4 matrix element. + * @param {number} [n21] - 2-1 matrix element. + * @param {number} [n22] - 2-2 matrix element. + * @param {number} [n23] - 2-3 matrix element. + * @param {number} [n24] - 2-4 matrix element. + * @param {number} [n31] - 3-1 matrix element. + * @param {number} [n32] - 3-2 matrix element. + * @param {number} [n33] - 3-3 matrix element. + * @param {number} [n34] - 3-4 matrix element. + * @param {number} [n41] - 4-1 matrix element. + * @param {number} [n42] - 4-2 matrix element. + * @param {number} [n43] - 4-3 matrix element. + * @param {number} [n44] - 4-4 matrix element. + */ + constructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + Matrix4.prototype.isMatrix4 = true; + + /** + * A column-major list of matrix values. + * + * @type {Array} + */ + this.elements = [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ]; + + if ( n11 !== undefined ) { + + this.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ); + + } + + } + + /** + * Sets the elements of the matrix.The arguments are supposed to be + * in row-major order. + * + * @param {number} [n11] - 1-1 matrix element. + * @param {number} [n12] - 1-2 matrix element. + * @param {number} [n13] - 1-3 matrix element. + * @param {number} [n14] - 1-4 matrix element. + * @param {number} [n21] - 2-1 matrix element. + * @param {number} [n22] - 2-2 matrix element. + * @param {number} [n23] - 2-3 matrix element. + * @param {number} [n24] - 2-4 matrix element. + * @param {number} [n31] - 3-1 matrix element. + * @param {number} [n32] - 3-2 matrix element. + * @param {number} [n33] - 3-3 matrix element. + * @param {number} [n34] - 3-4 matrix element. + * @param {number} [n41] - 4-1 matrix element. + * @param {number} [n42] - 4-2 matrix element. + * @param {number} [n43] - 4-3 matrix element. + * @param {number} [n44] - 4-4 matrix element. + * @return {Matrix4} A reference to this matrix. + */ + set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + const te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + } + + /** + * Sets this matrix to the 4x4 identity matrix. + * + * @return {Matrix4} A reference to this matrix. + */ + identity() { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + /** + * Returns a matrix with copied values from this instance. + * + * @return {Matrix4} A clone of this instance. + */ + clone() { + + return new Matrix4().fromArray( this.elements ); + + } + + /** + * Copies the values of the given matrix to this instance. + * + * @param {Matrix4} m - The matrix to copy. + * @return {Matrix4} A reference to this matrix. + */ + copy( m ) { + + const te = this.elements; + const me = m.elements; + + te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; + te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; + te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; + te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; + + return this; + + } + + /** + * Copies the translation component of the given matrix + * into this matrix's translation component. + * + * @param {Matrix4} m - The matrix to copy the translation component. + * @return {Matrix4} A reference to this matrix. + */ + copyPosition( m ) { + + const te = this.elements, me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + } + + /** + * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix. + * + * @param {Matrix3} m - The 3x3 matrix. + * @return {Matrix4} A reference to this matrix. + */ + setFromMatrix3( m ) { + + const me = m.elements; + + this.set( + + me[ 0 ], me[ 3 ], me[ 6 ], 0, + me[ 1 ], me[ 4 ], me[ 7 ], 0, + me[ 2 ], me[ 5 ], me[ 8 ], 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + /** + * Extracts the basis of this matrix into the three axis vectors provided. + * + * @param {Vector3} xAxis - The basis's x axis. + * @param {Vector3} yAxis - The basis's y axis. + * @param {Vector3} zAxis - The basis's z axis. + * @return {Matrix4} A reference to this matrix. + */ + extractBasis( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + } + + /** + * Sets the given basis vectors to this matrix. + * + * @param {Vector3} xAxis - The basis's x axis. + * @param {Vector3} yAxis - The basis's y axis. + * @param {Vector3} zAxis - The basis's z axis. + * @return {Matrix4} A reference to this matrix. + */ + makeBasis( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + } + + /** + * Extracts the rotation component of the given matrix + * into this matrix's rotation component. + * + * Note: This method does not support reflection matrices. + * + * @param {Matrix4} m - The matrix. + * @return {Matrix4} A reference to this matrix. + */ + extractRotation( m ) { + + const te = this.elements; + const me = m.elements; + + const scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length(); + const scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length(); + const scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + te[ 3 ] = 0; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + te[ 7 ] = 0; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + te[ 11 ] = 0; + + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + } + + /** + * Sets the rotation component (the upper left 3x3 matrix) of this matrix to + * the rotation specified by the given Euler angles. The rest of + * the matrix is set to the identity. Depending on the {@link Euler#order}, + * there are six possible outcomes. See [this page]{@link https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix} + * for a complete list. + * + * @param {Euler} euler - The Euler angles. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationFromEuler( euler ) { + + const te = this.elements; + + const x = euler.x, y = euler.y, z = euler.z; + const a = Math.cos( x ), b = Math.sin( x ); + const c = Math.cos( y ), d = Math.sin( y ); + const e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + const ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + const ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + const ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + const ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // bottom row + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // last column + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + } + + /** + * Sets the rotation component of this matrix to the rotation specified by + * the given Quaternion as outlined [here]{@link https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion} + * The rest of the matrix is set to the identity. + * + * @param {Quaternion} q - The Quaternion. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationFromQuaternion( q ) { + + return this.compose( _zero, q, _one ); + + } + + /** + * Sets the rotation component of the transformation matrix, looking from `eye` towards + * `target`, and oriented by the up-direction. + * + * @param {Vector3} eye - The eye vector. + * @param {Vector3} target - The target vector. + * @param {Vector3} up - The up vector. + * @return {Matrix4} A reference to this matrix. + */ + lookAt( eye, target, up ) { + + const te = this.elements; + + _z.subVectors( eye, target ); + + if ( _z.lengthSq() === 0 ) { + + // eye and target are in the same position + + _z.z = 1; + + } + + _z.normalize(); + _x.crossVectors( up, _z ); + + if ( _x.lengthSq() === 0 ) { + + // up and z are parallel + + if ( Math.abs( up.z ) === 1 ) { + + _z.x += 0.0001; + + } else { + + _z.z += 0.0001; + + } + + _z.normalize(); + _x.crossVectors( up, _z ); + + } + + _x.normalize(); + _y.crossVectors( _z, _x ); + + te[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x; + te[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y; + te[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z; + + return this; + + } + + /** + * Post-multiplies this matrix by the given 4x4 matrix. + * + * @param {Matrix4} m - The matrix to multiply with. + * @return {Matrix4} A reference to this matrix. + */ + multiply( m ) { + + return this.multiplyMatrices( this, m ); + + } + + /** + * Pre-multiplies this matrix by the given 4x4 matrix. + * + * @param {Matrix4} m - The matrix to multiply with. + * @return {Matrix4} A reference to this matrix. + */ + premultiply( m ) { + + return this.multiplyMatrices( m, this ); + + } + + /** + * Multiples the given 4x4 matrices and stores the result + * in this matrix. + * + * @param {Matrix4} a - The first matrix. + * @param {Matrix4} b - The second matrix. + * @return {Matrix4} A reference to this matrix. + */ + multiplyMatrices( a, b ) { + + const ae = a.elements; + const be = b.elements; + const te = this.elements; + + const a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + const a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + const a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + const a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + const b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + const b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + const b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + const b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + } + + /** + * Multiplies every component of the matrix by the given scalar. + * + * @param {number} s - The scalar. + * @return {Matrix4} A reference to this matrix. + */ + multiplyScalar( s ) { + + const te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + } + + /** + * Computes and returns the determinant of this matrix. + * + * Based on the method outlined [here]{@link http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html}. + * + * @return {number} The determinant. + */ + determinant() { + + const te = this.elements; + + const n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + const n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + const n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + const n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + } + + /** + * Transposes this matrix in place. + * + * @return {Matrix4} A reference to this matrix. + */ + transpose() { + + const te = this.elements; + let tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + } + + /** + * Sets the position component for this matrix from the given vector, + * without affecting the rest of the matrix. + * + * @param {number|Vector3} x - The x component of the vector or alternatively the vector object. + * @param {number} y - The y component of the vector. + * @param {number} z - The z component of the vector. + * @return {Matrix4} A reference to this matrix. + */ + setPosition( x, y, z ) { + + const te = this.elements; + + if ( x.isVector3 ) { + + te[ 12 ] = x.x; + te[ 13 ] = x.y; + te[ 14 ] = x.z; + + } else { + + te[ 12 ] = x; + te[ 13 ] = y; + te[ 14 ] = z; + + } + + return this; + + } + + /** + * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}. + * You can not invert with a determinant of zero. If you attempt this, the method produces + * a zero matrix instead. + * + * @return {Matrix4} A reference to this matrix. + */ + invert() { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + const te = this.elements, + + n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ], + n12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ], + n13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ], + n14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); + + const detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + } + + /** + * Multiplies the columns of this matrix by the given vector. + * + * @param {Vector3} v - The scale vector. + * @return {Matrix4} A reference to this matrix. + */ + scale( v ) { + + const te = this.elements; + const x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + } + + /** + * Gets the maximum scale value of the three axes. + * + * @return {number} The maximum scale. + */ + getMaxScaleOnAxis() { + + const te = this.elements; + + const scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + const scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + const scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + } + + /** + * Sets this matrix as a translation transform from the given vector. + * + * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector. + * @param {number} y - The amount to translate in the Y axis. + * @param {number} z - The amount to translate in the z axis. + * @return {Matrix4} A reference to this matrix. + */ + makeTranslation( x, y, z ) { + + if ( x.isVector3 ) { + + this.set( + + 1, 0, 0, x.x, + 0, 1, 0, x.y, + 0, 0, 1, x.z, + 0, 0, 0, 1 + + ); + + } else { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + } + + return this; + + } + + /** + * Sets this matrix as a rotational transformation around the X axis by + * the given angle. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationX( theta ) { + + const c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + /** + * Sets this matrix as a rotational transformation around the Y axis by + * the given angle. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationY( theta ) { + + const c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + /** + * Sets this matrix as a rotational transformation around the Z axis by + * the given angle. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationZ( theta ) { + + const c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + /** + * Sets this matrix as a rotational transformation around the given axis by + * the given angle. + * + * This is a somewhat controversial but mathematically sound alternative to + * rotating via Quaternions. See the discussion [here]{@link https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199}. + * + * @param {Vector3} axis - The normalized rotation axis. + * @param {number} angle - The rotation in radians. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationAxis( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + const c = Math.cos( angle ); + const s = Math.sin( angle ); + const t = 1 - c; + const x = axis.x, y = axis.y, z = axis.z; + const tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + /** + * Sets this matrix as a scale transformation. + * + * @param {number} x - The amount to scale in the X axis. + * @param {number} y - The amount to scale in the Y axis. + * @param {number} z - The amount to scale in the Z axis. + * @return {Matrix4} A reference to this matrix. + */ + makeScale( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + /** + * Sets this matrix as a shear transformation. + * + * @param {number} xy - The amount to shear X by Y. + * @param {number} xz - The amount to shear X by Z. + * @param {number} yx - The amount to shear Y by X. + * @param {number} yz - The amount to shear Y by Z. + * @param {number} zx - The amount to shear Z by X. + * @param {number} zy - The amount to shear Z by Y. + * @return {Matrix4} A reference to this matrix. + */ + makeShear( xy, xz, yx, yz, zx, zy ) { + + this.set( + + 1, yx, zx, 0, + xy, 1, zy, 0, + xz, yz, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + } + + /** + * Sets this matrix to the transformation composed of the given position, + * rotation (Quaternion) and scale. + * + * @param {Vector3} position - The position vector. + * @param {Quaternion} quaternion - The rotation as a Quaternion. + * @param {Vector3} scale - The scale vector. + * @return {Matrix4} A reference to this matrix. + */ + compose( position, quaternion, scale ) { + + const te = this.elements; + + const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + const x2 = x + x, y2 = y + y, z2 = z + z; + const xx = x * x2, xy = x * y2, xz = x * z2; + const yy = y * y2, yz = y * z2, zz = z * z2; + const wx = w * x2, wy = w * y2, wz = w * z2; + + const sx = scale.x, sy = scale.y, sz = scale.z; + + te[ 0 ] = ( 1 - ( yy + zz ) ) * sx; + te[ 1 ] = ( xy + wz ) * sx; + te[ 2 ] = ( xz - wy ) * sx; + te[ 3 ] = 0; + + te[ 4 ] = ( xy - wz ) * sy; + te[ 5 ] = ( 1 - ( xx + zz ) ) * sy; + te[ 6 ] = ( yz + wx ) * sy; + te[ 7 ] = 0; + + te[ 8 ] = ( xz + wy ) * sz; + te[ 9 ] = ( yz - wx ) * sz; + te[ 10 ] = ( 1 - ( xx + yy ) ) * sz; + te[ 11 ] = 0; + + te[ 12 ] = position.x; + te[ 13 ] = position.y; + te[ 14 ] = position.z; + te[ 15 ] = 1; + + return this; + + } + + /** + * Decomposes this matrix into its position, rotation and scale components + * and provides the result in the given objects. + * + * Note: Not all matrices are decomposable in this way. For example, if an + * object has a non-uniformly scaled parent, then the object's world matrix + * may not be decomposable, and this method may not be appropriate. + * + * @param {Vector3} position - The position vector. + * @param {Quaternion} quaternion - The rotation as a Quaternion. + * @param {Vector3} scale - The scale vector. + * @return {Matrix4} A reference to this matrix. + */ + decompose( position, quaternion, scale ) { + + const te = this.elements; + + let sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + const sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + const sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + const det = this.determinant(); + if ( det < 0 ) sx = - sx; + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + _m1$2.copy( this ); + + const invSX = 1 / sx; + const invSY = 1 / sy; + const invSZ = 1 / sz; + + _m1$2.elements[ 0 ] *= invSX; + _m1$2.elements[ 1 ] *= invSX; + _m1$2.elements[ 2 ] *= invSX; + + _m1$2.elements[ 4 ] *= invSY; + _m1$2.elements[ 5 ] *= invSY; + _m1$2.elements[ 6 ] *= invSY; + + _m1$2.elements[ 8 ] *= invSZ; + _m1$2.elements[ 9 ] *= invSZ; + _m1$2.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( _m1$2 ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + } + + /** + * Creates a perspective projection matrix. This is used internally by + * {@link PerspectiveCamera#updateProjectionMatrix}. + + * @param {number} left - Left boundary of the viewing frustum at the near plane. + * @param {number} right - Right boundary of the viewing frustum at the near plane. + * @param {number} top - Top boundary of the viewing frustum at the near plane. + * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane. + * @param {number} near - The distance from the camera to the near plane. + * @param {number} far - The distance from the camera to the far plane. + * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system. + * @return {Matrix4} A reference to this matrix. + */ + makePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) { + + const te = this.elements; + const x = 2 * near / ( right - left ); + const y = 2 * near / ( top - bottom ); + + const a = ( right + left ) / ( right - left ); + const b = ( top + bottom ) / ( top - bottom ); + + let c, d; + + if ( coordinateSystem === WebGLCoordinateSystem ) { + + c = - ( far + near ) / ( far - near ); + d = ( -2 * far * near ) / ( far - near ); + + } else if ( coordinateSystem === WebGPUCoordinateSystem ) { + + c = - far / ( far - near ); + d = ( - far * near ) / ( far - near ); + + } else { + + throw new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem ); + + } + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = -1; te[ 15 ] = 0; + + return this; + + } + + /** + * Creates a orthographic projection matrix. This is used internally by + * {@link OrthographicCamera#updateProjectionMatrix}. + + * @param {number} left - Left boundary of the viewing frustum at the near plane. + * @param {number} right - Right boundary of the viewing frustum at the near plane. + * @param {number} top - Top boundary of the viewing frustum at the near plane. + * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane. + * @param {number} near - The distance from the camera to the near plane. + * @param {number} far - The distance from the camera to the far plane. + * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system. + * @return {Matrix4} A reference to this matrix. + */ + makeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) { + + const te = this.elements; + const w = 1.0 / ( right - left ); + const h = 1.0 / ( top - bottom ); + const p = 1.0 / ( far - near ); + + const x = ( right + left ) * w; + const y = ( top + bottom ) * h; + + let z, zInv; + + if ( coordinateSystem === WebGLCoordinateSystem ) { + + z = ( far + near ) * p; + zInv = -2 * p; + + } else if ( coordinateSystem === WebGPUCoordinateSystem ) { + + z = near * p; + zInv = -1 * p; + + } else { + + throw new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem ); + + } + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = zInv; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + } + + /** + * Returns `true` if this matrix is equal with the given one. + * + * @param {Matrix4} matrix - The matrix to test for equality. + * @return {boolean} Whether this matrix is equal with the given one. + */ + equals( matrix ) { + + const te = this.elements; + const me = matrix.elements; + + for ( let i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + } + + /** + * Sets the elements of the matrix from the given array. + * + * @param {Array} array - The matrix elements in column-major order. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Matrix4} A reference to this matrix. + */ + fromArray( array, offset = 0 ) { + + for ( let i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + } + + /** + * Writes the elements of this matrix to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The matrix elements in column-major order. + */ + toArray( array = [], offset = 0 ) { + + const te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + +} + +const _v1$5 = /*@__PURE__*/ new Vector3(); +const _m1$2 = /*@__PURE__*/ new Matrix4(); +const _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 ); +const _one = /*@__PURE__*/ new Vector3( 1, 1, 1 ); +const _x = /*@__PURE__*/ new Vector3(); +const _y = /*@__PURE__*/ new Vector3(); +const _z = /*@__PURE__*/ new Vector3(); + +const _matrix$2 = /*@__PURE__*/ new Matrix4(); +const _quaternion$3 = /*@__PURE__*/ new Quaternion(); + +/** + * A class representing Euler angles. + * + * Euler angles describe a rotational transformation by rotating an object on + * its various axes in specified amounts per axis, and a specified axis + * order. + * + * Iterating through an instance will yield its components (x, y, z, + * order) in the corresponding order. + * + * ```js + * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' ); + * const b = new THREE.Vector3( 1, 0, 1 ); + * b.applyEuler(a); + * ``` + */ +class Euler { + + /** + * Constructs a new euler instance. + * + * @param {number} [x=0] - The angle of the x axis in radians. + * @param {number} [y=0] - The angle of the y axis in radians. + * @param {number} [z=0] - The angle of the z axis in radians. + * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied. + */ + constructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isEuler = true; + + this._x = x; + this._y = y; + this._z = z; + this._order = order; + + } + + /** + * The angle of the x axis in radians. + * + * @type {number} + * @default 0 + */ + get x() { + + return this._x; + + } + + set x( value ) { + + this._x = value; + this._onChangeCallback(); + + } + + /** + * The angle of the y axis in radians. + * + * @type {number} + * @default 0 + */ + get y() { + + return this._y; + + } + + set y( value ) { + + this._y = value; + this._onChangeCallback(); + + } + + /** + * The angle of the z axis in radians. + * + * @type {number} + * @default 0 + */ + get z() { + + return this._z; + + } + + set z( value ) { + + this._z = value; + this._onChangeCallback(); + + } + + /** + * A string representing the order that the rotations are applied. + * + * @type {string} + * @default 'XYZ' + */ + get order() { + + return this._order; + + } + + set order( value ) { + + this._order = value; + this._onChangeCallback(); + + } + + /** + * Sets the Euler components. + * + * @param {number} x - The angle of the x axis in radians. + * @param {number} y - The angle of the y axis in radians. + * @param {number} z - The angle of the z axis in radians. + * @param {string} [order] - A string representing the order that the rotations are applied. + * @return {Euler} A reference to this Euler instance. + */ + set( x, y, z, order = this._order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order; + + this._onChangeCallback(); + + return this; + + } + + /** + * Returns a new Euler instance with copied values from this instance. + * + * @return {Euler} A clone of this instance. + */ + clone() { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + } + + /** + * Copies the values of the given Euler instance to this instance. + * + * @param {Euler} euler - The Euler instance to copy. + * @return {Euler} A reference to this Euler instance. + */ + copy( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this._onChangeCallback(); + + return this; + + } + + /** + * Sets the angles of this Euler instance from a pure rotation matrix. + * + * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled). + * @param {string} [order] - A string representing the order that the rotations are applied. + * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not. + * @return {Euler} A reference to this Euler instance. + */ + setFromRotationMatrix( m, order = this._order, update = true ) { + + const te = m.elements; + const m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + const m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + const m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + switch ( order ) { + + case 'XYZ': + + this._y = Math.asin( clamp$1( m13, -1, 1 ) ); + + if ( Math.abs( m13 ) < 0.9999999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + break; + + case 'YXZ': + + this._x = Math.asin( - clamp$1( m23, -1, 1 ) ); + + if ( Math.abs( m23 ) < 0.9999999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + break; + + case 'ZXY': + + this._x = Math.asin( clamp$1( m32, -1, 1 ) ); + + if ( Math.abs( m32 ) < 0.9999999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + break; + + case 'ZYX': + + this._y = Math.asin( - clamp$1( m31, -1, 1 ) ); + + if ( Math.abs( m31 ) < 0.9999999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + break; + + case 'YZX': + + this._z = Math.asin( clamp$1( m21, -1, 1 ) ); + + if ( Math.abs( m21 ) < 0.9999999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + break; + + case 'XZY': + + this._z = Math.asin( - clamp$1( m12, -1, 1 ) ); + + if ( Math.abs( m12 ) < 0.9999999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + break; + + default: + + console.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order ); + + } + + this._order = order; + + if ( update === true ) this._onChangeCallback(); + + return this; + + } + + /** + * Sets the angles of this Euler instance from a normalized quaternion. + * + * @param {Quaternion} q - A normalized Quaternion. + * @param {string} [order] - A string representing the order that the rotations are applied. + * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not. + * @return {Euler} A reference to this Euler instance. + */ + setFromQuaternion( q, order, update ) { + + _matrix$2.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( _matrix$2, order, update ); + + } + + /** + * Sets the angles of this Euler instance from the given vector. + * + * @param {Vector3} v - The vector. + * @param {string} [order] - A string representing the order that the rotations are applied. + * @return {Euler} A reference to this Euler instance. + */ + setFromVector3( v, order = this._order ) { + + return this.set( v.x, v.y, v.z, order ); + + } + + /** + * Resets the euler angle with a new order by creating a quaternion from this + * euler angle and then setting this euler angle with the quaternion and the + * new order. + * + * Warning: This discards revolution information. + * + * @param {string} [newOrder] - A string representing the new order that the rotations are applied. + * @return {Euler} A reference to this Euler instance. + */ + reorder( newOrder ) { + + _quaternion$3.setFromEuler( this ); + + return this.setFromQuaternion( _quaternion$3, newOrder ); + + } + + /** + * Returns `true` if this Euler instance is equal with the given one. + * + * @param {Euler} euler - The Euler instance to test for equality. + * @return {boolean} Whether this Euler instance is equal with the given one. + */ + equals( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + } + + /** + * Sets this Euler instance's components to values from the given array. The first three + * entries of the array are assign to the x,y and z components. An optional fourth entry + * defines the Euler order. + * + * @param {Array} array - An array holding the Euler component values. + * @return {Euler} A reference to this Euler instance. + */ + fromArray( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this._onChangeCallback(); + + return this; + + } + + /** + * Writes the components of this Euler instance to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the Euler components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The Euler components. + */ + toArray( array = [], offset = 0 ) { + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + } + + _onChange( callback ) { + + this._onChangeCallback = callback; + + return this; + + } + + _onChangeCallback() {} + + *[ Symbol.iterator ]() { + + yield this._x; + yield this._y; + yield this._z; + yield this._order; + + } + +} + +/** + * The default Euler angle order. + * + * @static + * @type {string} + * @default 'XYZ' + */ +Euler.DEFAULT_ORDER = 'XYZ'; + +class Layers { + + constructor() { + + this.mask = 1 | 0; + + } + + set( channel ) { + + this.mask = ( 1 << channel | 0 ) >>> 0; + + } + + enable( channel ) { + + this.mask |= 1 << channel | 0; + + } + + enableAll() { + + this.mask = 0xffffffff | 0; + + } + + toggle( channel ) { + + this.mask ^= 1 << channel | 0; + + } + + disable( channel ) { + + this.mask &= ~ ( 1 << channel | 0 ); + + } + + disableAll() { + + this.mask = 0; + + } + + test( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + isEnabled( channel ) { + + return ( this.mask & ( 1 << channel | 0 ) ) !== 0; + + } + +} + +let _object3DId = 0; + +const _v1$4 = /*@__PURE__*/ new Vector3(); +const _q1 = /*@__PURE__*/ new Quaternion(); +const _m1$1$1 = /*@__PURE__*/ new Matrix4(); +const _target = /*@__PURE__*/ new Vector3(); + +const _position$3 = /*@__PURE__*/ new Vector3(); +const _scale$2 = /*@__PURE__*/ new Vector3(); +const _quaternion$2 = /*@__PURE__*/ new Quaternion(); + +const _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 ); +const _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 ); +const _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 ); + +/** + * Fires when the object has been added to its parent object. + * + * @event Object3D#added + * @type {Object} + */ +const _addedEvent = { type: 'added' }; + +/** + * Fires when the object has been removed from its parent object. + * + * @event Object3D#removed + * @type {Object} + */ +const _removedEvent = { type: 'removed' }; + +/** + * Fires when a new child object has been added. + * + * @event Object3D#childadded + * @type {Object} + */ +const _childaddedEvent = { type: 'childadded', child: null }; + +/** + * Fires when a new child object has been added. + * + * @event Object3D#childremoved + * @type {Object} + */ +const _childremovedEvent = { type: 'childremoved', child: null }; + +/** + * This is the base class for most objects in three.js and provides a set of + * properties and methods for manipulating objects in 3D space. + * + * @augments EventDispatcher + */ +class Object3D extends EventDispatcher { + + /** + * Constructs a new 3D object. + */ + constructor() { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isObject3D = true; + + /** + * The ID of the 3D object. + * + * @name Object3D#id + * @type {number} + * @readonly + */ + Object.defineProperty( this, 'id', { value: _object3DId ++ } ); + + /** + * The UUID of the 3D object. + * + * @type {string} + * @readonly + */ + this.uuid = generateUUID(); + + /** + * The name of the 3D object. + * + * @type {string} + */ + this.name = ''; + + /** + * The type property is used for detecting the object type + * in context of serialization/deserialization. + * + * @type {string} + * @readonly + */ + this.type = 'Object3D'; + + /** + * A reference to the parent object. + * + * @type {?Object3D} + * @default null + */ + this.parent = null; + + /** + * An array holding the child 3D objects of this instance. + * + * @type {Array} + */ + this.children = []; + + /** + * Defines the `up` direction of the 3D object which influences + * the orientation via methods like {@link Object3D#lookAt}. + * + * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`. + * + * @type {Vector3} + */ + this.up = Object3D.DEFAULT_UP.clone(); + + const position = new Vector3(); + const rotation = new Euler(); + const quaternion = new Quaternion(); + const scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation._onChange( onRotationChange ); + quaternion._onChange( onQuaternionChange ); + + Object.defineProperties( this, { + /** + * Represents the object's local position. + * + * @name Object3D#position + * @type {Vector3} + * @default (0,0,0) + */ + position: { + configurable: true, + enumerable: true, + value: position + }, + /** + * Represents the object's local rotation as Euler angles, in radians. + * + * @name Object3D#rotation + * @type {Euler} + * @default (0,0,0) + */ + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + /** + * Represents the object's local rotation as Quaternions. + * + * @name Object3D#quaternion + * @type {Quaternion} + */ + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + /** + * Represents the object's local scale. + * + * @name Object3D#scale + * @type {Vector3} + * @default (1,1,1) + */ + scale: { + configurable: true, + enumerable: true, + value: scale + }, + /** + * Represents the object's model-view matrix. + * + * @name Object3D#modelViewMatrix + * @type {Matrix4} + */ + modelViewMatrix: { + value: new Matrix4() + }, + /** + * Represents the object's normal matrix. + * + * @name Object3D#normalMatrix + * @type {Matrix3} + */ + normalMatrix: { + value: new Matrix3() + } + } ); + + /** + * Represents the object's transformation matrix in local space. + * + * @type {Matrix4} + */ + this.matrix = new Matrix4(); + + /** + * Represents the object's transformation matrix in world space. + * If the 3D object has no parent, then it's identical to the local transformation matrix + * + * @type {Matrix4} + */ + this.matrixWorld = new Matrix4(); + + /** + * When set to `true`, the engine automatically computes the local matrix from position, + * rotation and scale every frame. + * + * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`. + * + * @type {boolean} + * @default true + */ + this.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE; + + /** + * When set to `true`, the engine automatically computes the world matrix from the current local + * matrix and the object's transformation hierarchy. + * + * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`. + * + * @type {boolean} + * @default true + */ + this.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer + + /** + * When set to `true`, it calculates the world matrix in that frame and resets this property + * to `false`. + * + * @type {boolean} + * @default false + */ + this.matrixWorldNeedsUpdate = false; + + /** + * The layer membership of the 3D object. The 3D object is only visible if it has + * at least one layer in common with the camera in use. This property can also be + * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}. + * + * @type {Layers} + */ + this.layers = new Layers(); + + /** + * When set to `true`, the 3D object gets rendered. + * + * @type {boolean} + * @default true + */ + this.visible = true; + + /** + * When set to `true`, the 3D object gets rendered into shadow maps. + * + * @type {boolean} + * @default false + */ + this.castShadow = false; + + /** + * When set to `true`, the 3D object is affected by shadows in the scene. + * + * @type {boolean} + * @default false + */ + this.receiveShadow = false; + + /** + * When set to `true`, the 3D object is honored by view frustum culling. + * + * @type {boolean} + * @default true + */ + this.frustumCulled = true; + + /** + * This value allows the default rendering order of scene graph objects to be + * overridden although opaque and transparent objects remain sorted independently. + * When this property is set for an instance of {@link Group},all descendants + * objects will be sorted and rendered together. Sorting is from lowest to highest + * render order. + * + * @type {number} + * @default 0 + */ + this.renderOrder = 0; + + /** + * An array holding the animation clips of the 3D object. + * + * @type {Array} + */ + this.animations = []; + + /** + * An object that can be used to store custom data about the 3D object. It + * should not hold references to functions as these will not be cloned. + * + * @type {Object} + */ + this.userData = {}; + + } + + /** + * A callback that is executed immediately before a 3D object is rendered to a shadow map. + * + * @param {Renderer|WebGLRenderer} renderer - The renderer. + * @param {Object3D} object - The 3D object. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {Camera} shadowCamera - The shadow camera. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Material} depthMaterial - The depth material. + * @param {Object} group - The geometry group data. + */ + onBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {} + + /** + * A callback that is executed immediately after a 3D object is rendered to a shadow map. + * + * @param {Renderer|WebGLRenderer} renderer - The renderer. + * @param {Object3D} object - The 3D object. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {Camera} shadowCamera - The shadow camera. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Material} depthMaterial - The depth material. + * @param {Object} group - The geometry group data. + */ + onAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {} + + /** + * A callback that is executed immediately before a 3D object is rendered. + * + * @param {Renderer|WebGLRenderer} renderer - The renderer. + * @param {Object3D} object - The 3D object. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Material} material - The 3D object's material. + * @param {Object} group - The geometry group data. + */ + onBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {} + + /** + * A callback that is executed immediately after a 3D object is rendered. + * + * @param {Renderer|WebGLRenderer} renderer - The renderer. + * @param {Object3D} object - The 3D object. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Material} material - The 3D object's material. + * @param {Object} group - The geometry group data. + */ + onAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {} + + /** + * Applies the given transformation matrix to the object and updates the object's position, + * rotation and scale. + * + * @param {Matrix4} matrix - The transformation matrix. + */ + applyMatrix4( matrix ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + this.matrix.premultiply( matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + } + + /** + * Applies a rotation represented by given the quaternion to the 3D object. + * + * @param {Quaternion} q - The quaternion. + * @return {Object3D} A reference to this instance. + */ + applyQuaternion( q ) { + + this.quaternion.premultiply( q ); + + return this; + + } + + /** + * Sets the given rotation represented as an axis/angle couple to the 3D object. + * + * @param {Vector3} axis - The (normalized) axis vector. + * @param {number} angle - The angle in radians. + */ + setRotationFromAxisAngle( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + } + + /** + * Sets the given rotation represented as Euler angles to the 3D object. + * + * @param {Euler} euler - The Euler angles. + */ + setRotationFromEuler( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + } + + /** + * Sets the given rotation represented as rotation matrix to the 3D object. + * + * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be + * a pure rotation matrix (i.e, unscaled). + */ + setRotationFromMatrix( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + } + + /** + * Sets the given rotation represented as a Quaternion to the 3D object. + * + * @param {Quaternion} q - The Quaternion + */ + setRotationFromQuaternion( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + } + + /** + * Rotates the 3D object along an axis in local space. + * + * @param {Vector3} axis - The (normalized) axis vector. + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateOnAxis( axis, angle ) { + + // rotate object on axis in object space + // axis is assumed to be normalized + + _q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( _q1 ); + + return this; + + } + + /** + * Rotates the 3D object along an axis in world space. + * + * @param {Vector3} axis - The (normalized) axis vector. + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateOnWorldAxis( axis, angle ) { + + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + _q1.setFromAxisAngle( axis, angle ); + + this.quaternion.premultiply( _q1 ); + + return this; + + } + + /** + * Rotates the 3D object around its X axis in local space. + * + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateX( angle ) { + + return this.rotateOnAxis( _xAxis, angle ); + + } + + /** + * Rotates the 3D object around its Y axis in local space. + * + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateY( angle ) { + + return this.rotateOnAxis( _yAxis, angle ); + + } + + /** + * Rotates the 3D object around its Z axis in local space. + * + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateZ( angle ) { + + return this.rotateOnAxis( _zAxis, angle ); + + } + + /** + * Translate the 3D object by a distance along the given axis in local space. + * + * @param {Vector3} axis - The (normalized) axis vector. + * @param {number} distance - The distance in world units. + * @return {Object3D} A reference to this instance. + */ + translateOnAxis( axis, distance ) { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + _v1$4.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( _v1$4.multiplyScalar( distance ) ); + + return this; + + } + + /** + * Translate the 3D object by a distance along its X-axis in local space. + * + * @param {number} distance - The distance in world units. + * @return {Object3D} A reference to this instance. + */ + translateX( distance ) { + + return this.translateOnAxis( _xAxis, distance ); + + } + + /** + * Translate the 3D object by a distance along its Y-axis in local space. + * + * @param {number} distance - The distance in world units. + * @return {Object3D} A reference to this instance. + */ + translateY( distance ) { + + return this.translateOnAxis( _yAxis, distance ); + + } + + /** + * Translate the 3D object by a distance along its Z-axis in local space. + * + * @param {number} distance - The distance in world units. + * @return {Object3D} A reference to this instance. + */ + translateZ( distance ) { + + return this.translateOnAxis( _zAxis, distance ); + + } + + /** + * Converts the given vector from this 3D object's local space to world space. + * + * @param {Vector3} vector - The vector to convert. + * @return {Vector3} The converted vector. + */ + localToWorld( vector ) { + + this.updateWorldMatrix( true, false ); + + return vector.applyMatrix4( this.matrixWorld ); + + } + + /** + * Converts the given vector from this 3D object's word space to local space. + * + * @param {Vector3} vector - The vector to convert. + * @return {Vector3} The converted vector. + */ + worldToLocal( vector ) { + + this.updateWorldMatrix( true, false ); + + return vector.applyMatrix4( _m1$1$1.copy( this.matrixWorld ).invert() ); + + } + + /** + * Rotates the object to face a point in world space. + * + * This method does not support objects having non-uniformly-scaled parent(s). + * + * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space + * @param {number} [y] - The y coordinate in world space. + * @param {number} [z] - The z coordinate in world space. + */ + lookAt( x, y, z ) { + + // This method does not support objects having non-uniformly-scaled parent(s) + + if ( x.isVector3 ) { + + _target.copy( x ); + + } else { + + _target.set( x, y, z ); + + } + + const parent = this.parent; + + this.updateWorldMatrix( true, false ); + + _position$3.setFromMatrixPosition( this.matrixWorld ); + + if ( this.isCamera || this.isLight ) { + + _m1$1$1.lookAt( _position$3, _target, this.up ); + + } else { + + _m1$1$1.lookAt( _target, _position$3, this.up ); + + } + + this.quaternion.setFromRotationMatrix( _m1$1$1 ); + + if ( parent ) { + + _m1$1$1.extractRotation( parent.matrixWorld ); + _q1.setFromRotationMatrix( _m1$1$1 ); + this.quaternion.premultiply( _q1.invert() ); + + } + + } + + /** + * Adds the given 3D object as a child to this 3D object. An arbitrary number of + * objects may be added. Any current parent on an object passed in here will be + * removed, since an object can have at most one parent. + * + * @fires Object3D#added + * @fires Object3D#childadded + * @param {Object3D} object - The 3D object to add. + * @return {Object3D} A reference to this instance. + */ + add( object ) { + + if ( arguments.length > 1 ) { + + for ( let i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( 'THREE.Object3D.add: object can\'t be added as a child of itself.', object ); + return this; + + } + + if ( object && object.isObject3D ) { + + object.removeFromParent(); + object.parent = this; + this.children.push( object ); + + object.dispatchEvent( _addedEvent ); + + _childaddedEvent.child = object; + this.dispatchEvent( _childaddedEvent ); + _childaddedEvent.child = null; + + } else { + + console.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object ); + + } + + return this; + + } + + /** + * Removes the given 3D object as child from this 3D object. + * An arbitrary number of objects may be removed. + * + * @fires Object3D#removed + * @fires Object3D#childremoved + * @param {Object3D} object - The 3D object to remove. + * @return {Object3D} A reference to this instance. + */ + remove( object ) { + + if ( arguments.length > 1 ) { + + for ( let i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + return this; + + } + + const index = this.children.indexOf( object ); + + if ( index !== -1 ) { + + object.parent = null; + this.children.splice( index, 1 ); + + object.dispatchEvent( _removedEvent ); + + _childremovedEvent.child = object; + this.dispatchEvent( _childremovedEvent ); + _childremovedEvent.child = null; + + } + + return this; + + } + + /** + * Removes this 3D object from its current parent. + * + * @fires Object3D#removed + * @fires Object3D#childremoved + * @return {Object3D} A reference to this instance. + */ + removeFromParent() { + + const parent = this.parent; + + if ( parent !== null ) { + + parent.remove( this ); + + } + + return this; + + } + + /** + * Removes all child objects. + * + * @fires Object3D#removed + * @fires Object3D#childremoved + * @return {Object3D} A reference to this instance. + */ + clear() { + + return this.remove( ... this.children ); + + } + + /** + * Adds the given 3D object as a child of this 3D object, while maintaining the object's world + * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s). + * + * @fires Object3D#added + * @fires Object3D#childadded + * @param {Object3D} object - The 3D object to attach. + * @return {Object3D} A reference to this instance. + */ + attach( object ) { + + // adds object as a child of this, while maintaining the object's world transform + + // Note: This method does not support scene graphs having non-uniformly-scaled nodes(s) + + this.updateWorldMatrix( true, false ); + + _m1$1$1.copy( this.matrixWorld ).invert(); + + if ( object.parent !== null ) { + + object.parent.updateWorldMatrix( true, false ); + + _m1$1$1.multiply( object.parent.matrixWorld ); + + } + + object.applyMatrix4( _m1$1$1 ); + + object.removeFromParent(); + object.parent = this; + this.children.push( object ); + + object.updateWorldMatrix( false, true ); + + object.dispatchEvent( _addedEvent ); + + _childaddedEvent.child = object; + this.dispatchEvent( _childaddedEvent ); + _childaddedEvent.child = null; + + return this; + + } + + /** + * Searches through the 3D object and its children, starting with the 3D object + * itself, and returns the first with a matching ID. + * + * @param {number} id - The id. + * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found. + */ + getObjectById( id ) { + + return this.getObjectByProperty( 'id', id ); + + } + + /** + * Searches through the 3D object and its children, starting with the 3D object + * itself, and returns the first with a matching name. + * + * @param {string} name - The name. + * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found. + */ + getObjectByName( name ) { + + return this.getObjectByProperty( 'name', name ); + + } + + /** + * Searches through the 3D object and its children, starting with the 3D object + * itself, and returns the first with a matching property value. + * + * @param {string} name - The name of the property. + * @param {any} value - The value. + * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found. + */ + getObjectByProperty( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( let i = 0, l = this.children.length; i < l; i ++ ) { + + const child = this.children[ i ]; + const object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + } + + /** + * Searches through the 3D object and its children, starting with the 3D object + * itself, and returns all 3D objects with a matching property value. + * + * @param {string} name - The name of the property. + * @param {any} value - The value. + * @param {Array} result - The method stores the result in this array. + * @return {Array} The found 3D objects. + */ + getObjectsByProperty( name, value, result = [] ) { + + if ( this[ name ] === value ) result.push( this ); + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].getObjectsByProperty( name, value, result ); + + } + + return result; + + } + + /** + * Returns a vector representing the position of the 3D object in world space. + * + * @param {Vector3} target - The target vector the result is stored to. + * @return {Vector3} The 3D object's position in world space. + */ + getWorldPosition( target ) { + + this.updateWorldMatrix( true, false ); + + return target.setFromMatrixPosition( this.matrixWorld ); + + } + + /** + * Returns a Quaternion representing the position of the 3D object in world space. + * + * @param {Quaternion} target - The target Quaternion the result is stored to. + * @return {Quaternion} The 3D object's rotation in world space. + */ + getWorldQuaternion( target ) { + + this.updateWorldMatrix( true, false ); + + this.matrixWorld.decompose( _position$3, target, _scale$2 ); + + return target; + + } + + /** + * Returns a vector representing the scale of the 3D object in world space. + * + * @param {Vector3} target - The target vector the result is stored to. + * @return {Vector3} The 3D object's scale in world space. + */ + getWorldScale( target ) { + + this.updateWorldMatrix( true, false ); + + this.matrixWorld.decompose( _position$3, _quaternion$2, target ); + + return target; + + } + + /** + * Returns a vector representing the ("look") direction of the 3D object in world space. + * + * @param {Vector3} target - The target vector the result is stored to. + * @return {Vector3} The 3D object's direction in world space. + */ + getWorldDirection( target ) { + + this.updateWorldMatrix( true, false ); + + const e = this.matrixWorld.elements; + + return target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize(); + + } + + /** + * Abstract method to get intersections between a casted ray and this + * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points} + * implement this method in order to use raycasting. + * + * @abstract + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - An array holding the result of the method. + */ + raycast( /* raycaster, intersects */ ) {} + + /** + * Executes the callback on this 3D object and all descendants. + * + * Note: Modifying the scene graph inside the callback is discouraged. + * + * @param {Function} callback - A callback function that allows to process the current 3D object. + */ + traverse( callback ) { + + callback( this ); + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + } + + /** + * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects. + * Descendants of invisible 3D objects are not traversed. + * + * Note: Modifying the scene graph inside the callback is discouraged. + * + * @param {Function} callback - A callback function that allows to process the current 3D object. + */ + traverseVisible( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + } + + /** + * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors. + * + * Note: Modifying the scene graph inside the callback is discouraged. + * + * @param {Function} callback - A callback function that allows to process the current 3D object. + */ + traverseAncestors( callback ) { + + const parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + } + + /** + * Updates the transformation matrix in local space by computing it from the current + * position, rotation and scale values. + */ + updateMatrix() { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + } + + /** + * Updates the transformation matrix in world space of this 3D objects and its descendants. + * + * To ensure correct results, this method also recomputes the 3D object's transformation matrix in + * local space. The computation of the local and world matrix can be controlled with the + * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both + * `true` by default. Set these flags to `false` if you need more control over the update matrix process. + * + * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even + * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`. + */ + updateMatrixWorld( force ) { + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate || force ) { + + if ( this.matrixWorldAutoUpdate === true ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // make sure descendants are updated if required + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + const child = children[ i ]; + + child.updateMatrixWorld( force ); + + } + + } + + /** + * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the + * update of ancestor and descendant nodes. + * + * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not. + * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not. + */ + updateWorldMatrix( updateParents, updateChildren ) { + + const parent = this.parent; + + if ( updateParents === true && parent !== null ) { + + parent.updateWorldMatrix( true, false ); + + } + + if ( this.matrixAutoUpdate ) this.updateMatrix(); + + if ( this.matrixWorldAutoUpdate === true ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + } + + // make sure descendants are updated + + if ( updateChildren === true ) { + + const children = this.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + const child = children[ i ]; + + child.updateWorldMatrix( false, true ); + + } + + } + + } + + /** + * Serializes the 3D object into JSON. + * + * @param {?(Object|string)} meta - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized 3D object. + * @see {@link ObjectLoader#parse} + */ + toJSON( meta ) { + + // meta is a string when called from JSON.stringify + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + const output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {}, + skeletons: {}, + animations: {}, + nodes: {} + }; + + output.metadata = { + version: 4.6, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + const object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + if ( this.frustumCulled === false ) object.frustumCulled = false; + if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder; + if ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData; + + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); + object.up = this.up.toArray(); + + if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false; + + // object specific properties + + if ( this.isInstancedMesh ) { + + object.type = 'InstancedMesh'; + object.count = this.count; + object.instanceMatrix = this.instanceMatrix.toJSON(); + if ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON(); + + } + + if ( this.isBatchedMesh ) { + + object.type = 'BatchedMesh'; + object.perObjectFrustumCulled = this.perObjectFrustumCulled; + object.sortObjects = this.sortObjects; + + object.drawRanges = this._drawRanges; + object.reservedRanges = this._reservedRanges; + + object.visibility = this._visibility; + object.active = this._active; + object.bounds = this._bounds.map( bound => ( { + boxInitialized: bound.boxInitialized, + boxMin: bound.box.min.toArray(), + boxMax: bound.box.max.toArray(), + + sphereInitialized: bound.sphereInitialized, + sphereRadius: bound.sphere.radius, + sphereCenter: bound.sphere.center.toArray() + } ) ); + + object.maxInstanceCount = this._maxInstanceCount; + object.maxVertexCount = this._maxVertexCount; + object.maxIndexCount = this._maxIndexCount; + + object.geometryInitialized = this._geometryInitialized; + object.geometryCount = this._geometryCount; + + object.matricesTexture = this._matricesTexture.toJSON( meta ); + + if ( this._colorsTexture !== null ) object.colorsTexture = this._colorsTexture.toJSON( meta ); + + if ( this.boundingSphere !== null ) { + + object.boundingSphere = { + center: object.boundingSphere.center.toArray(), + radius: object.boundingSphere.radius + }; + + } + + if ( this.boundingBox !== null ) { + + object.boundingBox = { + min: object.boundingBox.min.toArray(), + max: object.boundingBox.max.toArray() + }; + + } + + } + + // + + function serialize( library, element ) { + + if ( library[ element.uuid ] === undefined ) { + + library[ element.uuid ] = element.toJSON( meta ); + + } + + return element.uuid; + + } + + if ( this.isScene ) { + + if ( this.background ) { + + if ( this.background.isColor ) { + + object.background = this.background.toJSON(); + + } else if ( this.background.isTexture ) { + + object.background = this.background.toJSON( meta ).uuid; + + } + + } + + if ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) { + + object.environment = this.environment.toJSON( meta ).uuid; + + } + + } else if ( this.isMesh || this.isLine || this.isPoints ) { + + object.geometry = serialize( meta.geometries, this.geometry ); + + const parameters = this.geometry.parameters; + + if ( parameters !== undefined && parameters.shapes !== undefined ) { + + const shapes = parameters.shapes; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + serialize( meta.shapes, shape ); + + } + + } else { + + serialize( meta.shapes, shapes ); + + } + + } + + } + + if ( this.isSkinnedMesh ) { + + object.bindMode = this.bindMode; + object.bindMatrix = this.bindMatrix.toArray(); + + if ( this.skeleton !== undefined ) { + + serialize( meta.skeletons, this.skeleton ); + + object.skeleton = this.skeleton.uuid; + + } + + } + + if ( this.material !== undefined ) { + + if ( Array.isArray( this.material ) ) { + + const uuids = []; + + for ( let i = 0, l = this.material.length; i < l; i ++ ) { + + uuids.push( serialize( meta.materials, this.material[ i ] ) ); + + } + + object.material = uuids; + + } else { + + object.material = serialize( meta.materials, this.material ); + + } + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( let i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + // + + if ( this.animations.length > 0 ) { + + object.animations = []; + + for ( let i = 0; i < this.animations.length; i ++ ) { + + const animation = this.animations[ i ]; + + object.animations.push( serialize( meta.animations, animation ) ); + + } + + } + + if ( isRootObject ) { + + const geometries = extractFromCache( meta.geometries ); + const materials = extractFromCache( meta.materials ); + const textures = extractFromCache( meta.textures ); + const images = extractFromCache( meta.images ); + const shapes = extractFromCache( meta.shapes ); + const skeletons = extractFromCache( meta.skeletons ); + const animations = extractFromCache( meta.animations ); + const nodes = extractFromCache( meta.nodes ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + if ( shapes.length > 0 ) output.shapes = shapes; + if ( skeletons.length > 0 ) output.skeletons = skeletons; + if ( animations.length > 0 ) output.animations = animations; + if ( nodes.length > 0 ) output.nodes = nodes; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + const values = []; + for ( const key in cache ) { + + const data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + } + + /** + * Returns a new 3D object with copied values from this instance. + * + * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned. + * @return {Object3D} A clone of this instance. + */ + clone( recursive ) { + + return new this.constructor().copy( this, recursive ); + + } + + /** + * Copies the values of the given 3D object to this instance. + * + * @param {Object3D} source - The 3D object to copy. + * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned. + * @return {Object3D} A reference to this instance. + */ + copy( source, recursive = true ) { + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.rotation.order = source.rotation.order; + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + + this.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.layers.mask = source.layers.mask; + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.animations = source.animations.slice(); + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( let i = 0; i < source.children.length; i ++ ) { + + const child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + +} + +/** + * The default up direction for objects, also used as the default + * position for {@link DirectionalLight} and {@link HemisphereLight}. + * + * @static + * @type {Vector3} + * @default (0,1,0) + */ +Object3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 ); + +/** + * The default setting for {@link Object3D#matrixAutoUpdate} for + * newly created 3D objects. + * + * @static + * @type {boolean} + * @default true + */ +Object3D.DEFAULT_MATRIX_AUTO_UPDATE = true; + +/** + * The default setting for {@link Object3D#matrixWorldAutoUpdate} for + * newly created 3D objects. + * + * @static + * @type {boolean} + * @default true + */ +Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true; + +const _v0$1 = /*@__PURE__*/ new Vector3(); +const _v1$3 = /*@__PURE__*/ new Vector3(); +const _v2$2 = /*@__PURE__*/ new Vector3(); +const _v3$2 = /*@__PURE__*/ new Vector3(); + +const _vab = /*@__PURE__*/ new Vector3(); +const _vac = /*@__PURE__*/ new Vector3(); +const _vbc = /*@__PURE__*/ new Vector3(); +const _vap = /*@__PURE__*/ new Vector3(); +const _vbp = /*@__PURE__*/ new Vector3(); +const _vcp = /*@__PURE__*/ new Vector3(); + +const _v40 = /*@__PURE__*/ new Vector4(); +const _v41 = /*@__PURE__*/ new Vector4(); +const _v42 = /*@__PURE__*/ new Vector4(); + +/** + * A geometric triangle as defined by three vectors representing its three corners. + */ +class Triangle { + + /** + * Constructs a new triangle. + * + * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle. + * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle. + * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle. + */ + constructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) { + + /** + * The first corner of the triangle. + * + * @type {Vector3} + */ + this.a = a; + + /** + * The second corner of the triangle. + * + * @type {Vector3} + */ + this.b = b; + + /** + * The third corner of the triangle. + * + * @type {Vector3} + */ + this.c = c; + + } + + /** + * Computes the normal vector of a triangle. + * + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The triangle's normal. + */ + static getNormal( a, b, c, target ) { + + target.subVectors( c, b ); + _v0$1.subVectors( a, b ); + target.cross( _v0$1 ); + + const targetLengthSq = target.lengthSq(); + if ( targetLengthSq > 0 ) { + + return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) ); + + } + + return target.set( 0, 0, 0 ); + + } + + /** + * Computes a barycentric coordinates from the given vector. + * Returns `null` if the triangle is degenerate. + * + * @param {Vector3} point - A point in 3D space. + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The barycentric coordinates for the given point + */ + static getBarycoord( point, a, b, c, target ) { + + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + + _v0$1.subVectors( c, a ); + _v1$3.subVectors( b, a ); + _v2$2.subVectors( point, a ); + + const dot00 = _v0$1.dot( _v0$1 ); + const dot01 = _v0$1.dot( _v1$3 ); + const dot02 = _v0$1.dot( _v2$2 ); + const dot11 = _v1$3.dot( _v1$3 ); + const dot12 = _v1$3.dot( _v2$2 ); + + const denom = ( dot00 * dot11 - dot01 * dot01 ); + + // collinear or singular triangle + if ( denom === 0 ) { + + target.set( 0, 0, 0 ); + return null; + + } + + const invDenom = 1 / denom; + const u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + const v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return target.set( 1 - u - v, v, u ); + + } + + /** + * Returns `true` if the given point, when projected onto the plane of the + * triangle, lies within the triangle. + * + * @param {Vector3} point - The point in 3D space to test. + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @return {boolean} Whether the given point, when projected onto the plane of the + * triangle, lies within the triangle or not. + */ + static containsPoint( point, a, b, c ) { + + // if the triangle is degenerate then we can't contain a point + if ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) { + + return false; + + } + + return ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 ); + + } + + /** + * Computes the value barycentrically interpolated for the given point on the + * triangle. Returns `null` if the triangle is degenerate. + * + * @param {Vector3} point - Position of interpolated point. + * @param {Vector3} p1 - The first corner of the triangle. + * @param {Vector3} p2 - The second corner of the triangle. + * @param {Vector3} p3 - The third corner of the triangle. + * @param {Vector3} v1 - Value to interpolate of first vertex. + * @param {Vector3} v2 - Value to interpolate of second vertex. + * @param {Vector3} v3 - Value to interpolate of third vertex. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The interpolated value. + */ + static getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) { + + if ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) { + + target.x = 0; + target.y = 0; + if ( 'z' in target ) target.z = 0; + if ( 'w' in target ) target.w = 0; + return null; + + } + + target.setScalar( 0 ); + target.addScaledVector( v1, _v3$2.x ); + target.addScaledVector( v2, _v3$2.y ); + target.addScaledVector( v3, _v3$2.z ); + + return target; + + } + + /** + * Computes the value barycentrically interpolated for the given attribute and indices. + * + * @param {BufferAttribute} attr - The attribute to interpolate. + * @param {number} i1 - Index of first vertex. + * @param {number} i2 - Index of second vertex. + * @param {number} i3 - Index of third vertex. + * @param {Vector3} barycoord - The barycoordinate value to use to interpolate. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The interpolated attribute value. + */ + static getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) { + + _v40.setScalar( 0 ); + _v41.setScalar( 0 ); + _v42.setScalar( 0 ); + + _v40.fromBufferAttribute( attr, i1 ); + _v41.fromBufferAttribute( attr, i2 ); + _v42.fromBufferAttribute( attr, i3 ); + + target.setScalar( 0 ); + target.addScaledVector( _v40, barycoord.x ); + target.addScaledVector( _v41, barycoord.y ); + target.addScaledVector( _v42, barycoord.z ); + + return target; + + } + + /** + * Returns `true` if the triangle is oriented towards the given direction. + * + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @param {Vector3} direction - The (normalized) direction vector. + * @return {boolean} Whether the triangle is oriented towards the given direction or not. + */ + static isFrontFacing( a, b, c, direction ) { + + _v0$1.subVectors( c, b ); + _v1$3.subVectors( a, b ); + + // strictly front facing + return ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false; + + } + + /** + * Sets the triangle's vertices by copying the given values. + * + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @return {Triangle} A reference to this triangle. + */ + set( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + } + + /** + * Sets the triangle's vertices by copying the given array values. + * + * @param {Array} points - An array with 3D points. + * @param {number} i0 - The array index representing the first corner of the triangle. + * @param {number} i1 - The array index representing the second corner of the triangle. + * @param {number} i2 - The array index representing the third corner of the triangle. + * @return {Triangle} A reference to this triangle. + */ + setFromPointsAndIndices( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + } + + /** + * Sets the triangle's vertices by copying the given attribute values. + * + * @param {BufferAttribute} attribute - A buffer attribute with 3D points data. + * @param {number} i0 - The attribute index representing the first corner of the triangle. + * @param {number} i1 - The attribute index representing the second corner of the triangle. + * @param {number} i2 - The attribute index representing the third corner of the triangle. + * @return {Triangle} A reference to this triangle. + */ + setFromAttributeAndIndices( attribute, i0, i1, i2 ) { + + this.a.fromBufferAttribute( attribute, i0 ); + this.b.fromBufferAttribute( attribute, i1 ); + this.c.fromBufferAttribute( attribute, i2 ); + + return this; + + } + + /** + * Returns a new triangle with copied values from this instance. + * + * @return {Triangle} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + + /** + * Copies the values of the given triangle to this instance. + * + * @param {Triangle} triangle - The triangle to copy. + * @return {Triangle} A reference to this triangle. + */ + copy( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + } + + /** + * Computes the area of the triangle. + * + * @return {number} The triangle's area. + */ + getArea() { + + _v0$1.subVectors( this.c, this.b ); + _v1$3.subVectors( this.a, this.b ); + + return _v0$1.cross( _v1$3 ).length() * 0.5; + + } + + /** + * Computes the midpoint of the triangle. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The triangle's midpoint. + */ + getMidpoint( target ) { + + return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + } + + /** + * Computes the normal of the triangle. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The triangle's normal. + */ + getNormal( target ) { + + return Triangle.getNormal( this.a, this.b, this.c, target ); + + } + + /** + * Computes a plane the triangle lies within. + * + * @param {Plane} target - The target vector that is used to store the method's result. + * @return {Plane} The plane the triangle lies within. + */ + getPlane( target ) { + + return target.setFromCoplanarPoints( this.a, this.b, this.c ); + + } + + /** + * Computes a barycentric coordinates from the given vector. + * Returns `null` if the triangle is degenerate. + * + * @param {Vector3} point - A point in 3D space. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The barycentric coordinates for the given point + */ + getBarycoord( point, target ) { + + return Triangle.getBarycoord( point, this.a, this.b, this.c, target ); + + } + + /** + * Computes the value barycentrically interpolated for the given point on the + * triangle. Returns `null` if the triangle is degenerate. + * + * @param {Vector3} point - Position of interpolated point. + * @param {Vector3} v1 - Value to interpolate of first vertex. + * @param {Vector3} v2 - Value to interpolate of second vertex. + * @param {Vector3} v3 - Value to interpolate of third vertex. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The interpolated value. + */ + getInterpolation( point, v1, v2, v3, target ) { + + return Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target ); + + } + + /** + * Returns `true` if the given point, when projected onto the plane of the + * triangle, lies within the triangle. + * + * @param {Vector3} point - The point in 3D space to test. + * @return {boolean} Whether the given point, when projected onto the plane of the + * triangle, lies within the triangle or not. + */ + containsPoint( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + } + + /** + * Returns `true` if the triangle is oriented towards the given direction. + * + * @param {Vector3} direction - The (normalized) direction vector. + * @return {boolean} Whether the triangle is oriented towards the given direction or not. + */ + isFrontFacing( direction ) { + + return Triangle.isFrontFacing( this.a, this.b, this.c, direction ); + + } + + /** + * Returns `true` if this triangle intersects with the given box. + * + * @param {Box3} box - The box to intersect. + * @return {boolean} Whether this triangle intersects with the given box or not. + */ + intersectsBox( box ) { + + return box.intersectsTriangle( this ); + + } + + /** + * Returns the closest point on the triangle to the given point. + * + * @param {Vector3} p - The point to compute the closest point for. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The closest point on the triangle. + */ + closestPointToPoint( p, target ) { + + const a = this.a, b = this.b, c = this.c; + let v, w; + + // algorithm thanks to Real-Time Collision Detection by Christer Ericson, + // published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc., + // under the accompanying license; see chapter 5.1.5 for detailed explanation. + // basically, we're distinguishing which of the voronoi regions of the triangle + // the point lies in with the minimum amount of redundant computation. + + _vab.subVectors( b, a ); + _vac.subVectors( c, a ); + _vap.subVectors( p, a ); + const d1 = _vab.dot( _vap ); + const d2 = _vac.dot( _vap ); + if ( d1 <= 0 && d2 <= 0 ) { + + // vertex region of A; barycentric coords (1, 0, 0) + return target.copy( a ); + + } + + _vbp.subVectors( p, b ); + const d3 = _vab.dot( _vbp ); + const d4 = _vac.dot( _vbp ); + if ( d3 >= 0 && d4 <= d3 ) { + + // vertex region of B; barycentric coords (0, 1, 0) + return target.copy( b ); + + } + + const vc = d1 * d4 - d3 * d2; + if ( vc <= 0 && d1 >= 0 && d3 <= 0 ) { + + v = d1 / ( d1 - d3 ); + // edge region of AB; barycentric coords (1-v, v, 0) + return target.copy( a ).addScaledVector( _vab, v ); + + } + + _vcp.subVectors( p, c ); + const d5 = _vab.dot( _vcp ); + const d6 = _vac.dot( _vcp ); + if ( d6 >= 0 && d5 <= d6 ) { + + // vertex region of C; barycentric coords (0, 0, 1) + return target.copy( c ); + + } + + const vb = d5 * d2 - d1 * d6; + if ( vb <= 0 && d2 >= 0 && d6 <= 0 ) { + + w = d2 / ( d2 - d6 ); + // edge region of AC; barycentric coords (1-w, 0, w) + return target.copy( a ).addScaledVector( _vac, w ); + + } + + const va = d3 * d6 - d5 * d4; + if ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) { + + _vbc.subVectors( c, b ); + w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) ); + // edge region of BC; barycentric coords (0, 1-w, w) + return target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC + + } + + // face region + const denom = 1 / ( va + vb + vc ); + // u = va * denom + v = vb * denom; + w = vc * denom; + + return target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w ); + + } + + /** + * Returns `true` if this triangle is equal with the given one. + * + * @param {Triangle} triangle - The triangle to test for equality. + * @return {boolean} Whether this triangle is equal with the given one. + */ + equals( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + +} + +const _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + +const _hslA = { h: 0, s: 0, l: 0 }; +const _hslB = { h: 0, s: 0, l: 0 }; + +function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + +} + +/** + * A Color instance is represented by RGB components in the linear working + * color space, which defaults to `LinearSRGBColorSpace`. Inputs + * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS + * strings) are converted to the working color space automatically. + * + * ```js + * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace + * const color = new THREE.Color().setHex( 0x112233 ); + * ``` + * Source color spaces may be specified explicitly, to ensure correct conversions. + * ```js + * // assumed already LinearSRGBColorSpace; no conversion + * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 ); + * + * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace + * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace ); + * ``` + * If THREE.ColorManagement is disabled, no conversions occur. For details, + * see Color management. Iterating through a Color instance will yield + * its components (r, g, b) in the corresponding order. A Color can be initialised + * in any of the following ways: + * ```js + * //empty constructor - will default white + * const color1 = new THREE.Color(); + * + * //Hexadecimal color (recommended) + * const color2 = new THREE.Color( 0xff0000 ); + * + * //RGB string + * const color3 = new THREE.Color("rgb(255, 0, 0)"); + * const color4 = new THREE.Color("rgb(100%, 0%, 0%)"); + * + * //X11 color name - all 140 color names are supported. + * //Note the lack of CamelCase in the name + * const color5 = new THREE.Color( 'skyblue' ); + * //HSL string + * const color6 = new THREE.Color("hsl(0, 100%, 50%)"); + * + * //Separate RGB values between 0 and 1 + * const color7 = new THREE.Color( 1, 0, 0 ); + * ``` + */ +class Color { + + /** + * Constructs a new color. + * + * Note that standard method of specifying color in three.js is with a hexadecimal triplet, + * and that method is used throughout the rest of the documentation. + * + * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are + * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance. + * @param {number} [g] - The green component. + * @param {number} [b] - The blue component. + */ + constructor( r, g, b ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isColor = true; + + /** + * The red component. + * + * @type {number} + * @default 1 + */ + this.r = 1; + + /** + * The green component. + * + * @type {number} + * @default 1 + */ + this.g = 1; + + /** + * The blue component. + * + * @type {number} + * @default 1 + */ + this.b = 1; + + return this.set( r, g, b ); + + } + + /** + * Sets the colors's components from the given values. + * + * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are + * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance. + * @param {number} [g] - The green component. + * @param {number} [b] - The blue component. + * @return {Color} A reference to this color. + */ + set( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + + const value = r; + + if ( value && value.isColor ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + } else { + + this.setRGB( r, g, b ); + + } + + return this; + + } + + /** + * Sets the colors's components to the given scalar value. + * + * @param {number} scalar - The scalar value. + * @return {Color} A reference to this color. + */ + setScalar( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + } + + /** + * Sets this color from a hexadecimal value. + * + * @param {number} hex - The hexadecimal value. + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setHex( hex, colorSpace = SRGBColorSpace ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + ColorManagement.toWorkingColorSpace( this, colorSpace ); + + return this; + + } + + /** + * Sets this color from RGB values. + * + * @param {number} r - Red channel value between `0.0` and `1.0`. + * @param {number} g - Green channel value between `0.0` and `1.0`. + * @param {number} b - Blue channel value between `0.0` and `1.0`. + * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) { + + this.r = r; + this.g = g; + this.b = b; + + ColorManagement.toWorkingColorSpace( this, colorSpace ); + + return this; + + } + + /** + * Sets this color from RGB values. + * + * @param {number} h - Hue value between `0.0` and `1.0`. + * @param {number} s - Saturation value between `0.0` and `1.0`. + * @param {number} l - Lightness value between `0.0` and `1.0`. + * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = euclideanModulo( h, 1 ); + s = clamp$1( s, 0, 1 ); + l = clamp$1( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + const p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + const q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + ColorManagement.toWorkingColorSpace( this, colorSpace ); + + return this; + + } + + /** + * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`, + * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or + * any [X11 color name]{@link https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart} - + * all 140 color names are supported). + * + * @param {string} style - Color as a CSS-style string. + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setStyle( style, colorSpace = SRGBColorSpace ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + let m; + + if ( m = /^(\w+)\(([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + let color; + const name = m[ 1 ]; + const components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + + handleAlpha( color[ 4 ] ); + + return this.setRGB( + Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255, + Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255, + Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255, + colorSpace + ); + + } + + if ( color = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + + handleAlpha( color[ 4 ] ); + + return this.setRGB( + Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100, + Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100, + Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100, + colorSpace + ); + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + + handleAlpha( color[ 4 ] ); + + return this.setHSL( + parseFloat( color[ 1 ] ) / 360, + parseFloat( color[ 2 ] ) / 100, + parseFloat( color[ 3 ] ) / 100, + colorSpace + ); + + } + + break; + + default: + + console.warn( 'THREE.Color: Unknown color model ' + style ); + + } + + } else if ( m = /^\#([A-Fa-f\d]+)$/.exec( style ) ) { + + // hex color + + const hex = m[ 1 ]; + const size = hex.length; + + if ( size === 3 ) { + + // #ff0 + return this.setRGB( + parseInt( hex.charAt( 0 ), 16 ) / 15, + parseInt( hex.charAt( 1 ), 16 ) / 15, + parseInt( hex.charAt( 2 ), 16 ) / 15, + colorSpace + ); + + } else if ( size === 6 ) { + + // #ff0000 + return this.setHex( parseInt( hex, 16 ), colorSpace ); + + } else { + + console.warn( 'THREE.Color: Invalid hex color ' + style ); + + } + + } else if ( style && style.length > 0 ) { + + return this.setColorName( style, colorSpace ); + + } + + return this; + + } + + /** + * Sets this color from a color name. Faster than {@link Color#setStyle} if + * you don't need the other CSS-style formats. + * + * For convenience, the list of names is exposed in `Color.NAMES` as a hash. + * ```js + * Color.NAMES.aliceblue // returns 0xF0F8FF + * ``` + * + * @param {string} style - The color name. + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setColorName( style, colorSpace = SRGBColorSpace ) { + + // color keywords + const hex = _colorKeywords[ style.toLowerCase() ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex, colorSpace ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + return this; + + } + + /** + * Returns a new color with copied values from this instance. + * + * @return {Color} A clone of this instance. + */ + clone() { + + return new this.constructor( this.r, this.g, this.b ); + + } + + /** + * Copies the values of the given color to this instance. + * + * @param {Color} color - The color to copy. + * @return {Color} A reference to this color. + */ + copy( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + } + + /** + * Copies the given color into this color, and then converts this color from + * `SRGBColorSpace` to `LinearSRGBColorSpace`. + * + * @param {Color} color - The color to copy/convert. + * @return {Color} A reference to this color. + */ + copySRGBToLinear( color ) { + + this.r = SRGBToLinear( color.r ); + this.g = SRGBToLinear( color.g ); + this.b = SRGBToLinear( color.b ); + + return this; + + } + + /** + * Copies the given color into this color, and then converts this color from + * `LinearSRGBColorSpace` to `SRGBColorSpace`. + * + * @param {Color} color - The color to copy/convert. + * @return {Color} A reference to this color. + */ + copyLinearToSRGB( color ) { + + this.r = LinearToSRGB( color.r ); + this.g = LinearToSRGB( color.g ); + this.b = LinearToSRGB( color.b ); + + return this; + + } + + /** + * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`. + * + * @return {Color} A reference to this color. + */ + convertSRGBToLinear() { + + this.copySRGBToLinear( this ); + + return this; + + } + + /** + * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`. + * + * @return {Color} A reference to this color. + */ + convertLinearToSRGB() { + + this.copyLinearToSRGB( this ); + + return this; + + } + + /** + * Returns the hexadecimal value of this color. + * + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {number} The hexadecimal value. + */ + getHex( colorSpace = SRGBColorSpace ) { + + ColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace ); + + return Math.round( clamp$1( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp$1( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp$1( _color.b * 255, 0, 255 ) ); + + } + + /** + * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF'). + * + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {string} The hexadecimal value as a string. + */ + getHexString( colorSpace = SRGBColorSpace ) { + + return ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 ); + + } + + /** + * Converts the colors RGB values into the HSL format and stores them into the + * given target object. + * + * @param {{h:0,s:0,l:0}} target - The target object that is used to store the method's result. + * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space. + * @return {{h:number,s:number,l:number}} The HSL representation of this color. + */ + getHSL( target, colorSpace = ColorManagement.workingColorSpace ) { + + // h,s,l ranges are in 0.0 - 1.0 + + ColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace ); + + const r = _color.r, g = _color.g, b = _color.b; + + const max = Math.max( r, g, b ); + const min = Math.min( r, g, b ); + + let hue, saturation; + const lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + const delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + target.h = hue; + target.s = saturation; + target.l = lightness; + + return target; + + } + + /** + * Returns the RGB values of this color and stores them into the given target object. + * + * @param {Color} target - The target color that is used to store the method's result. + * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space. + * @return {Color} The RGB representation of this color. + */ + getRGB( target, colorSpace = ColorManagement.workingColorSpace ) { + + ColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace ); + + target.r = _color.r; + target.g = _color.g; + target.b = _color.b; + + return target; + + } + + /** + * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`. + * + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {string} The CSS representation of this color. + */ + getStyle( colorSpace = SRGBColorSpace ) { + + ColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace ); + + const r = _color.r, g = _color.g, b = _color.b; + + if ( colorSpace !== SRGBColorSpace ) { + + // Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/). + return `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`; + + } + + return `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`; + + } + + /** + * Adds the given HSL values to this color's values. + * Internally, this converts the color's RGB values to HSL, adds HSL + * and then converts the color back to RGB. + * + * @param {number} h - Hue value between `0.0` and `1.0`. + * @param {number} s - Saturation value between `0.0` and `1.0`. + * @param {number} l - Lightness value between `0.0` and `1.0`. + * @return {Color} A reference to this color. + */ + offsetHSL( h, s, l ) { + + this.getHSL( _hslA ); + + return this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l ); + + } + + /** + * Adds the RGB values of the given color to the RGB values of this color. + * + * @param {Color} color - The color to add. + * @return {Color} A reference to this color. + */ + add( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + } + + /** + * Adds the RGB values of the given colors and stores the result in this instance. + * + * @param {Color} color1 - The first color. + * @param {Color} color2 - The second color. + * @return {Color} A reference to this color. + */ + addColors( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + } + + /** + * Adds the given scalar value to the RGB values of this color. + * + * @param {number} s - The scalar to add. + * @return {Color} A reference to this color. + */ + addScalar( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + } + + /** + * Subtracts the RGB values of the given color from the RGB values of this color. + * + * @param {Color} color - The color to subtract. + * @return {Color} A reference to this color. + */ + sub( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + } + + /** + * Multiplies the RGB values of the given color with the RGB values of this color. + * + * @param {Color} color - The color to multiply. + * @return {Color} A reference to this color. + */ + multiply( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + } + + /** + * Multiplies the given scalar value with the RGB values of this color. + * + * @param {number} s - The scalar to multiply. + * @return {Color} A reference to this color. + */ + multiplyScalar( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + } + + /** + * Linearly interpolates this color's RGB values toward the RGB values of the + * given color. The alpha argument can be thought of as the ratio between + * the two colors, where `0.0` is this color and `1.0` is the first argument. + * + * @param {Color} color - The color to converge on. + * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`. + * @return {Color} A reference to this color. + */ + lerp( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + } + + /** + * Linearly interpolates between the given colors and stores the result in this instance. + * The alpha argument can be thought of as the ratio between the two colors, where `0.0` + * is the first and `1.0` is the second color. + * + * @param {Color} color1 - The first color. + * @param {Color} color2 - The second color. + * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`. + * @return {Color} A reference to this color. + */ + lerpColors( color1, color2, alpha ) { + + this.r = color1.r + ( color2.r - color1.r ) * alpha; + this.g = color1.g + ( color2.g - color1.g ) * alpha; + this.b = color1.b + ( color2.b - color1.b ) * alpha; + + return this; + + } + + /** + * Linearly interpolates this color's HSL values toward the HSL values of the + * given color. It differs from {@link Color#lerp} by not interpolating straight + * from one color to the other, but instead going through all the hues in between + * those two colors. The alpha argument can be thought of as the ratio between + * the two colors, where 0.0 is this color and 1.0 is the first argument. + * + * @param {Color} color - The color to converge on. + * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`. + * @return {Color} A reference to this color. + */ + lerpHSL( color, alpha ) { + + this.getHSL( _hslA ); + color.getHSL( _hslB ); + + const h = lerp$1( _hslA.h, _hslB.h, alpha ); + const s = lerp$1( _hslA.s, _hslB.s, alpha ); + const l = lerp$1( _hslA.l, _hslB.l, alpha ); + + this.setHSL( h, s, l ); + + return this; + + } + + /** + * Sets the color's RGB components from the given 3D vector. + * + * @param {Vector3} v - The vector to set. + * @return {Color} A reference to this color. + */ + setFromVector3( v ) { + + this.r = v.x; + this.g = v.y; + this.b = v.z; + + return this; + + } + + /** + * Transforms this color with the given 3x3 matrix. + * + * @param {Matrix3} m - The matrix. + * @return {Color} A reference to this color. + */ + applyMatrix3( m ) { + + const r = this.r, g = this.g, b = this.b; + const e = m.elements; + + this.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b; + this.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b; + this.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b; + + return this; + + } + + /** + * Returns `true` if this color is equal with the given one. + * + * @param {Color} c - The color to test for equality. + * @return {boolean} Whether this bounding color is equal with the given one. + */ + equals( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + } + + /** + * Sets this color's RGB components from the given array. + * + * @param {Array} array - An array holding the RGB values. + * @param {number} [offset=0] - The offset into the array. + * @return {Color} A reference to this color. + */ + fromArray( array, offset = 0 ) { + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + } + + /** + * Writes the RGB components of this color to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the color components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The color components. + */ + toArray( array = [], offset = 0 ) { + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + } + + /** + * Sets the components of this color from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding color data. + * @param {number} index - The index into the attribute. + * @return {Color} A reference to this color. + */ + fromBufferAttribute( attribute, index ) { + + this.r = attribute.getX( index ); + this.g = attribute.getY( index ); + this.b = attribute.getZ( index ); + + return this; + + } + + /** + * This methods defines the serialization result of this class. Returns the color + * as a hexadecimal value. + * + * @return {number} The hexadecimal value. + */ + toJSON() { + + return this.getHex(); + + } + + *[ Symbol.iterator ]() { + + yield this.r; + yield this.g; + yield this.b; + + } + +} + +const _color = /*@__PURE__*/ new Color(); + +/** + * A dictionary with X11 color names. + * + * Note that multiple words such as Dark Orange become the string 'darkorange'. + * + * @static + * @type {Object} + */ +Color.NAMES = _colorKeywords; + +let _materialId = 0; + +/** + * Abstract base class for materials. + * + * Materials define the appearance of renderable 3D objects. + * + * @abstract + * @augments EventDispatcher + */ +let Material$1 = class Material extends EventDispatcher { + + /** + * Constructs a new material. + */ + constructor() { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isMaterial = true; + + /** + * The ID of the material. + * + * @name Material#id + * @type {number} + * @readonly + */ + Object.defineProperty( this, 'id', { value: _materialId ++ } ); + + /** + * The UUID of the material. + * + * @type {string} + * @readonly + */ + this.uuid = generateUUID(); + + /** + * The name of the material. + * + * @type {string} + */ + this.name = ''; + + /** + * The type property is used for detecting the object type + * in context of serialization/deserialization. + * + * @type {string} + * @readonly + */ + this.type = 'Material'; + + /** + * Defines the blending type of the material. + * + * It must be set to `CustomBlending` if custom blending properties like + * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation} + * should have any effect. + * + * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)} + * @default NormalBlending + */ + this.blending = NormalBlending; + + /** + * Defines which side of faces will be rendered - front, back or both. + * + * @type {(FrontSide|BackSide|DoubleSide)} + * @default FrontSide + */ + this.side = FrontSide; + + /** + * If set to `true`, vertex colors should be used. + * + * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or + * four (RGBA) component color buffer attribute is used. + * + * @type {boolean} + * @default false + */ + this.vertexColors = false; + + /** + * Defines how transparent the material is. + * A value of `0.0` indicates fully transparent, `1.0` is fully opaque. + * + * If the {@link Material#transparent} is not set to `true`, + * the material will remain fully opaque and this value will only affect its color. + * + * @type {number} + * @default 1 + */ + this.opacity = 1; + + /** + * Defines whether this material is transparent. This has an effect on + * rendering as transparent objects need special treatment and are rendered + * after non-transparent objects. + * + * When set to true, the extent to which the material is transparent is + * controlled by {@link Material#opacity}. + * + * @type {boolean} + * @default false + */ + this.transparent = false; + + /** + * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or + * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than + * a random threshold. Randomization introduces some grain or noise, but approximates alpha + * blending without the associated problems of sorting. Using TAA can reduce the resulting noise. + * + * @type {boolean} + * @default false + */ + this.alphaHash = false; + + /** + * Defines the blending source factor. + * + * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)} + * @default SrcAlphaFactor + */ + this.blendSrc = SrcAlphaFactor; + + /** + * Defines the blending destination factor. + * + * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)} + * @default OneMinusSrcAlphaFactor + */ + this.blendDst = OneMinusSrcAlphaFactor; + + /** + * Defines the blending equation. + * + * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)} + * @default OneMinusSrcAlphaFactor + */ + this.blendEquation = AddEquation; + + /** + * Defines the blending source alpha factor. + * + * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)} + * @default null + */ + this.blendSrcAlpha = null; + + /** + * Defines the blending destination alpha factor. + * + * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)} + * @default null + */ + this.blendDstAlpha = null; + + /** + * Defines the blending equation of the alpha channel. + * + * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)} + * @default OneMinusSrcAlphaFactor + */ + this.blendEquationAlpha = null; + + /** + * Represents the RGB values of the constant blend color. + * + * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`. + * + * @type {Color} + * @default (0,0,0) + */ + this.blendColor = new Color( 0, 0, 0 ); + + /** + * Represents the alpha value of the constant blend color. + * + * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`. + * + * @type {number} + * @default 0 + */ + this.blendAlpha = 0; + + /** + * Defines the depth function. + * + * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)} + * @default LessEqualDepth + */ + this.depthFunc = LessEqualDepth; + + /** + * Whether to have depth test enabled when rendering this material. + * When the depth test is disabled, the depth write will also be implicitly disabled. + * + * @type {boolean} + * @default true + */ + this.depthTest = true; + + /** + * Whether rendering this material has any effect on the depth buffer. + * + * When drawing 2D overlays it can be useful to disable the depth writing in + * order to layer several things together without creating z-index artifacts. + * + * @type {boolean} + * @default true + */ + this.depthWrite = true; + + /** + * The bit mask to use when writing to the stencil buffer. + * + * @type {number} + * @default 0xff + */ + this.stencilWriteMask = 0xff; + + /** + * The stencil comparison function to use. + * + * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc} + * @default AlwaysStencilFunc + */ + this.stencilFunc = AlwaysStencilFunc; + + /** + * The value to use when performing stencil comparisons or stencil operations. + * + * @type {number} + * @default 0 + */ + this.stencilRef = 0; + + /** + * The bit mask to use when comparing against the stencil buffer. + * + * @type {number} + * @default 0xff + */ + this.stencilFuncMask = 0xff; + + /** + * Which stencil operation to perform when the comparison function returns `false`. + * + * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp} + * @default KeepStencilOp + */ + this.stencilFail = KeepStencilOp; + + /** + * Which stencil operation to perform when the comparison function returns + * `true` but the depth test fails. + * + * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp} + * @default KeepStencilOp + */ + this.stencilZFail = KeepStencilOp; + + /** + * Which stencil operation to perform when the comparison function returns + * `true` and the depth test passes. + * + * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp} + * @default KeepStencilOp + */ + this.stencilZPass = KeepStencilOp; + + /** + * Whether stencil operations are performed against the stencil buffer. In + * order to perform writes or comparisons against the stencil buffer this + * value must be `true`. + * + * @type {boolean} + * @default false + */ + this.stencilWrite = false; + + /** + * User-defined clipping planes specified as THREE.Plane objects in world + * space. These planes apply to the objects this material is attached to. + * Points in space whose signed distance to the plane is negative are clipped + * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to + * be `true`. + * + * @type {?Array} + * @default null + */ + this.clippingPlanes = null; + + /** + * Changes the behavior of clipping planes so that only their intersection is + * clipped, rather than their union. + * + * @type {boolean} + * @default false + */ + this.clipIntersection = false; + + /** + * Defines whether to clip shadows according to the clipping planes specified + * on this material. + * + * @type {boolean} + * @default false + */ + this.clipShadows = false; + + /** + * Defines which side of faces cast shadows. If `null`, the side casting shadows + * is determined as follows: + * + * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows. + * - When {@link Material#side} is set to `BackSide`, the front side cast shadows. + * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows. + * + * @type {?(FrontSide|BackSide|DoubleSide)} + * @default null + */ + this.shadowSide = null; + + /** + * Whether to render the material's color. + * + * This can be used in conjunction with {@link Object3D#renderOder} to create invisible + * objects that occlude other objects. + * + * @type {boolean} + * @default true + */ + this.colorWrite = true; + + /** + * Override the renderer's default precision for this material. + * + * @type {?('highp'|'mediump'|'lowp')} + * @default null + */ + this.precision = null; + + /** + * Whether to use polygon offset or not. When enabled, each fragment's depth value will + * be offset after it is interpolated from the depth values of the appropriate vertices. + * The offset is added before the depth test is performed and before the value is written + * into the depth buffer. + * + * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for + * rendering solids with highlighted edges. + * + * @type {boolean} + * @default false + */ + this.polygonOffset = false; + + /** + * Specifies a scale factor that is used to create a variable depth offset for each polygon. + * + * @type {number} + * @default 0 + */ + this.polygonOffsetFactor = 0; + + /** + * Is multiplied by an implementation-specific value to create a constant depth offset. + * + * @type {number} + * @default 0 + */ + this.polygonOffsetUnits = 0; + + /** + * Whether to apply dithering to the color to remove the appearance of banding. + * + * @type {boolean} + * @default false + */ + this.dithering = false; + + /** + * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts + * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this + * will smooth aliasing on clip plane edges and alphaTest-clipped edges. + * + * @type {boolean} + * @default false + */ + this.alphaToCoverage = false; + + /** + * Whether to premultiply the alpha (transparency) value. + * + * @type {boolean} + * @default false + */ + this.premultipliedAlpha = false; + + /** + * Whether double-sided, transparent objects should be rendered with a single pass or not. + * + * The engine renders double-sided, transparent objects with two draw calls (back faces first, + * then front faces) to mitigate transparency artifacts. There are scenarios however where this + * approach produces no quality gains but still doubles draw calls e.g. when rendering flat + * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to + * disable the two pass rendering to avoid performance issues. + * + * @type {boolean} + * @default false + */ + this.forceSinglePass = false; + + /** + * Defines whether 3D objects using this material are visible. + * + * @type {boolean} + * @default true + */ + this.visible = true; + + /** + * Defines whether this material is tone mapped according to the renderer's tone mapping setting. + * + * It is ignored when rendering to a render target or using post processing or when using + * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping. + * + * @type {boolean} + * @default true + */ + this.toneMapped = true; + + /** + * An object that can be used to store custom data about the Material. It + * should not hold references to functions as these will not be cloned. + * + * @type {Object} + */ + this.userData = {}; + + /** + * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`. + * + * @type {number} + * @readonly + * @default 0 + */ + this.version = 0; + + this._alphaTest = 0; + + } + + /** + * Sets the alpha value to be used when running an alpha test. The material + * will not be rendered if the opacity is lower than this value. + * + * @type {number} + * @readonly + * @default 0 + */ + get alphaTest() { + + return this._alphaTest; + + } + + set alphaTest( value ) { + + if ( this._alphaTest > 0 !== value > 0 ) { + + this.version ++; + + } + + this._alphaTest = value; + + } + + /** + * An optional callback that is executed immediately before the material is used to render a 3D object. + * + * This method can only be used when rendering with {@link WebGLRenderer}. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Scene} scene - The scene. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Object3D} object - The 3D object. + * @param {Object} group - The geometry group data. + */ + onBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {} + + /** + * An optional callback that is executed immediately before the shader + * program is compiled. This function is called with the shader source code + * as a parameter. Useful for the modification of built-in materials. + * + * This method can only be used when rendering with {@link WebGLRenderer}. The + * recommended approach when customizing materials is to use `WebGPURenderer` with the new + * Node Material system and [TSL]{@link https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language}. + * + * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source. + * @param {WebGLRenderer} renderer - A reference to the renderer. + */ + onBeforeCompile( /* shaderobject, renderer */ ) {} + + /** + * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify + * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached + * shader or recompile the shader for this material as needed. + * + * This method can only be used when rendering with {@link WebGLRenderer}. + * + * @return {string} The custom program cache key. + */ + customProgramCacheKey() { + + return this.onBeforeCompile.toString(); + + } + + setValues( values ) { + + if ( values === undefined ) return; + + for ( const key in values ) { + + const newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( `THREE.Material: parameter '${ key }' has value of undefined.` ); + continue; + + } + + const currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( `THREE.Material: '${ key }' is not a property of THREE.${ this.type }.` ); + continue; + + } + + if ( currentValue && currentValue.isColor ) { + + currentValue.set( newValue ); + + } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { + + currentValue.copy( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + } + + /** + * Serializes the material into JSON. + * + * @param {?(Object|string)} meta - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized material. + * @see {@link ObjectLoader#parse} + */ + toJSON( meta ) { + + const isRootObject = ( meta === undefined || typeof meta === 'string' ); + + if ( isRootObject ) { + + meta = { + textures: {}, + images: {} + }; + + } + + const data = { + metadata: { + version: 4.6, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( this.color && this.color.isColor ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( this.sheen !== undefined ) data.sheen = this.sheen; + if ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex(); + if ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness; + if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); + if ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity; + + if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); + if ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity; + if ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + if ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat; + if ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness; + + if ( this.clearcoatMap && this.clearcoatMap.isTexture ) { + + data.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid; + + } + + if ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) { + + data.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid; + + } + + if ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) { + + data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid; + data.clearcoatNormalScale = this.clearcoatNormalScale.toArray(); + + } + + if ( this.dispersion !== undefined ) data.dispersion = this.dispersion; + + if ( this.iridescence !== undefined ) data.iridescence = this.iridescence; + if ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR; + if ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange; + + if ( this.iridescenceMap && this.iridescenceMap.isTexture ) { + + data.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid; + + } + + if ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) { + + data.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid; + + } + + if ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy; + if ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation; + + if ( this.anisotropyMap && this.anisotropyMap.isTexture ) { + + data.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid; + + } + + if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid; + if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + + if ( this.lightMap && this.lightMap.isTexture ) { + + data.lightMap = this.lightMap.toJSON( meta ).uuid; + data.lightMapIntensity = this.lightMapIntensity; + + } + + if ( this.aoMap && this.aoMap.isTexture ) { + + data.aoMap = this.aoMap.toJSON( meta ).uuid; + data.aoMapIntensity = this.aoMapIntensity; + + } + + if ( this.bumpMap && this.bumpMap.isTexture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + + if ( this.normalMap && this.normalMap.isTexture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); + + } + + if ( this.displacementMap && this.displacementMap.isTexture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + + if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + if ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid; + if ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid; + + if ( this.envMap && this.envMap.isTexture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + + if ( this.combine !== undefined ) data.combine = this.combine; + + } + + if ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray(); + if ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity; + if ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity; + if ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio; + + if ( this.gradientMap && this.gradientMap.isTexture ) { + + data.gradientMap = this.gradientMap.toJSON( meta ).uuid; + + } + + if ( this.transmission !== undefined ) data.transmission = this.transmission; + if ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid; + if ( this.thickness !== undefined ) data.thickness = this.thickness; + if ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid; + if ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance; + if ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex(); + + if ( this.size !== undefined ) data.size = this.size; + if ( this.shadowSide !== null ) data.shadowSide = this.shadowSide; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors === true ) data.vertexColors = true; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = true; + + if ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc; + if ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst; + if ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation; + if ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha; + if ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha; + if ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha; + if ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex(); + if ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha; + + if ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc; + if ( this.depthTest === false ) data.depthTest = this.depthTest; + if ( this.depthWrite === false ) data.depthWrite = this.depthWrite; + if ( this.colorWrite === false ) data.colorWrite = this.colorWrite; + + if ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask; + if ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc; + if ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef; + if ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask; + if ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail; + if ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail; + if ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass; + if ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite; + + // rotation (SpriteMaterial) + if ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation; + + if ( this.polygonOffset === true ) data.polygonOffset = true; + if ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor; + if ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits; + + if ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth; + if ( this.dashSize !== undefined ) data.dashSize = this.dashSize; + if ( this.gapSize !== undefined ) data.gapSize = this.gapSize; + if ( this.scale !== undefined ) data.scale = this.scale; + + if ( this.dithering === true ) data.dithering = true; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.alphaHash === true ) data.alphaHash = true; + if ( this.alphaToCoverage === true ) data.alphaToCoverage = true; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true; + if ( this.forceSinglePass === true ) data.forceSinglePass = true; + + if ( this.wireframe === true ) data.wireframe = true; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + if ( this.flatShading === true ) data.flatShading = true; + + if ( this.visible === false ) data.visible = false; + + if ( this.toneMapped === false ) data.toneMapped = false; + + if ( this.fog === false ) data.fog = false; + + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + const values = []; + + for ( const key in cache ) { + + const data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRootObject ) { + + const textures = extractFromCache( meta.textures ); + const images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + } + + /** + * Returns a new material with copied values from this instance. + * + * @return {Material} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + + /** + * Copies the values of the given material to this instance. + * + * @param {Material} source - The material to copy. + * @return {Material} A reference to this instance. + */ + copy( source ) { + + this.name = source.name; + + this.blending = source.blending; + this.side = source.side; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + this.blendColor.copy( source.blendColor ); + this.blendAlpha = source.blendAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.stencilWriteMask = source.stencilWriteMask; + this.stencilFunc = source.stencilFunc; + this.stencilRef = source.stencilRef; + this.stencilFuncMask = source.stencilFuncMask; + this.stencilFail = source.stencilFail; + this.stencilZFail = source.stencilZFail; + this.stencilZPass = source.stencilZPass; + this.stencilWrite = source.stencilWrite; + + const srcPlanes = source.clippingPlanes; + let dstPlanes = null; + + if ( srcPlanes !== null ) { + + const n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( let i = 0; i !== n; ++ i ) { + + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + } + + this.clippingPlanes = dstPlanes; + this.clipIntersection = source.clipIntersection; + this.clipShadows = source.clipShadows; + + this.shadowSide = source.shadowSide; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.dithering = source.dithering; + + this.alphaTest = source.alphaTest; + this.alphaHash = source.alphaHash; + this.alphaToCoverage = source.alphaToCoverage; + this.premultipliedAlpha = source.premultipliedAlpha; + this.forceSinglePass = source.forceSinglePass; + + this.visible = source.visible; + + this.toneMapped = source.toneMapped; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + return this; + + } + + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + * + * @fires Material#dispose + */ + dispose() { + + /** + * Fires when the material has been disposed of. + * + * @event Material#dispose + * @type {Object} + */ + this.dispatchEvent( { type: 'dispose' } ); + + } + + /** + * Setting this property to `true` indicates the engine the material + * needs to be recompiled. + * + * @type {boolean} + * @default false + * @param {boolean} value + */ + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + onBuild( /* shaderobject, renderer */ ) { + + console.warn( 'Material: onBuild() has been removed.' ); // @deprecated, r166 + + } + +}; + +class MeshBasicMaterial extends Material$1 { + + constructor( parameters ) { + + super(); + + this.isMeshBasicMaterial = true; + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapRotation = new Euler(); + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapRotation.copy( source.envMapRotation ); + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.fog = source.fog; + + return this; + + } + +} + +// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + +const _tables = /*@__PURE__*/ _generateTables(); + +function _generateTables() { + + // float32 to float16 helpers + + const buffer = new ArrayBuffer( 4 ); + const floatView = new Float32Array( buffer ); + const uint32View = new Uint32Array( buffer ); + + const baseTable = new Uint32Array( 512 ); + const shiftTable = new Uint32Array( 512 ); + + for ( let i = 0; i < 256; ++ i ) { + + const e = i - 127; + + // very small number (0, -0) + + if ( e < -27 ) { + + baseTable[ i ] = 0x0000; + baseTable[ i | 0x100 ] = 0x8000; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // small number (denorm) + + } else if ( e < -14 ) { + + baseTable[ i ] = 0x0400 >> ( - e - 14 ); + baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000; + shiftTable[ i ] = - e - 1; + shiftTable[ i | 0x100 ] = - e - 1; + + // normal number + + } else if ( e <= 15 ) { + + baseTable[ i ] = ( e + 15 ) << 10; + baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + // large number (Infinity, -Infinity) + + } else if ( e < 128 ) { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 24; + shiftTable[ i | 0x100 ] = 24; + + // stay (NaN, Infinity, -Infinity) + + } else { + + baseTable[ i ] = 0x7c00; + baseTable[ i | 0x100 ] = 0xfc00; + shiftTable[ i ] = 13; + shiftTable[ i | 0x100 ] = 13; + + } + + } + + // float16 to float32 helpers + + const mantissaTable = new Uint32Array( 2048 ); + const exponentTable = new Uint32Array( 64 ); + const offsetTable = new Uint32Array( 64 ); + + for ( let i = 1; i < 1024; ++ i ) { + + let m = i << 13; // zero pad mantissa bits + let e = 0; // zero exponent + + // normalized + while ( ( m & 0x00800000 ) === 0 ) { + + m <<= 1; + e -= 0x00800000; // decrement exponent + + } + + m &= -8388609; // clear leading 1 bit + e += 0x38800000; // adjust bias + + mantissaTable[ i ] = m | e; + + } + + for ( let i = 1024; i < 2048; ++ i ) { + + mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 ); + + } + + for ( let i = 1; i < 31; ++ i ) { + + exponentTable[ i ] = i << 23; + + } + + exponentTable[ 31 ] = 0x47800000; + exponentTable[ 32 ] = 0x80000000; + + for ( let i = 33; i < 63; ++ i ) { + + exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 ); + + } + + exponentTable[ 63 ] = 0xc7800000; + + for ( let i = 1; i < 64; ++ i ) { + + if ( i !== 32 ) { + + offsetTable[ i ] = 1024; + + } + + } + + return { + floatView: floatView, + uint32View: uint32View, + baseTable: baseTable, + shiftTable: shiftTable, + mantissaTable: mantissaTable, + exponentTable: exponentTable, + offsetTable: offsetTable + }; + +} + +/** + * Returns a half precision floating point value (FP16) from the given single + * precision floating point value (FP32). + * + * @param {number} val - A single precision floating point value. + * @return {number} The FP16 value. + */ +function toHalfFloat( val ) { + + if ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' ); + + val = clamp$1( val, -65504, 65504 ); + + _tables.floatView[ 0 ] = val; + const f = _tables.uint32View[ 0 ]; + const e = ( f >> 23 ) & 0x1ff; + return _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] ); + +} + +/** + * Returns a single precision floating point value (FP32) from the given half + * precision floating point value (FP16). + * + * @param {number} val - A half precision floating point value. + * @return {number} The FP32 value. + */ +function fromHalfFloat( val ) { + + const m = val >> 10; + _tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ]; + return _tables.floatView[ 0 ]; + +} + +/** + * A class containing utility functions for data. + * + * @hideconstructor + */ +class DataUtils { + + /** + * Returns a half precision floating point value (FP16) from the given single + * precision floating point value (FP32). + * + * @param {number} val - A single precision floating point value. + * @return {number} The FP16 value. + */ + static toHalfFloat( val ) { + + return toHalfFloat( val ); + + } + + /** + * Returns a single precision floating point value (FP32) from the given half + * precision floating point value (FP16). + * + * @param {number} val - A half precision floating point value. + * @return {number} The FP32 value. + */ + static fromHalfFloat( val ) { + + return fromHalfFloat( val ); + + } + +} + +const _vector$9 = /*@__PURE__*/ new Vector3(); +const _vector2$1 = /*@__PURE__*/ new Vector2(); + +let _id$2 = 0; + +class BufferAttribute { + + constructor( array, itemSize, normalized = false ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.isBufferAttribute = true; + + Object.defineProperty( this, 'id', { value: _id$2 ++ } ); + + this.name = ''; + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized; + + this.usage = StaticDrawUsage; + this.updateRanges = []; + this.gpuType = FloatType; + + this.version = 0; + + } + + onUploadCallback() {} + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + setUsage( value ) { + + this.usage = value; + + return this; + + } + + addUpdateRange( start, count ) { + + this.updateRanges.push( { start, count } ); + + } + + clearUpdateRanges() { + + this.updateRanges.length = 0; + + } + + copy( source ) { + + this.name = source.name; + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.usage = source.usage; + this.gpuType = source.gpuType; + + return this; + + } + + copyAt( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( let i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + } + + copyArray( array ) { + + this.array.set( array ); + + return this; + + } + + applyMatrix3( m ) { + + if ( this.itemSize === 2 ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector2$1.fromBufferAttribute( this, i ); + _vector2$1.applyMatrix3( m ); + + this.setXY( i, _vector2$1.x, _vector2$1.y ); + + } + + } else if ( this.itemSize === 3 ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.fromBufferAttribute( this, i ); + _vector$9.applyMatrix3( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + } + + return this; + + } + + applyMatrix4( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.fromBufferAttribute( this, i ); + + _vector$9.applyMatrix4( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + return this; + + } + + applyNormalMatrix( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.fromBufferAttribute( this, i ); + + _vector$9.applyNormalMatrix( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + return this; + + } + + transformDirection( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$9.fromBufferAttribute( this, i ); + + _vector$9.transformDirection( m ); + + this.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z ); + + } + + return this; + + } + + set( value, offset = 0 ) { + + // Matching BufferAttribute constructor, do not normalize the array. + this.array.set( value, offset ); + + return this; + + } + + getComponent( index, component ) { + + let value = this.array[ index * this.itemSize + component ]; + + if ( this.normalized ) value = denormalize( value, this.array ); + + return value; + + } + + setComponent( index, component, value ) { + + if ( this.normalized ) value = normalize( value, this.array ); + + this.array[ index * this.itemSize + component ] = value; + + return this; + + } + + getX( index ) { + + let x = this.array[ index * this.itemSize ]; + + if ( this.normalized ) x = denormalize( x, this.array ); + + return x; + + } + + setX( index, x ) { + + if ( this.normalized ) x = normalize( x, this.array ); + + this.array[ index * this.itemSize ] = x; + + return this; + + } + + getY( index ) { + + let y = this.array[ index * this.itemSize + 1 ]; + + if ( this.normalized ) y = denormalize( y, this.array ); + + return y; + + } + + setY( index, y ) { + + if ( this.normalized ) y = normalize( y, this.array ); + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + } + + getZ( index ) { + + let z = this.array[ index * this.itemSize + 2 ]; + + if ( this.normalized ) z = denormalize( z, this.array ); + + return z; + + } + + setZ( index, z ) { + + if ( this.normalized ) z = normalize( z, this.array ); + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + } + + getW( index ) { + + let w = this.array[ index * this.itemSize + 3 ]; + + if ( this.normalized ) w = denormalize( w, this.array ); + + return w; + + } + + setW( index, w ) { + + if ( this.normalized ) w = normalize( w, this.array ); + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + } + + setXY( index, x, y ) { + + index *= this.itemSize; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + + } + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + } + + setXYZ( index, x, y, z ) { + + index *= this.itemSize; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + + } + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + } + + setXYZW( index, x, y, z, w ) { + + index *= this.itemSize; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + w = normalize( w, this.array ); + + } + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + } + + onUpload( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + clone() { + + return new this.constructor( this.array, this.itemSize ).copy( this ); + + } + + toJSON() { + + const data = { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: Array.from( this.array ), + normalized: this.normalized + }; + + if ( this.name !== '' ) data.name = this.name; + if ( this.usage !== StaticDrawUsage ) data.usage = this.usage; + + return data; + + } + +} + +class Uint16BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint16Array( array ), itemSize, normalized ); + + } + +} + +class Uint32BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Uint32Array( array ), itemSize, normalized ); + + } + +} + + +class Float32BufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized ) { + + super( new Float32Array( array ), itemSize, normalized ); + + } + +} + +let _id$1 = 0; + +const _m1$3 = /*@__PURE__*/ new Matrix4(); +const _obj = /*@__PURE__*/ new Object3D(); +const _offset = /*@__PURE__*/ new Vector3(); +const _box$2 = /*@__PURE__*/ new Box3(); +const _boxMorphTargets = /*@__PURE__*/ new Box3(); +const _vector$8 = /*@__PURE__*/ new Vector3(); + +class BufferGeometry extends EventDispatcher { + + constructor() { + + super(); + + this.isBufferGeometry = true; + + Object.defineProperty( this, 'id', { value: _id$1 ++ } ); + + this.uuid = generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.indirect = null; + this.attributes = {}; + + this.morphAttributes = {}; + this.morphTargetsRelative = false; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + this.userData = {}; + + } + + getIndex() { + + return this.index; + + } + + setIndex( index ) { + + if ( Array.isArray( index ) ) { + + this.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 ); + + } else { + + this.index = index; + + } + + return this; + + } + + setIndirect( indirect ) { + + this.indirect = indirect; + + return this; + + } + + getIndirect() { + + return this.indirect; + + } + + getAttribute( name ) { + + return this.attributes[ name ]; + + } + + setAttribute( name, attribute ) { + + this.attributes[ name ] = attribute; + + return this; + + } + + deleteAttribute( name ) { + + delete this.attributes[ name ]; + + return this; + + } + + hasAttribute( name ) { + + return this.attributes[ name ] !== undefined; + + } + + addGroup( start, count, materialIndex = 0 ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex + + } ); + + } + + clearGroups() { + + this.groups = []; + + } + + setDrawRange( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + } + + applyMatrix4( matrix ) { + + const position = this.attributes.position; + + if ( position !== undefined ) { + + position.applyMatrix4( matrix ); + + position.needsUpdate = true; + + } + + const normal = this.attributes.normal; + + if ( normal !== undefined ) { + + const normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normal.applyNormalMatrix( normalMatrix ); + + normal.needsUpdate = true; + + } + + const tangent = this.attributes.tangent; + + if ( tangent !== undefined ) { + + tangent.transformDirection( matrix ); + + tangent.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + } + + applyQuaternion( q ) { + + _m1$3.makeRotationFromQuaternion( q ); + + this.applyMatrix4( _m1$3 ); + + return this; + + } + + rotateX( angle ) { + + // rotate geometry around world x-axis + + _m1$3.makeRotationX( angle ); + + this.applyMatrix4( _m1$3 ); + + return this; + + } + + rotateY( angle ) { + + // rotate geometry around world y-axis + + _m1$3.makeRotationY( angle ); + + this.applyMatrix4( _m1$3 ); + + return this; + + } + + rotateZ( angle ) { + + // rotate geometry around world z-axis + + _m1$3.makeRotationZ( angle ); + + this.applyMatrix4( _m1$3 ); + + return this; + + } + + translate( x, y, z ) { + + // translate geometry + + _m1$3.makeTranslation( x, y, z ); + + this.applyMatrix4( _m1$3 ); + + return this; + + } + + scale( x, y, z ) { + + // scale geometry + + _m1$3.makeScale( x, y, z ); + + this.applyMatrix4( _m1$3 ); + + return this; + + } + + lookAt( vector ) { + + _obj.lookAt( vector ); + + _obj.updateMatrix(); + + this.applyMatrix4( _obj.matrix ); + + return this; + + } + + center() { + + this.computeBoundingBox(); + + this.boundingBox.getCenter( _offset ).negate(); + + this.translate( _offset.x, _offset.y, _offset.z ); + + return this; + + } + + setFromPoints( points ) { + + const positionAttribute = this.getAttribute( 'position' ); + + if ( positionAttribute === undefined ) { + + const position = []; + + for ( let i = 0, l = points.length; i < l; i ++ ) { + + const point = points[ i ]; + position.push( point.x, point.y, point.z || 0 ); + + } + + this.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) ); + + } else { + + const l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size + + for ( let i = 0; i < l; i ++ ) { + + const point = points[ i ]; + positionAttribute.setXYZ( i, point.x, point.y, point.z || 0 ); + + } + + if ( points.length > positionAttribute.count ) { + + console.warn( 'THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' ); + + } + + positionAttribute.needsUpdate = true; + + } + + return this; + + } + + computeBoundingBox() { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + + if ( position && position.isGLBufferAttribute ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this ); + + this.boundingBox.set( + new Vector3( - Infinity, - Infinity, - Infinity ), + new Vector3( + Infinity, + Infinity, + Infinity ) + ); + + return; + + } + + if ( position !== undefined ) { + + this.boundingBox.setFromBufferAttribute( position ); + + // process morph attributes if present + + if ( morphAttributesPosition ) { + + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { + + const morphAttribute = morphAttributesPosition[ i ]; + _box$2.setFromBufferAttribute( morphAttribute ); + + if ( this.morphTargetsRelative ) { + + _vector$8.addVectors( this.boundingBox.min, _box$2.min ); + this.boundingBox.expandByPoint( _vector$8 ); + + _vector$8.addVectors( this.boundingBox.max, _box$2.max ); + this.boundingBox.expandByPoint( _vector$8 ); + + } else { + + this.boundingBox.expandByPoint( _box$2.min ); + this.boundingBox.expandByPoint( _box$2.max ); + + } + + } + + } + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + + if ( position && position.isGLBufferAttribute ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this ); + + this.boundingSphere.set( new Vector3(), Infinity ); + + return; + + } + + if ( position ) { + + // first, find the center of the bounding sphere + + const center = this.boundingSphere.center; + + _box$2.setFromBufferAttribute( position ); + + // process morph attributes if present + + if ( morphAttributesPosition ) { + + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { + + const morphAttribute = morphAttributesPosition[ i ]; + _boxMorphTargets.setFromBufferAttribute( morphAttribute ); + + if ( this.morphTargetsRelative ) { + + _vector$8.addVectors( _box$2.min, _boxMorphTargets.min ); + _box$2.expandByPoint( _vector$8 ); + + _vector$8.addVectors( _box$2.max, _boxMorphTargets.max ); + _box$2.expandByPoint( _vector$8 ); + + } else { + + _box$2.expandByPoint( _boxMorphTargets.min ); + _box$2.expandByPoint( _boxMorphTargets.max ); + + } + + } + + } + + _box$2.getCenter( center ); + + // second, try to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + let maxRadiusSq = 0; + + for ( let i = 0, il = position.count; i < il; i ++ ) { + + _vector$8.fromBufferAttribute( position, i ); + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) ); + + } + + // process morph attributes if present + + if ( morphAttributesPosition ) { + + for ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) { + + const morphAttribute = morphAttributesPosition[ i ]; + const morphTargetsRelative = this.morphTargetsRelative; + + for ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) { + + _vector$8.fromBufferAttribute( morphAttribute, j ); + + if ( morphTargetsRelative ) { + + _offset.fromBufferAttribute( position, j ); + _vector$8.add( _offset ); + + } + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) ); + + } + + } + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + } + + computeTangents() { + + const index = this.index; + const attributes = this.attributes; + + // based on http://www.terathon.com/code/tangent.html + // (per vertex tangents) + + if ( index === null || + attributes.position === undefined || + attributes.normal === undefined || + attributes.uv === undefined ) { + + console.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' ); + return; + + } + + const positionAttribute = attributes.position; + const normalAttribute = attributes.normal; + const uvAttribute = attributes.uv; + + if ( this.hasAttribute( 'tangent' ) === false ) { + + this.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) ); + + } + + const tangentAttribute = this.getAttribute( 'tangent' ); + + const tan1 = [], tan2 = []; + + for ( let i = 0; i < positionAttribute.count; i ++ ) { + + tan1[ i ] = new Vector3(); + tan2[ i ] = new Vector3(); + + } + + const vA = new Vector3(), + vB = new Vector3(), + vC = new Vector3(), + + uvA = new Vector2(), + uvB = new Vector2(), + uvC = new Vector2(), + + sdir = new Vector3(), + tdir = new Vector3(); + + function handleTriangle( a, b, c ) { + + vA.fromBufferAttribute( positionAttribute, a ); + vB.fromBufferAttribute( positionAttribute, b ); + vC.fromBufferAttribute( positionAttribute, c ); + + uvA.fromBufferAttribute( uvAttribute, a ); + uvB.fromBufferAttribute( uvAttribute, b ); + uvC.fromBufferAttribute( uvAttribute, c ); + + vB.sub( vA ); + vC.sub( vA ); + + uvB.sub( uvA ); + uvC.sub( uvA ); + + const r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y ); + + // silently ignore degenerate uv triangles having coincident or colinear vertices + + if ( ! isFinite( r ) ) return; + + sdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r ); + tdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r ); + + tan1[ a ].add( sdir ); + tan1[ b ].add( sdir ); + tan1[ c ].add( sdir ); + + tan2[ a ].add( tdir ); + tan2[ b ].add( tdir ); + tan2[ c ].add( tdir ); + + } + + let groups = this.groups; + + if ( groups.length === 0 ) { + + groups = [ { + start: 0, + count: index.count + } ]; + + } + + for ( let i = 0, il = groups.length; i < il; ++ i ) { + + const group = groups[ i ]; + + const start = group.start; + const count = group.count; + + for ( let j = start, jl = start + count; j < jl; j += 3 ) { + + handleTriangle( + index.getX( j + 0 ), + index.getX( j + 1 ), + index.getX( j + 2 ) + ); + + } + + } + + const tmp = new Vector3(), tmp2 = new Vector3(); + const n = new Vector3(), n2 = new Vector3(); + + function handleVertex( v ) { + + n.fromBufferAttribute( normalAttribute, v ); + n2.copy( n ); + + const t = tan1[ v ]; + + // Gram-Schmidt orthogonalize + + tmp.copy( t ); + tmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize(); + + // Calculate handedness + + tmp2.crossVectors( n2, t ); + const test = tmp2.dot( tan2[ v ] ); + const w = ( test < 0.0 ) ? -1 : 1.0; + + tangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w ); + + } + + for ( let i = 0, il = groups.length; i < il; ++ i ) { + + const group = groups[ i ]; + + const start = group.start; + const count = group.count; + + for ( let j = start, jl = start + count; j < jl; j += 3 ) { + + handleVertex( index.getX( j + 0 ) ); + handleVertex( index.getX( j + 1 ) ); + handleVertex( index.getX( j + 2 ) ); + + } + + } + + } + + computeVertexNormals() { + + const index = this.index; + const positionAttribute = this.getAttribute( 'position' ); + + if ( positionAttribute !== undefined ) { + + let normalAttribute = this.getAttribute( 'normal' ); + + if ( normalAttribute === undefined ) { + + normalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 ); + this.setAttribute( 'normal', normalAttribute ); + + } else { + + // reset existing normals to zero + + for ( let i = 0, il = normalAttribute.count; i < il; i ++ ) { + + normalAttribute.setXYZ( i, 0, 0, 0 ); + + } + + } + + const pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + const nA = new Vector3(), nB = new Vector3(), nC = new Vector3(); + const cb = new Vector3(), ab = new Vector3(); + + // indexed elements + + if ( index ) { + + for ( let i = 0, il = index.count; i < il; i += 3 ) { + + const vA = index.getX( i + 0 ); + const vB = index.getX( i + 1 ); + const vC = index.getX( i + 2 ); + + pA.fromBufferAttribute( positionAttribute, vA ); + pB.fromBufferAttribute( positionAttribute, vB ); + pC.fromBufferAttribute( positionAttribute, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + nA.fromBufferAttribute( normalAttribute, vA ); + nB.fromBufferAttribute( normalAttribute, vB ); + nC.fromBufferAttribute( normalAttribute, vC ); + + nA.add( cb ); + nB.add( cb ); + nC.add( cb ); + + normalAttribute.setXYZ( vA, nA.x, nA.y, nA.z ); + normalAttribute.setXYZ( vB, nB.x, nB.y, nB.z ); + normalAttribute.setXYZ( vC, nC.x, nC.y, nC.z ); + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) { + + pA.fromBufferAttribute( positionAttribute, i + 0 ); + pB.fromBufferAttribute( positionAttribute, i + 1 ); + pC.fromBufferAttribute( positionAttribute, i + 2 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z ); + normalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z ); + normalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z ); + + } + + } + + this.normalizeNormals(); + + normalAttribute.needsUpdate = true; + + } + + } + + normalizeNormals() { + + const normals = this.attributes.normal; + + for ( let i = 0, il = normals.count; i < il; i ++ ) { + + _vector$8.fromBufferAttribute( normals, i ); + + _vector$8.normalize(); + + normals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z ); + + } + + } + + toNonIndexed() { + + function convertBufferAttribute( attribute, indices ) { + + const array = attribute.array; + const itemSize = attribute.itemSize; + const normalized = attribute.normalized; + + const array2 = new array.constructor( indices.length * itemSize ); + + let index = 0, index2 = 0; + + for ( let i = 0, l = indices.length; i < l; i ++ ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + index = indices[ i ] * attribute.data.stride + attribute.offset; + + } else { + + index = indices[ i ] * itemSize; + + } + + for ( let j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + return new BufferAttribute( array2, itemSize, normalized ); + + } + + // + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' ); + return this; + + } + + const geometry2 = new BufferGeometry(); + + const indices = this.index.array; + const attributes = this.attributes; + + // attributes + + for ( const name in attributes ) { + + const attribute = attributes[ name ]; + + const newAttribute = convertBufferAttribute( attribute, indices ); + + geometry2.setAttribute( name, newAttribute ); + + } + + // morph attributes + + const morphAttributes = this.morphAttributes; + + for ( const name in morphAttributes ) { + + const morphArray = []; + const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( let i = 0, il = morphAttribute.length; i < il; i ++ ) { + + const attribute = morphAttribute[ i ]; + + const newAttribute = convertBufferAttribute( attribute, indices ); + + morphArray.push( newAttribute ); + + } + + geometry2.morphAttributes[ name ] = morphArray; + + } + + geometry2.morphTargetsRelative = this.morphTargetsRelative; + + // groups + + const groups = this.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + geometry2.addGroup( group.start, group.count, group.materialIndex ); + + } + + return geometry2; + + } + + toJSON() { + + const data = { + metadata: { + version: 4.6, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + if ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData; + + if ( this.parameters !== undefined ) { + + const parameters = this.parameters; + + for ( const key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + // for simplicity the code assumes attributes are not shared across geometries, see #15811 + + data.data = { attributes: {} }; + + const index = this.index; + + if ( index !== null ) { + + data.data.index = { + type: index.array.constructor.name, + array: Array.prototype.slice.call( index.array ) + }; + + } + + const attributes = this.attributes; + + for ( const key in attributes ) { + + const attribute = attributes[ key ]; + + data.data.attributes[ key ] = attribute.toJSON( data.data ); + + } + + const morphAttributes = {}; + let hasMorphAttributes = false; + + for ( const key in this.morphAttributes ) { + + const attributeArray = this.morphAttributes[ key ]; + + const array = []; + + for ( let i = 0, il = attributeArray.length; i < il; i ++ ) { + + const attribute = attributeArray[ i ]; + + array.push( attribute.toJSON( data.data ) ); + + } + + if ( array.length > 0 ) { + + morphAttributes[ key ] = array; + + hasMorphAttributes = true; + + } + + } + + if ( hasMorphAttributes ) { + + data.data.morphAttributes = morphAttributes; + data.data.morphTargetsRelative = this.morphTargetsRelative; + + } + + const groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + const boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + } + + clone() { + + return new this.constructor().copy( this ); + + } + + copy( source ) { + + // reset + + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + + // used for storing cloned, shared data + + const data = {}; + + // name + + this.name = source.name; + + // index + + const index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone( data ) ); + + } + + // attributes + + const attributes = source.attributes; + + for ( const name in attributes ) { + + const attribute = attributes[ name ]; + this.setAttribute( name, attribute.clone( data ) ); + + } + + // morph attributes + + const morphAttributes = source.morphAttributes; + + for ( const name in morphAttributes ) { + + const array = []; + const morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes + + for ( let i = 0, l = morphAttribute.length; i < l; i ++ ) { + + array.push( morphAttribute[ i ].clone( data ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + this.morphTargetsRelative = source.morphTargetsRelative; + + // groups + + const groups = source.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + // bounding box + + const boundingBox = source.boundingBox; + + if ( boundingBox !== null ) { + + this.boundingBox = boundingBox.clone(); + + } + + // bounding sphere + + const boundingSphere = source.boundingSphere; + + if ( boundingSphere !== null ) { + + this.boundingSphere = boundingSphere.clone(); + + } + + // draw range + + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + + // user data + + this.userData = source.userData; + + return this; + + } + + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +} + +const _inverseMatrix$3 = /*@__PURE__*/ new Matrix4(); +const _ray$3 = /*@__PURE__*/ new Ray(); +const _sphere$6 = /*@__PURE__*/ new Sphere(); +const _sphereHitAt = /*@__PURE__*/ new Vector3(); + +const _vA$1 = /*@__PURE__*/ new Vector3(); +const _vB$1 = /*@__PURE__*/ new Vector3(); +const _vC$1 = /*@__PURE__*/ new Vector3(); + +const _tempA = /*@__PURE__*/ new Vector3(); +const _morphA = /*@__PURE__*/ new Vector3(); + +const _intersectionPoint = /*@__PURE__*/ new Vector3(); +const _intersectionPointWorld = /*@__PURE__*/ new Vector3(); + +/** + * Class representing triangular polygon mesh based objects. + * + * ```js + * const geometry = new THREE.BoxGeometry( 1, 1, 1 ); + * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } ); + * const mesh = new THREE.Mesh( geometry, material ); + * scene.add( mesh ); + * ``` + * + * @augments Object3D + */ +class Mesh extends Object3D { + + /** + * Constructs a new mesh. + * + * @param {BufferGeometry} [geometry] - The mesh geometry. + * @param {Material|Array} [material] - The mesh material. + */ + constructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isMesh = true; + + this.type = 'Mesh'; + + /** + * The mesh geometry. + * + * @type {BufferGeometry} + */ + this.geometry = geometry; + + /** + * The mesh material. + * + * @type {Material|Array} + * @default MeshBasicMaterial + */ + this.material = material; + + /** + * A dictionary representing the morph targets in the geometry. The key is the + * morph targets name, the value its attribute index. This member is `undefined` + * by default and only set when morph targets are detected in the geometry. + * + * @type {Object|undefined} + * @default undefined + */ + this.morphTargetDictionary = undefined; + + /** + * An array of weights typically in the range `[0,1]` that specify how much of the morph + * is applied. This member is `undefined` by default and only set when morph targets are + * detected in the geometry. + * + * @type {Array|undefined} + * @default undefined + */ + this.morphTargetInfluences = undefined; + + this.updateMorphTargets(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + if ( source.morphTargetInfluences !== undefined ) { + + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + + } + + if ( source.morphTargetDictionary !== undefined ) { + + this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary ); + + } + + this.material = Array.isArray( source.material ) ? source.material.slice() : source.material; + this.geometry = source.geometry; + + return this; + + } + + /** + * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences} + * to make sure existing morph targets can influence this 3D object. + */ + updateMorphTargets() { + + const geometry = this.geometry; + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } + + /** + * Returns the local-space position of the vertex at the given index, taking into + * account the current animation state of both morph targets and skinning. + * + * @param {number} index - The vertex index. + * @param {Vector3} target - The target object that is used to store the method's result. + * @return {Vector3} The vertex position in local space. + */ + getVertexPosition( index, target ) { + + const geometry = this.geometry; + const position = geometry.attributes.position; + const morphPosition = geometry.morphAttributes.position; + const morphTargetsRelative = geometry.morphTargetsRelative; + + target.fromBufferAttribute( position, index ); + + const morphInfluences = this.morphTargetInfluences; + + if ( morphPosition && morphInfluences ) { + + _morphA.set( 0, 0, 0 ); + + for ( let i = 0, il = morphPosition.length; i < il; i ++ ) { + + const influence = morphInfluences[ i ]; + const morphAttribute = morphPosition[ i ]; + + if ( influence === 0 ) continue; + + _tempA.fromBufferAttribute( morphAttribute, index ); + + if ( morphTargetsRelative ) { + + _morphA.addScaledVector( _tempA, influence ); + + } else { + + _morphA.addScaledVector( _tempA.sub( target ), influence ); + + } + + } + + target.add( _morphA ); + + } + + return target; + + } + + /** + * Computes intersection points between a casted ray and this line. + * + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - The target array that holds the intersection points. + */ + raycast( raycaster, intersects ) { + + const geometry = this.geometry; + const material = this.material; + const matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // test with bounding sphere in world space + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$6.copy( geometry.boundingSphere ); + _sphere$6.applyMatrix4( matrixWorld ); + + // check distance from ray origin to bounding sphere + + _ray$3.copy( raycaster.ray ).recast( raycaster.near ); + + if ( _sphere$6.containsPoint( _ray$3.origin ) === false ) { + + if ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return; + + if ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return; + + } + + // convert ray to local space of mesh + + _inverseMatrix$3.copy( matrixWorld ).invert(); + _ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 ); + + // test with bounding box in local space + + if ( geometry.boundingBox !== null ) { + + if ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + // test for intersections with geometry + + this._computeIntersections( raycaster, intersects, _ray$3 ); + + } + + _computeIntersections( raycaster, intersects, rayLocalSpace ) { + + let intersection; + + const geometry = this.geometry; + const material = this.material; + + const index = geometry.index; + const position = geometry.attributes.position; + const uv = geometry.attributes.uv; + const uv1 = geometry.attributes.uv1; + const normal = geometry.attributes.normal; + const groups = geometry.groups; + const drawRange = geometry.drawRange; + + if ( index !== null ) { + + // indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( let i = 0, il = groups.length; i < il; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + const start = Math.max( group.start, drawRange.start ); + const end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) ); + + for ( let j = start, jl = end; j < jl; j += 3 ) { + + const a = index.getX( j ); + const b = index.getX( j + 1 ); + const c = index.getX( j + 2 ); + + intersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics + intersection.face.materialIndex = group.materialIndex; + intersects.push( intersection ); + + } + + } + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, il = end; i < il; i += 3 ) { + + const a = index.getX( i ); + const b = index.getX( i + 1 ); + const c = index.getX( i + 2 ); + + intersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( position !== undefined ) { + + // non-indexed buffer geometry + + if ( Array.isArray( material ) ) { + + for ( let i = 0, il = groups.length; i < il; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + const start = Math.max( group.start, drawRange.start ); + const end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) ); + + for ( let j = start, jl = end; j < jl; j += 3 ) { + + const a = j; + const b = j + 1; + const c = j + 2; + + intersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics + intersection.face.materialIndex = group.materialIndex; + intersects.push( intersection ); + + } + + } + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( position.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, il = end; i < il; i += 3 ) { + + const a = i; + const b = i + 1; + const c = i + 2; + + intersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } + + } + +} + +function checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) { + + let intersect; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point ); + + } + + if ( intersect === null ) return null; + + _intersectionPointWorld.copy( point ); + _intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: _intersectionPointWorld.clone(), + object: object + }; + +} + +function checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) { + + object.getVertexPosition( a, _vA$1 ); + object.getVertexPosition( b, _vB$1 ); + object.getVertexPosition( c, _vC$1 ); + + const intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint ); + + if ( intersection ) { + + const barycoord = new Vector3(); + Triangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord ); + + if ( uv ) { + + intersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() ); + + } + + if ( uv1 ) { + + intersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() ); + + } + + if ( normal ) { + + intersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() ); + + if ( intersection.normal.dot( ray.direction ) > 0 ) { + + intersection.normal.multiplyScalar( -1 ); + + } + + } + + const face = { + a: a, + b: b, + c: c, + normal: new Vector3(), + materialIndex: 0 + }; + + Triangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal ); + + intersection.face = face; + intersection.barycoord = barycoord; + + } + + return intersection; + +} + +/** + * A geometry class for a rectangular cuboid with a given width, height, and depth. + * On creation, the cuboid is centred on the origin, with each edge parallel to one + * of the axes. + * + * ```js + * const geometry = new THREE.BoxGeometry( 1, 1, 1 ); + * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); + * const cube = new THREE.Mesh( geometry, material ); + * scene.add( cube ); + * ``` + * + * @augments BufferGeometry + */ +class BoxGeometry extends BufferGeometry { + + /** + * Constructs a new box geometry. + * + * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis. + * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis. + * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis. + * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides. + * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides. + * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides. + */ + constructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) { + + super(); + + this.type = 'BoxGeometry'; + + /** + * Holds the constructor parameters that have been + * used to generate the geometry. Any modification + * after instantiation does not change the geometry. + * + * @type {Object} + */ + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + const scope = this; + + // segments + + widthSegments = Math.floor( widthSegments ); + heightSegments = Math.floor( heightSegments ); + depthSegments = Math.floor( depthSegments ); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let numberOfVertices = 0; + let groupStart = 0; + + // build each side of the box geometry + + buildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + const segmentWidth = width / gridX; + const segmentHeight = height / gridY; + + const widthHalf = width / 2; + const heightHalf = height / 2; + const depthHalf = depth / 2; + + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + + let vertexCounter = 0; + let groupCount = 0; + + const vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( let iy = 0; iy < gridY1; iy ++ ) { + + const y = iy * segmentHeight - heightHalf; + + for ( let ix = 0; ix < gridX1; ix ++ ) { + + const x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + + vertices.push( vector.x, vector.y, vector.z ); + + // set values to correct vector component + + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : -1; + + // now apply vector to normal buffer + + normals.push( vector.x, vector.y, vector.z ); + + // uvs + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + // counters + + vertexCounter += 1; + + } + + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( let iy = 0; iy < gridY; iy ++ ) { + + for ( let ix = 0; ix < gridX; ix ++ ) { + + const a = numberOfVertices + ix + gridX1 * iy; + const b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + const c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + const d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + // increase counter + + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + + groupStart += groupCount; + + // update total number of vertices + + numberOfVertices += vertexCounter; + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {BoxGeometry} A new instance. + */ + static fromJSON( data ) { + + return new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments ); + + } + +} + +/** + * Uniform Utilities + */ + +function cloneUniforms( src ) { + + const dst = {}; + + for ( const u in src ) { + + dst[ u ] = {}; + + for ( const p in src[ u ] ) { + + const property = src[ u ][ p ]; + + if ( property && ( property.isColor || + property.isMatrix3 || property.isMatrix4 || + property.isVector2 || property.isVector3 || property.isVector4 || + property.isTexture || property.isQuaternion ) ) { + + if ( property.isRenderTargetTexture ) { + + console.warn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' ); + dst[ u ][ p ] = null; + + } else { + + dst[ u ][ p ] = property.clone(); + + } + + } else if ( Array.isArray( property ) ) { + + dst[ u ][ p ] = property.slice(); + + } else { + + dst[ u ][ p ] = property; + + } + + } + + } + + return dst; + +} + +function mergeUniforms( uniforms ) { + + const merged = {}; + + for ( let u = 0; u < uniforms.length; u ++ ) { + + const tmp = cloneUniforms( uniforms[ u ] ); + + for ( const p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + +} + +function cloneUniformsGroups( src ) { + + const dst = []; + + for ( let u = 0; u < src.length; u ++ ) { + + dst.push( src[ u ].clone() ); + + } + + return dst; + +} + +function getUnlitUniformColorSpace( renderer ) { + + const currentRenderTarget = renderer.getRenderTarget(); + + if ( currentRenderTarget === null ) { + + // https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398 + return renderer.outputColorSpace; + + } + + // https://github.com/mrdoob/three.js/issues/27868 + if ( currentRenderTarget.isXRRenderTarget === true ) { + + return currentRenderTarget.texture.colorSpace; + + } + + return ColorManagement.workingColorSpace; + +} + +// Legacy + +const UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms }; + +var default_vertex = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"; + +var default_fragment = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}"; + +class ShaderMaterial extends Material$1 { + + constructor( parameters ) { + + super(); + + this.isShaderMaterial = true; + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + this.uniformsGroups = []; + + this.vertexShader = default_vertex; + this.fragmentShader = default_fragment; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.forceSinglePass = true; + + this.extensions = { + clipCullDistance: false, // set to use vertex shader clipping + multiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv1': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + this.uniformsNeedUpdate = false; + + this.glslVersion = null; + + if ( parameters !== undefined ) { + + this.setValues( parameters ); + + } + + } + + copy( source ) { + + super.copy( source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = cloneUniforms( source.uniforms ); + this.uniformsGroups = cloneUniformsGroups( source.uniformsGroups ); + + this.defines = Object.assign( {}, source.defines ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.fog = source.fog; + this.lights = source.lights; + this.clipping = source.clipping; + + this.extensions = Object.assign( {}, source.extensions ); + + this.glslVersion = source.glslVersion; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.glslVersion = this.glslVersion; + data.uniforms = {}; + + for ( const name in this.uniforms ) { + + const uniform = this.uniforms[ name ]; + const value = uniform.value; + + if ( value && value.isTexture ) { + + data.uniforms[ name ] = { + type: 't', + value: value.toJSON( meta ).uuid + }; + + } else if ( value && value.isColor ) { + + data.uniforms[ name ] = { + type: 'c', + value: value.getHex() + }; + + } else if ( value && value.isVector2 ) { + + data.uniforms[ name ] = { + type: 'v2', + value: value.toArray() + }; + + } else if ( value && value.isVector3 ) { + + data.uniforms[ name ] = { + type: 'v3', + value: value.toArray() + }; + + } else if ( value && value.isVector4 ) { + + data.uniforms[ name ] = { + type: 'v4', + value: value.toArray() + }; + + } else if ( value && value.isMatrix3 ) { + + data.uniforms[ name ] = { + type: 'm3', + value: value.toArray() + }; + + } else if ( value && value.isMatrix4 ) { + + data.uniforms[ name ] = { + type: 'm4', + value: value.toArray() + }; + + } else { + + data.uniforms[ name ] = { + value: value + }; + + // note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far + + } + + } + + if ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines; + + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + data.lights = this.lights; + data.clipping = this.clipping; + + const extensions = {}; + + for ( const key in this.extensions ) { + + if ( this.extensions[ key ] === true ) extensions[ key ] = true; + + } + + if ( Object.keys( extensions ).length > 0 ) data.extensions = extensions; + + return data; + + } + +} + +/** + * Abstract base class for cameras. This class should always be inherited + * when you build a new camera. + * + * @abstract + * @augments Object3D + */ +class Camera extends Object3D { + + /** + * Constructs a new camera. + */ + constructor() { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isCamera = true; + + this.type = 'Camera'; + + /** + * The inverse of the camera's world matrix. + * + * @type {Matrix4} + */ + this.matrixWorldInverse = new Matrix4(); + + /** + * The camera's projection matrix. + * + * @type {Matrix4} + */ + this.projectionMatrix = new Matrix4(); + + /** + * The inverse of the camera's projection matrix. + * + * @type {Matrix4} + */ + this.projectionMatrixInverse = new Matrix4(); + + /** + * The coordinate system in which the camera is used. + * + * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} + */ + this.coordinateSystem = WebGLCoordinateSystem; + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + + this.projectionMatrix.copy( source.projectionMatrix ); + this.projectionMatrixInverse.copy( source.projectionMatrixInverse ); + + this.coordinateSystem = source.coordinateSystem; + + return this; + + } + + /** + * Returns a vector representing the ("look") direction of the 3D object in world space. + * + * This method is overwritten since cameras have a different forward vector compared to other + * 3D objects. A camera looks down its local, negative z-axis by default. + * + * @param {Vector3} target - The target vector the result is stored to. + * @return {Vector3} The 3D object's direction in world space. + */ + getWorldDirection( target ) { + + return super.getWorldDirection( target ).negate(); + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + this.matrixWorldInverse.copy( this.matrixWorld ).invert(); + + } + + updateWorldMatrix( updateParents, updateChildren ) { + + super.updateWorldMatrix( updateParents, updateChildren ); + + this.matrixWorldInverse.copy( this.matrixWorld ).invert(); + + } + + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _v3$1 = /*@__PURE__*/ new Vector3(); +const _minTarget = /*@__PURE__*/ new Vector2(); +const _maxTarget = /*@__PURE__*/ new Vector2(); + +/** + * Camera that uses [perspective projection]{@link https://en.wikipedia.org/wiki/Perspective_(graphical)}. + * + * This projection mode is designed to mimic the way the human eye sees. It + * is the most common projection mode used for rendering a 3D scene. + * + * ```js + * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 ); + * scene.add( camera ); + * ``` + * + * @augments Camera + */ +class PerspectiveCamera extends Camera { + + /** + * Constructs a new perspective camera. + * + * @param {number} [fov=50] - The vertical field of view. + * @param {number} [aspect=1] - The aspect ratio. + * @param {number} [near=0.1] - The camera's near plane. + * @param {number} [far=2000] - The camera's far plane. + */ + constructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isPerspectiveCamera = true; + + this.type = 'PerspectiveCamera'; + + /** + * The vertical field of view, from bottom to top of view, + * in degrees. + * + * @type {number} + * @default 50 + */ + this.fov = fov; + + /** + * The zoom factor of the camera. + * + * @type {number} + * @default 1 + */ + this.zoom = 1; + + /** + * The camera's near plane. The valid range is greater than `0` + * and less than the current value of {@link PerspectiveCamera#far}. + * + * Note that, unlike for the {@link OrthographicCamera}, `0` is not a + * valid value for a perspective camera's near plane. + * + * @type {number} + * @default 0.1 + */ + this.near = near; + + /** + * The camera's far plane. Must be greater than the + * current value of {@link PerspectiveCamera#near}. + * + * @type {number} + * @default 2000 + */ + this.far = far; + + /** + * Object distance used for stereoscopy and depth-of-field effects. This + * parameter does not influence the projection matrix unless a + * {@link StereoCamera} is being used. + * + * @type {number} + * @default 10 + */ + this.focus = 10; + + /** + * The aspect ratio, usually the canvas width / canvas height. + * + * @type {number} + * @default 1 + */ + this.aspect = aspect; + + /** + * Represents the frustum window specification. This property should not be edited + * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}. + * + * @type {?Object} + * @default null + */ + this.view = null; + + /** + * Film size used for the larger axis. Default is `35` (millimeters). This + * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset} + * is set to a nonzero value. + * + * @type {number} + * @default 35 + */ + this.filmGauge = 35; + + /** + * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}. + * + * @type {number} + * @default 0 + */ + this.filmOffset = 0; + + this.updateProjectionMatrix(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + } + + /** + * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * @param {number} focalLength - Values for focal length and film gauge must have the same unit. + */ + setFocalLength( focalLength ) { + + /** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */ + const vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + } + + /** + * Returns the focal length from the current {@link PerspectiveCamera#fov} and + * {@link PerspectiveCamera#filmGauge}. + * + * @return {number} The computed focal length. + */ + getFocalLength() { + + const vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + } + + /** + * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}. + * + * @return {number} The effective FOV. + */ + getEffectiveFOV() { + + return RAD2DEG * 2 * Math.atan( + Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + } + + /** + * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or + * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}. + * + * @return {number} The film width. + */ + getFilmWidth() { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + } + + /** + * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or + * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}. + * + * @return {number} The film width. + */ + getFilmHeight() { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + } + + /** + * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction. + * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle. + * + * @param {number} distance - The viewing distance. + * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector. + * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector. + */ + getViewBounds( distance, minTarget, maxTarget ) { + + _v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse ); + + minTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z ); + + _v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse ); + + maxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z ); + + } + + /** + * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction. + * + * @param {number} distance - The viewing distance. + * @param {Vector2} target - The target vector that is used to store result where x is width and y is height. + * @returns {Vector2} The view size. + */ + getViewSize( distance, target ) { + + this.getViewBounds( distance, _minTarget, _maxTarget ); + + return target.subVectors( _maxTarget, _minTarget ); + + } + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + *``` + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + *``` + * then for each monitor you would call it like this: + *```js + * const w = 1920; + * const h = 1080; + * const fullWidth = w * 3; + * const fullHeight = h * 2; + * + * // --A-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * // --B-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * // --C-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * // --D-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * // --E-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * // --F-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * ``` + * + * Note there is no reason monitors have to be the same size or in a grid. + * + * @param {number} fullWidth - The full width of multiview setup. + * @param {number} fullHeight - The full height of multiview setup. + * @param {number} x - The horizontal offset of the subcamera. + * @param {number} y - The vertical offset of the subcamera. + * @param {number} width - The width of subcamera. + * @param {number} height - The height of subcamera. + */ + setViewOffset( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + } + + /** + * Removes the view offset from the projection matrix. + */ + clearViewOffset() { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + } + + /** + * Updates the camera's projection matrix. Must be called after any change of + * camera properties. + */ + updateProjectionMatrix() { + + const near = this.near; + let top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom; + let height = 2 * top; + let width = this.aspect * height; + let left = -0.5 * width; + const view = this.view; + + if ( this.view !== null && this.view.enabled ) { + + const fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + const skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem ); + + this.projectionMatrixInverse.copy( this.projectionMatrix ).invert(); + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + +} + +const fov = -90; // negative fov is not an error +const aspect = 1; + +/** + * A special type of camera that is positioned in 3D space to render its surroundings into a + * cube render target. The render target can then be used as an environment map for rendering + * realtime reflections in your scene. + * + * ```js + * // Create cube render target + * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } ); + * + * // Create cube camera + * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget ); + * scene.add( cubeCamera ); + * + * // Create car + * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } ); + * const car = new THREE.Mesh( carGeometry, chromeMaterial ); + * scene.add( car ); + * + * // Update the render target cube + * car.visible = false; + * cubeCamera.position.copy( car.position ); + * cubeCamera.update( renderer, scene ); + * + * // Render the scene + * car.visible = true; + * renderer.render( scene, camera ); + * ``` + * + * @augments Object3D + */ +class CubeCamera extends Object3D { + + /** + * Constructs a new cube camera. + * + * @param {number} near - The camera's near plane. + * @param {number} far - The camera's far plane. + * @param {WebGLCubeRenderTarget} renderTarget - The cube render target. + */ + constructor( near, far, renderTarget ) { + + super(); + + this.type = 'CubeCamera'; + + /** + * A reference to the cube render target. + * + * @type {WebGLCubeRenderTarget} + */ + this.renderTarget = renderTarget; + + /** + * The current active coordinate system. + * + * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)} + * @default null + */ + this.coordinateSystem = null; + + /** + * The current active mipmap level + * + * @type {number} + * @default 0 + */ + this.activeMipmapLevel = 0; + + const cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.layers = this.layers; + this.add( cameraPX ); + + const cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.layers = this.layers; + this.add( cameraNX ); + + const cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.layers = this.layers; + this.add( cameraPY ); + + const cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.layers = this.layers; + this.add( cameraNY ); + + const cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.layers = this.layers; + this.add( cameraPZ ); + + const cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.layers = this.layers; + this.add( cameraNZ ); + + } + + /** + * Must be called when the coordinate system of the cube camera is changed. + */ + updateCoordinateSystem() { + + const coordinateSystem = this.coordinateSystem; + + const cameras = this.children.concat(); + + const [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras; + + for ( const camera of cameras ) this.remove( camera ); + + if ( coordinateSystem === WebGLCoordinateSystem ) { + + cameraPX.up.set( 0, 1, 0 ); + cameraPX.lookAt( 1, 0, 0 ); + + cameraNX.up.set( 0, 1, 0 ); + cameraNX.lookAt( -1, 0, 0 ); + + cameraPY.up.set( 0, 0, -1 ); + cameraPY.lookAt( 0, 1, 0 ); + + cameraNY.up.set( 0, 0, 1 ); + cameraNY.lookAt( 0, -1, 0 ); + + cameraPZ.up.set( 0, 1, 0 ); + cameraPZ.lookAt( 0, 0, 1 ); + + cameraNZ.up.set( 0, 1, 0 ); + cameraNZ.lookAt( 0, 0, -1 ); + + } else if ( coordinateSystem === WebGPUCoordinateSystem ) { + + cameraPX.up.set( 0, -1, 0 ); + cameraPX.lookAt( -1, 0, 0 ); + + cameraNX.up.set( 0, -1, 0 ); + cameraNX.lookAt( 1, 0, 0 ); + + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( 0, 1, 0 ); + + cameraNY.up.set( 0, 0, -1 ); + cameraNY.lookAt( 0, -1, 0 ); + + cameraPZ.up.set( 0, -1, 0 ); + cameraPZ.lookAt( 0, 0, 1 ); + + cameraNZ.up.set( 0, -1, 0 ); + cameraNZ.lookAt( 0, 0, -1 ); + + } else { + + throw new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem ); + + } + + for ( const camera of cameras ) { + + this.add( camera ); + + camera.updateMatrixWorld(); + + } + + } + + /** + * Calling this method will render the given scene with the given renderer + * into the cube render target of the camera. + * + * @param {(Renderer|WebGLRenderer)} renderer - The renderer. + * @param {Scene} scene - The scene to render. + */ + update( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + const { renderTarget, activeMipmapLevel } = this; + + if ( this.coordinateSystem !== renderer.coordinateSystem ) { + + this.coordinateSystem = renderer.coordinateSystem; + + this.updateCoordinateSystem(); + + } + + const [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children; + + const currentRenderTarget = renderer.getRenderTarget(); + const currentActiveCubeFace = renderer.getActiveCubeFace(); + const currentActiveMipmapLevel = renderer.getActiveMipmapLevel(); + + const currentXrEnabled = renderer.xr.enabled; + + renderer.xr.enabled = false; + + const generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderer.setRenderTarget( renderTarget, 0, activeMipmapLevel ); + renderer.render( scene, cameraPX ); + + renderer.setRenderTarget( renderTarget, 1, activeMipmapLevel ); + renderer.render( scene, cameraNX ); + + renderer.setRenderTarget( renderTarget, 2, activeMipmapLevel ); + renderer.render( scene, cameraPY ); + + renderer.setRenderTarget( renderTarget, 3, activeMipmapLevel ); + renderer.render( scene, cameraNY ); + + renderer.setRenderTarget( renderTarget, 4, activeMipmapLevel ); + renderer.render( scene, cameraPZ ); + + // mipmaps are generated during the last call of render() + // at this point, all sides of the cube render target are defined + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderer.setRenderTarget( renderTarget, 5, activeMipmapLevel ); + renderer.render( scene, cameraNZ ); + + renderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel ); + + renderer.xr.enabled = currentXrEnabled; + + renderTarget.texture.needsPMREMUpdate = true; + + } + +} + +class CubeTexture extends Texture$1 { + + constructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + super( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ); + + this.isCubeTexture = true; + + this.flipY = false; + + } + + get images() { + + return this.image; + + } + + set images( value ) { + + this.image = value; + + } + +} + +class WebGLCubeRenderTarget extends WebGLRenderTarget { + + constructor( size = 1, options = {} ) { + + super( size, size, options ); + + this.isWebGLCubeRenderTarget = true; + + const image = { width: size, height: size, depth: 1 }; + const images = [ image, image, image, image, image, image ]; + + this.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace ); + + // By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js) + // in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words, + // in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly. + + // three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped + // and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture + // as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures). + + this.texture.isRenderTargetTexture = true; + + this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false; + this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter; + + } + + fromEquirectangularTexture( renderer, texture ) { + + this.texture.type = texture.type; + this.texture.colorSpace = texture.colorSpace; + + this.texture.generateMipmaps = texture.generateMipmaps; + this.texture.minFilter = texture.minFilter; + this.texture.magFilter = texture.magFilter; + + const shader = { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: /* glsl */` + + varying vec3 vWorldDirection; + + vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); + + } + + void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + + } + `, + + fragmentShader: /* glsl */` + + uniform sampler2D tEquirect; + + varying vec3 vWorldDirection; + + #include + + void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV = equirectUv( direction ); + + gl_FragColor = texture2D( tEquirect, sampleUV ); + + } + ` + }; + + const geometry = new BoxGeometry( 5, 5, 5 ); + + const material = new ShaderMaterial( { + + name: 'CubemapFromEquirect', + + uniforms: cloneUniforms( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader, + side: BackSide, + blending: NoBlending + + } ); + + material.uniforms.tEquirect.value = texture; + + const mesh = new Mesh( geometry, material ); + + const currentMinFilter = texture.minFilter; + + // Avoid blurred poles + if ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter; + + const camera = new CubeCamera( 1, 10, this ); + camera.update( renderer, mesh ); + + texture.minFilter = currentMinFilter; + + mesh.geometry.dispose(); + mesh.material.dispose(); + + return this; + + } + + clear( renderer, color, depth, stencil ) { + + const currentRenderTarget = renderer.getRenderTarget(); + + for ( let i = 0; i < 6; i ++ ) { + + renderer.setRenderTarget( this, i ); + + renderer.clear( color, depth, stencil ); + + } + + renderer.setRenderTarget( currentRenderTarget ); + + } + +} + +/** + * This is almost identical to an {@link Object3D}. Its purpose is to + * make working with groups of objects syntactically clearer. + * + * ```js + * // Create a group and add the two cubes. + * // These cubes can now be rotated / scaled etc as a group. + * const group = new THREE.Group(); + * + * group.add( meshA ); + * group.add( meshB ); + * + * scene.add( group ); + * ``` + * + * @augments Object3D + */ +class Group extends Object3D { + + constructor() { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isGroup = true; + + this.type = 'Group'; + + } + +} + +const _moveEvent = { type: 'move' }; + +class WebXRController { + + constructor() { + + this._targetRay = null; + this._grip = null; + this._hand = null; + + } + + getHandSpace() { + + if ( this._hand === null ) { + + this._hand = new Group(); + this._hand.matrixAutoUpdate = false; + this._hand.visible = false; + + this._hand.joints = {}; + this._hand.inputState = { pinching: false }; + + } + + return this._hand; + + } + + getTargetRaySpace() { + + if ( this._targetRay === null ) { + + this._targetRay = new Group(); + this._targetRay.matrixAutoUpdate = false; + this._targetRay.visible = false; + this._targetRay.hasLinearVelocity = false; + this._targetRay.linearVelocity = new Vector3(); + this._targetRay.hasAngularVelocity = false; + this._targetRay.angularVelocity = new Vector3(); + + } + + return this._targetRay; + + } + + getGripSpace() { + + if ( this._grip === null ) { + + this._grip = new Group(); + this._grip.matrixAutoUpdate = false; + this._grip.visible = false; + this._grip.hasLinearVelocity = false; + this._grip.linearVelocity = new Vector3(); + this._grip.hasAngularVelocity = false; + this._grip.angularVelocity = new Vector3(); + + } + + return this._grip; + + } + + dispatchEvent( event ) { + + if ( this._targetRay !== null ) { + + this._targetRay.dispatchEvent( event ); + + } + + if ( this._grip !== null ) { + + this._grip.dispatchEvent( event ); + + } + + if ( this._hand !== null ) { + + this._hand.dispatchEvent( event ); + + } + + return this; + + } + + connect( inputSource ) { + + if ( inputSource && inputSource.hand ) { + + const hand = this._hand; + + if ( hand ) { + + for ( const inputjoint of inputSource.hand.values() ) { + + // Initialize hand with joints when connected + this._getHandJoint( hand, inputjoint ); + + } + + } + + } + + this.dispatchEvent( { type: 'connected', data: inputSource } ); + + return this; + + } + + disconnect( inputSource ) { + + this.dispatchEvent( { type: 'disconnected', data: inputSource } ); + + if ( this._targetRay !== null ) { + + this._targetRay.visible = false; + + } + + if ( this._grip !== null ) { + + this._grip.visible = false; + + } + + if ( this._hand !== null ) { + + this._hand.visible = false; + + } + + return this; + + } + + update( inputSource, frame, referenceSpace ) { + + let inputPose = null; + let gripPose = null; + let handPose = null; + + const targetRay = this._targetRay; + const grip = this._grip; + const hand = this._hand; + + if ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) { + + if ( hand && inputSource.hand ) { + + handPose = true; + + for ( const inputjoint of inputSource.hand.values() ) { + + // Update the joints groups with the XRJoint poses + const jointPose = frame.getJointPose( inputjoint, referenceSpace ); + + // The transform of this joint will be updated with the joint pose on each frame + const joint = this._getHandJoint( hand, inputjoint ); + + if ( jointPose !== null ) { + + joint.matrix.fromArray( jointPose.transform.matrix ); + joint.matrix.decompose( joint.position, joint.rotation, joint.scale ); + joint.matrixWorldNeedsUpdate = true; + joint.jointRadius = jointPose.radius; + + } + + joint.visible = jointPose !== null; + + } + + // Custom events + + // Check pinchz + const indexTip = hand.joints[ 'index-finger-tip' ]; + const thumbTip = hand.joints[ 'thumb-tip' ]; + const distance = indexTip.position.distanceTo( thumbTip.position ); + + const distanceToPinch = 0.02; + const threshold = 0.005; + + if ( hand.inputState.pinching && distance > distanceToPinch + threshold ) { + + hand.inputState.pinching = false; + this.dispatchEvent( { + type: 'pinchend', + handedness: inputSource.handedness, + target: this + } ); + + } else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) { + + hand.inputState.pinching = true; + this.dispatchEvent( { + type: 'pinchstart', + handedness: inputSource.handedness, + target: this + } ); + + } + + } else { + + if ( grip !== null && inputSource.gripSpace ) { + + gripPose = frame.getPose( inputSource.gripSpace, referenceSpace ); + + if ( gripPose !== null ) { + + grip.matrix.fromArray( gripPose.transform.matrix ); + grip.matrix.decompose( grip.position, grip.rotation, grip.scale ); + grip.matrixWorldNeedsUpdate = true; + + if ( gripPose.linearVelocity ) { + + grip.hasLinearVelocity = true; + grip.linearVelocity.copy( gripPose.linearVelocity ); + + } else { + + grip.hasLinearVelocity = false; + + } + + if ( gripPose.angularVelocity ) { + + grip.hasAngularVelocity = true; + grip.angularVelocity.copy( gripPose.angularVelocity ); + + } else { + + grip.hasAngularVelocity = false; + + } + + } + + } + + } + + if ( targetRay !== null ) { + + inputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace ); + + // Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it + if ( inputPose === null && gripPose !== null ) { + + inputPose = gripPose; + + } + + if ( inputPose !== null ) { + + targetRay.matrix.fromArray( inputPose.transform.matrix ); + targetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale ); + targetRay.matrixWorldNeedsUpdate = true; + + if ( inputPose.linearVelocity ) { + + targetRay.hasLinearVelocity = true; + targetRay.linearVelocity.copy( inputPose.linearVelocity ); + + } else { + + targetRay.hasLinearVelocity = false; + + } + + if ( inputPose.angularVelocity ) { + + targetRay.hasAngularVelocity = true; + targetRay.angularVelocity.copy( inputPose.angularVelocity ); + + } else { + + targetRay.hasAngularVelocity = false; + + } + + this.dispatchEvent( _moveEvent ); + + } + + } + + + } + + if ( targetRay !== null ) { + + targetRay.visible = ( inputPose !== null ); + + } + + if ( grip !== null ) { + + grip.visible = ( gripPose !== null ); + + } + + if ( hand !== null ) { + + hand.visible = ( handPose !== null ); + + } + + return this; + + } + + // private method + + _getHandJoint( hand, inputjoint ) { + + if ( hand.joints[ inputjoint.jointName ] === undefined ) { + + const joint = new Group(); + joint.matrixAutoUpdate = false; + joint.visible = false; + hand.joints[ inputjoint.jointName ] = joint; + + hand.add( joint ); + + } + + return hand.joints[ inputjoint.jointName ]; + + } + +} + +/** + * Scenes allow you to set up what is to be rendered and where by three.js. + * This is where you place 3D objects like meshes, lines or lights. + * + * @augments Object3D + */ +class Scene extends Object3D { + + /** + * Constructs a new scene. + */ + constructor() { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isScene = true; + + this.type = 'Scene'; + + /** + * Defines the background of the scene. Valid inputs are: + * + * - A color for defining a uniform colored background. + * - A texture for defining a (flat) textured background. + * - Cube textures or equirectangular textures for defining a skybox. + * + * @type {?(Color|Texture)} + * @default null + */ + this.background = null; + + /** + * Sets the environment map for all physical materials in the scene. However, + * it's not possible to overwrite an existing texture assigned to the `envMap` + * material property. + * + * @type {?Texture} + * @default null + */ + this.environment = null; + + /** + * A fog instance defining the type of fog that affects everything + * rendered in the scene. + * + * @type {?(Fog|FogExp2)} + * @default null + */ + this.fog = null; + + /** + * Sets the blurriness of the background. Only influences environment maps + * assigned to {@link Scene#background}. Valid input is a float between `0` + * and `1`. + * + * @type {number} + * @default 0 + */ + this.backgroundBlurriness = 0; + + /** + * Attenuates the color of the background. Only applies to background textures. + * + * @type {number} + * @default 1 + */ + this.backgroundIntensity = 1; + + /** + * The rotation of the background in radians. Only influences environment maps + * assigned to {@link Scene#background}. + * + * @type {Euler} + * @default (0,0,0) + */ + this.backgroundRotation = new Euler(); + + /** + * Attenuates the color of the environment. Only influences environment maps + * assigned to {@link Scene#environment}. + * + * @type {number} + * @default 1 + */ + this.environmentIntensity = 1; + + /** + * The rotation of the environment map in radians. Only influences physical materials + * in the scene when {@link Scene#environment} is used. + * + * @type {Euler} + * @default (0,0,0) + */ + this.environmentRotation = new Euler(); + + /** + * Forces everything in the scene to be rendered with the defined material. + * + * @type {?Material} + * @default null + */ + this.overrideMaterial = null; + + if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); + + } + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.environment !== null ) this.environment = source.environment.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + + this.backgroundBlurriness = source.backgroundBlurriness; + this.backgroundIntensity = source.backgroundIntensity; + this.backgroundRotation.copy( source.backgroundRotation ); + + this.environmentIntensity = source.environmentIntensity; + this.environmentRotation.copy( source.environmentRotation ); + + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + if ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness; + if ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity; + data.object.backgroundRotation = this.backgroundRotation.toArray(); + + if ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity; + data.object.environmentRotation = this.environmentRotation.toArray(); + + return data; + + } + +} + +class InterleavedBuffer { + + constructor( array, stride ) { + + this.isInterleavedBuffer = true; + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.usage = StaticDrawUsage; + this.updateRanges = []; + + this.version = 0; + + this.uuid = generateUUID(); + + } + + onUploadCallback() {} + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + } + + setUsage( value ) { + + this.usage = value; + + return this; + + } + + addUpdateRange( start, count ) { + + this.updateRanges.push( { start, count } ); + + } + + clearUpdateRanges() { + + this.updateRanges.length = 0; + + } + + copy( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.usage = source.usage; + + return this; + + } + + copyAt( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( let i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + } + + set( value, offset = 0 ) { + + this.array.set( value, offset ); + + return this; + + } + + clone( data ) { + + if ( data.arrayBuffers === undefined ) { + + data.arrayBuffers = {}; + + } + + if ( this.array.buffer._uuid === undefined ) { + + this.array.buffer._uuid = generateUUID(); + + } + + if ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) { + + data.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer; + + } + + const array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] ); + + const ib = new this.constructor( array, this.stride ); + ib.setUsage( this.usage ); + + return ib; + + } + + onUpload( callback ) { + + this.onUploadCallback = callback; + + return this; + + } + + toJSON( data ) { + + if ( data.arrayBuffers === undefined ) { + + data.arrayBuffers = {}; + + } + + // generate UUID for array buffer if necessary + + if ( this.array.buffer._uuid === undefined ) { + + this.array.buffer._uuid = generateUUID(); + + } + + if ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) { + + data.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) ); + + } + + // + + return { + uuid: this.uuid, + buffer: this.array.buffer._uuid, + type: this.array.constructor.name, + stride: this.stride + }; + + } + +} + +const _vector$7 = /*@__PURE__*/ new Vector3(); + +class InterleavedBufferAttribute { + + constructor( interleavedBuffer, itemSize, offset, normalized = false ) { + + this.isInterleavedBufferAttribute = true; + + this.name = ''; + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized; + + } + + get count() { + + return this.data.count; + + } + + get array() { + + return this.data.array; + + } + + set needsUpdate( value ) { + + this.data.needsUpdate = value; + + } + + applyMatrix4( m ) { + + for ( let i = 0, l = this.data.count; i < l; i ++ ) { + + _vector$7.fromBufferAttribute( this, i ); + + _vector$7.applyMatrix4( m ); + + this.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z ); + + } + + return this; + + } + + applyNormalMatrix( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$7.fromBufferAttribute( this, i ); + + _vector$7.applyNormalMatrix( m ); + + this.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z ); + + } + + return this; + + } + + transformDirection( m ) { + + for ( let i = 0, l = this.count; i < l; i ++ ) { + + _vector$7.fromBufferAttribute( this, i ); + + _vector$7.transformDirection( m ); + + this.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z ); + + } + + return this; + + } + + getComponent( index, component ) { + + let value = this.array[ index * this.data.stride + this.offset + component ]; + + if ( this.normalized ) value = denormalize( value, this.array ); + + return value; + + } + + setComponent( index, component, value ) { + + if ( this.normalized ) value = normalize( value, this.array ); + + this.data.array[ index * this.data.stride + this.offset + component ] = value; + + return this; + + } + + setX( index, x ) { + + if ( this.normalized ) x = normalize( x, this.array ); + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + } + + setY( index, y ) { + + if ( this.normalized ) y = normalize( y, this.array ); + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + } + + setZ( index, z ) { + + if ( this.normalized ) z = normalize( z, this.array ); + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + } + + setW( index, w ) { + + if ( this.normalized ) w = normalize( w, this.array ); + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + } + + getX( index ) { + + let x = this.data.array[ index * this.data.stride + this.offset ]; + + if ( this.normalized ) x = denormalize( x, this.array ); + + return x; + + } + + getY( index ) { + + let y = this.data.array[ index * this.data.stride + this.offset + 1 ]; + + if ( this.normalized ) y = denormalize( y, this.array ); + + return y; + + } + + getZ( index ) { + + let z = this.data.array[ index * this.data.stride + this.offset + 2 ]; + + if ( this.normalized ) z = denormalize( z, this.array ); + + return z; + + } + + getW( index ) { + + let w = this.data.array[ index * this.data.stride + this.offset + 3 ]; + + if ( this.normalized ) w = denormalize( w, this.array ); + + return w; + + } + + setXY( index, x, y ) { + + index = index * this.data.stride + this.offset; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + + } + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + } + + setXYZ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + + } + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + } + + setXYZW( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + if ( this.normalized ) { + + x = normalize( x, this.array ); + y = normalize( y, this.array ); + z = normalize( z, this.array ); + w = normalize( w, this.array ); + + } + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + clone( data ) { + + if ( data === undefined ) { + + console.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' ); + + const array = []; + + for ( let i = 0; i < this.count; i ++ ) { + + const index = i * this.data.stride + this.offset; + + for ( let j = 0; j < this.itemSize; j ++ ) { + + array.push( this.data.array[ index + j ] ); + + } + + } + + return new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized ); + + } else { + + if ( data.interleavedBuffers === undefined ) { + + data.interleavedBuffers = {}; + + } + + if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { + + data.interleavedBuffers[ this.data.uuid ] = this.data.clone( data ); + + } + + return new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized ); + + } + + } + + toJSON( data ) { + + if ( data === undefined ) { + + console.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' ); + + const array = []; + + for ( let i = 0; i < this.count; i ++ ) { + + const index = i * this.data.stride + this.offset; + + for ( let j = 0; j < this.itemSize; j ++ ) { + + array.push( this.data.array[ index + j ] ); + + } + + } + + // de-interleave data and save it as an ordinary buffer attribute for now + + return { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: array, + normalized: this.normalized + }; + + } else { + + // save as true interleaved attribute + + if ( data.interleavedBuffers === undefined ) { + + data.interleavedBuffers = {}; + + } + + if ( data.interleavedBuffers[ this.data.uuid ] === undefined ) { + + data.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data ); + + } + + return { + isInterleavedBufferAttribute: true, + itemSize: this.itemSize, + data: this.data.uuid, + offset: this.offset, + normalized: this.normalized + }; + + } + + } + +} + +const _basePosition = /*@__PURE__*/ new Vector3(); + +const _skinIndex = /*@__PURE__*/ new Vector4(); +const _skinWeight = /*@__PURE__*/ new Vector4(); + +const _vector3 = /*@__PURE__*/ new Vector3(); +const _matrix4 = /*@__PURE__*/ new Matrix4(); +const _vertex = /*@__PURE__*/ new Vector3(); + +const _sphere$5 = /*@__PURE__*/ new Sphere(); +const _inverseMatrix$2 = /*@__PURE__*/ new Matrix4(); +const _ray$2 = /*@__PURE__*/ new Ray(); + +/** + * A mesh that has a {@link Skeleton} that can then be used to animate the + * vertices of the geometry with skinning/skeleton animation. + * + * Next to a valid skeleton, the skinned mesh requires skin indices and weights + * as buffer attributes in its geometry. These attribute define which bones affect a single + * vertex to a certain extend. + * + * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader} + * or {@link FBXLoader } import respective models. + * + * @augments Mesh + */ +class SkinnedMesh extends Mesh { + + /** + * Constructs a new skinned mesh. + * + * @param {BufferGeometry} [geometry] - The mesh geometry. + * @param {Material|Array} [material] - The mesh material. + */ + constructor( geometry, material ) { + + super( geometry, material ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isSkinnedMesh = true; + + this.type = 'SkinnedMesh'; + + /** + * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton. + * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton + * across multiple skinned meshes. + * + * @type {(AttachedBindMode|DetachedBindMode)} + * @default AttachedBindMode + */ + this.bindMode = AttachedBindMode; + + /** + * The base matrix that is used for the bound bone transforms. + * + * @type {Matrix4} + */ + this.bindMatrix = new Matrix4(); + + /** + * The base matrix that is used for resetting the bound bone transforms. + * + * @type {Matrix4} + */ + this.bindMatrixInverse = new Matrix4(); + + /** + * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}. + * + * @type {?Box3} + * @default null + */ + this.boundingBox = null; + + /** + * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}. + * + * @type {?Sphere} + * @default null + */ + this.boundingSphere = null; + + } + + /** + * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}. + * The bounding box is not automatically computed by the engine; this method must be called by your app. + * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect + * the current animation state. + */ + computeBoundingBox() { + + const geometry = this.geometry; + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.makeEmpty(); + + const positionAttribute = geometry.getAttribute( 'position' ); + + for ( let i = 0; i < positionAttribute.count; i ++ ) { + + this.getVertexPosition( i, _vertex ); + this.boundingBox.expandByPoint( _vertex ); + + } + + } + + /** + * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}. + * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting + * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed + * per frame in order to reflect the current animation state. + */ + computeBoundingSphere() { + + const geometry = this.geometry; + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.makeEmpty(); + + const positionAttribute = geometry.getAttribute( 'position' ); + + for ( let i = 0; i < positionAttribute.count; i ++ ) { + + this.getVertexPosition( i, _vertex ); + this.boundingSphere.expandByPoint( _vertex ); + + } + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.bindMode = source.bindMode; + this.bindMatrix.copy( source.bindMatrix ); + this.bindMatrixInverse.copy( source.bindMatrixInverse ); + + this.skeleton = source.skeleton; + + if ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone(); + if ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone(); + + return this; + + } + + raycast( raycaster, intersects ) { + + const material = this.material; + const matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // test with bounding sphere in world space + + if ( this.boundingSphere === null ) this.computeBoundingSphere(); + + _sphere$5.copy( this.boundingSphere ); + _sphere$5.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return; + + // convert ray to local space of skinned mesh + + _inverseMatrix$2.copy( matrixWorld ).invert(); + _ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 ); + + // test with bounding box in local space + + if ( this.boundingBox !== null ) { + + if ( _ray$2.intersectsBox( this.boundingBox ) === false ) return; + + } + + // test for intersections with geometry + + this._computeIntersections( raycaster, intersects, _ray$2 ); + + } + + getVertexPosition( index, target ) { + + super.getVertexPosition( index, target ); + + this.applyBoneTransform( index, target ); + + return target; + + } + + /** + * Binds the given skeleton to the skinned mesh. + * + * @param {Skeleton} skeleton - The skeleton to bind. + * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided, + * the skinned mesh's world matrix will be used instead. + */ + bind( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.copy( bindMatrix ).invert(); + + } + + /** + * This method sets the skinned mesh in the rest pose). + */ + pose() { + + this.skeleton.pose(); + + } + + /** + * Normalizes the skin weights which are defined as a buffer attribute + * in the skinned mesh's geometry. + */ + normalizeSkinWeights() { + + const vector = new Vector4(); + + const skinWeight = this.geometry.attributes.skinWeight; + + for ( let i = 0, l = skinWeight.count; i < l; i ++ ) { + + vector.fromBufferAttribute( skinWeight, i ); + + const scale = 1.0 / vector.manhattanLength(); + + if ( scale !== Infinity ) { + + vector.multiplyScalar( scale ); + + } else { + + vector.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w ); + + } + + } + + updateMatrixWorld( force ) { + + super.updateMatrixWorld( force ); + + if ( this.bindMode === AttachedBindMode ) { + + this.bindMatrixInverse.copy( this.matrixWorld ).invert(); + + } else if ( this.bindMode === DetachedBindMode ) { + + this.bindMatrixInverse.copy( this.bindMatrix ).invert(); + + } else { + + console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); + + } + + } + + /** + * Applies the bone transform associated with the given index to the given + * vertex position. Returns the updated vector. + * + * @param {number} index - The vertex index. + * @param {Vector3} target - The target object that is used to store the method's result. + * the skinned mesh's world matrix will be used instead. + * @return {Vector3} The updated vertex position. + */ + applyBoneTransform( index, target ) { + + const skeleton = this.skeleton; + const geometry = this.geometry; + + _skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index ); + _skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index ); + + _basePosition.copy( target ).applyMatrix4( this.bindMatrix ); + + target.set( 0, 0, 0 ); + + for ( let i = 0; i < 4; i ++ ) { + + const weight = _skinWeight.getComponent( i ); + + if ( weight !== 0 ) { + + const boneIndex = _skinIndex.getComponent( i ); + + _matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] ); + + target.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight ); + + } + + } + + return target.applyMatrix4( this.bindMatrixInverse ); + + } + +} + +/** + * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by + * the {@link SkinnedMesh}. + * + * ```js + * const root = new THREE.Bone(); + * const child = new THREE.Bone(); + * + * root.add( child ); + * child.position.y = 5; + * ``` + * + * @augments Object3D + */ +class Bone extends Object3D { + + /** + * Constructs a new bone. + */ + constructor() { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isBone = true; + + this.type = 'Bone'; + + } + +} + +class DataTexture extends Texture$1 { + + constructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) { + + super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ); + + this.isDataTexture = true; + + this.image = { data: data, width: width, height: height }; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + +} + +const _offsetMatrix = /*@__PURE__*/ new Matrix4(); +const _identityMatrix$1 = /*@__PURE__*/ new Matrix4(); + +/** + * Class for representing the armatures in `three.js`. The skeleton + * is defined by a hierarchy of bones. + * + * ```js + * const bones = []; + * + * const shoulder = new THREE.Bone(); + * const elbow = new THREE.Bone(); + * const hand = new THREE.Bone(); + * + * shoulder.add( elbow ); + * elbow.add( hand ); + * + * bones.push( shoulder , elbow, hand); + * + * shoulder.position.y = -5; + * elbow.position.y = 0; + * hand.position.y = 5; + * + * const armSkeleton = new THREE.Skeleton( bones ); + * ``` + */ +class Skeleton { + + /** + * Constructs a new skeleton. + * + * @param {Array} [bones] - An array of bones. + * @param {Array} [boneInverses] - An array of bone inverse matrices. + * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}. + */ + constructor( bones = [], boneInverses = [] ) { + + this.uuid = generateUUID(); + + /** + * An array of bones defining the skeleton. + * + * @type {Array} + */ + this.bones = bones.slice( 0 ); + + /** + * An array of bone inverse matrices. + * + * @type {Array} + */ + this.boneInverses = boneInverses; + + /** + * An array buffer holding the bone data. + * Input data for {@link Skeleton#boneTexture}. + * + * @type {?Float32Array} + * @default null + */ + this.boneMatrices = null; + + /** + * A texture holding the bone data for use + * in the vertex shader. + * + * @type {?DataTexture} + * @default null + */ + this.boneTexture = null; + + this.init(); + + } + + /** + * Initializes the skeleton. This method gets automatically called by the constructor + * but depending on how the skeleton is created it might be necessary to call this method + * manually. + */ + init() { + + const bones = this.bones; + const boneInverses = this.boneInverses; + + this.boneMatrices = new Float32Array( bones.length * 16 ); + + // calculate inverse bone matrices if necessary + + if ( boneInverses.length === 0 ) { + + this.calculateInverses(); + + } else { + + // handle special case + + if ( bones.length !== boneInverses.length ) { + + console.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' ); + + this.boneInverses = []; + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + /** + * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses} + * and fills it with new matrices. + */ + calculateInverses() { + + this.boneInverses.length = 0; + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const inverse = new Matrix4(); + + if ( this.bones[ i ] ) { + + inverse.copy( this.bones[ i ].matrixWorld ).invert(); + + } + + this.boneInverses.push( inverse ); + + } + + } + + /** + * Resets the skeleton to the base pose. + */ + pose() { + + // recover the bind-time world matrices + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone ) { + + bone.matrixWorld.copy( this.boneInverses[ i ] ).invert(); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone ) { + + if ( bone.parent && bone.parent.isBone ) { + + bone.matrix.copy( bone.parent.matrixWorld ).invert(); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + } + + /** + * Resets the skeleton to the base pose. + */ + update() { + + const bones = this.bones; + const boneInverses = this.boneInverses; + const boneMatrices = this.boneMatrices; + const boneTexture = this.boneTexture; + + // flatten bone matrices to array + + for ( let i = 0, il = bones.length; i < il; i ++ ) { + + // compute the offset between the current and the original transform + + const matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix$1; + + _offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); + _offsetMatrix.toArray( boneMatrices, i * 16 ); + + } + + if ( boneTexture !== null ) { + + boneTexture.needsUpdate = true; + + } + + } + + /** + * Returns a new skeleton with copied values from this instance. + * + * @return {Skeleton} A clone of this instance. + */ + clone() { + + return new Skeleton( this.bones, this.boneInverses ); + + } + + /** + * Computes a data texture for passing bone data to the vertex shader. + * + * @return {Skeleton} A reference of this instance. + */ + computeBoneTexture() { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + let size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix + size = Math.ceil( size / 4 ) * 4; + size = Math.max( size, 4 ); + + const boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel + boneMatrices.set( this.boneMatrices ); // copy current values + + const boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType ); + boneTexture.needsUpdate = true; + + this.boneMatrices = boneMatrices; + this.boneTexture = boneTexture; + + return this; + + } + + /** + * Searches through the skeleton's bone array and returns the first with a + * matching name. + * + * @param {string} name - The name of the bone. + * @return {Bone|undefined} The found bone. `undefined` if no bone has been found. + */ + getBoneByName( name ) { + + for ( let i = 0, il = this.bones.length; i < il; i ++ ) { + + const bone = this.bones[ i ]; + + if ( bone.name === name ) { + + return bone; + + } + + } + + return undefined; + + } + + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose( ) { + + if ( this.boneTexture !== null ) { + + this.boneTexture.dispose(); + + this.boneTexture = null; + + } + + } + + /** + * Setups the skeleton by the given JSON and bones. + * + * @param {Object} json - The skeleton as serialized JSON. + * @param {Array} bones - An array of bones. + * @return {Skeleton} A reference of this instance. + */ + fromJSON( json, bones ) { + + this.uuid = json.uuid; + + for ( let i = 0, l = json.bones.length; i < l; i ++ ) { + + const uuid = json.bones[ i ]; + let bone = bones[ uuid ]; + + if ( bone === undefined ) { + + console.warn( 'THREE.Skeleton: No bone found with UUID:', uuid ); + bone = new Bone(); + + } + + this.bones.push( bone ); + this.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) ); + + } + + this.init(); + + return this; + + } + + /** + * Serializes the skeleton into JSON. + * + * @return {Object} A JSON object representing the serialized skeleton. + * @see {@link ObjectLoader#parse} + */ + toJSON() { + + const data = { + metadata: { + version: 4.6, + type: 'Skeleton', + generator: 'Skeleton.toJSON' + }, + bones: [], + boneInverses: [] + }; + + data.uuid = this.uuid; + + const bones = this.bones; + const boneInverses = this.boneInverses; + + for ( let i = 0, l = bones.length; i < l; i ++ ) { + + const bone = bones[ i ]; + data.bones.push( bone.uuid ); + + const boneInverse = boneInverses[ i ]; + data.boneInverses.push( boneInverse.toArray() ); + + } + + return data; + + } + +} + +class InstancedBufferAttribute extends BufferAttribute { + + constructor( array, itemSize, normalized, meshPerAttribute = 1 ) { + + super( array, itemSize, normalized ); + + this.isInstancedBufferAttribute = true; + + this.meshPerAttribute = meshPerAttribute; + + } + + copy( source ) { + + super.copy( source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.meshPerAttribute = this.meshPerAttribute; + + data.isInstancedBufferAttribute = true; + + return data; + + } + +} + +const _instanceLocalMatrix = /*@__PURE__*/ new Matrix4(); +const _instanceWorldMatrix = /*@__PURE__*/ new Matrix4(); + +const _instanceIntersects = []; + +const _box3 = /*@__PURE__*/ new Box3(); +const _identity = /*@__PURE__*/ new Matrix4(); +const _mesh$1 = /*@__PURE__*/ new Mesh(); +const _sphere$4 = /*@__PURE__*/ new Sphere(); + +/** + * A special version of a mesh with instanced rendering support. Use + * this class if you have to render a large number of objects with the same + * geometry and material(s) but with different world transformations. The usage + * of 'InstancedMesh' will help you to reduce the number of draw calls and thus + * improve the overall rendering performance in your application. + * + * @augments Mesh + */ +class InstancedMesh extends Mesh { + + /** + * Constructs a new instanced mesh. + * + * @param {BufferGeometry} [geometry] - The mesh geometry. + * @param {Material|Array} [material] - The mesh material. + * @param {number} count - The number of instances. + */ + constructor( geometry, material, count ) { + + super( geometry, material ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isInstancedMesh = true; + + /** + * Represents the local transformation of all instances. You have to set its + * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data + * via {@link InstancedMesh#setMatrixAt}. + * + * @type {InstancedBufferAttribute} + */ + this.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 ); + + /** + * Represents the color of all instances. You have to set its + * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data + * via {@link InstancedMesh#setColorAt}. + * + * @type {?InstancedBufferAttribute} + * @default null + */ + this.instanceColor = null; + + /** + * Represents the morph target weights of all instances. You have to set its + * {@link Texture#needsUpdate} flag to true if you modify instanced data + * via {@link InstancedMesh#setMorphAt}. + * + * @type {?InstancedBufferAttribute} + * @default null + */ + this.morphTexture = null; + + /** + * The number of instances. + * + * @type {number} + */ + this.count = count; + + /** + * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}. + * + * @type {?Box3} + * @default null + */ + this.boundingBox = null; + + /** + * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}. + * + * @type {?Sphere} + * @default null + */ + this.boundingSphere = null; + + for ( let i = 0; i < count; i ++ ) { + + this.setMatrixAt( i, _identity ); + + } + + } + + /** + * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}. + * The bounding box is not automatically computed by the engine; this method must be called by your app. + * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}. + */ + computeBoundingBox() { + + const geometry = this.geometry; + const count = this.count; + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + if ( geometry.boundingBox === null ) { + + geometry.computeBoundingBox(); + + } + + this.boundingBox.makeEmpty(); + + for ( let i = 0; i < count; i ++ ) { + + this.getMatrixAt( i, _instanceLocalMatrix ); + + _box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix ); + + this.boundingBox.union( _box3 ); + + } + + } + + /** + * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere} + * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling. + * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}. + */ + computeBoundingSphere() { + + const geometry = this.geometry; + const count = this.count; + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + if ( geometry.boundingSphere === null ) { + + geometry.computeBoundingSphere(); + + } + + this.boundingSphere.makeEmpty(); + + for ( let i = 0; i < count; i ++ ) { + + this.getMatrixAt( i, _instanceLocalMatrix ); + + _sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix ); + + this.boundingSphere.union( _sphere$4 ); + + } + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.instanceMatrix.copy( source.instanceMatrix ); + + if ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone(); + if ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone(); + + this.count = source.count; + + if ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone(); + if ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone(); + + return this; + + } + + /** + * Gets the color of the defined instance. + * + * @param {number} index - The instance index. + * @param {Color} color - The target object that is used to store the method's result. + */ + getColorAt( index, color ) { + + color.fromArray( this.instanceColor.array, index * 3 ); + + } + + /** + * Gets the local transformation matrix of the defined instance. + * + * @param {number} index - The instance index. + * @param {Matrix4} matrix - The target object that is used to store the method's result. + */ + getMatrixAt( index, matrix ) { + + matrix.fromArray( this.instanceMatrix.array, index * 16 ); + + } + + /** + * Gets the morph target weights of the defined instance. + * + * @param {number} index - The instance index. + * @param {Mesh} object - The target object that is used to store the method's result. + */ + getMorphAt( index, object ) { + + const objectInfluences = object.morphTargetInfluences; + + const array = this.morphTexture.source.data.data; + + const len = objectInfluences.length + 1; // All influences + the baseInfluenceSum + + const dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning + + for ( let i = 0; i < objectInfluences.length; i ++ ) { + + objectInfluences[ i ] = array[ dataIndex + i ]; + + } + + } + + raycast( raycaster, intersects ) { + + const matrixWorld = this.matrixWorld; + const raycastTimes = this.count; + + _mesh$1.geometry = this.geometry; + _mesh$1.material = this.material; + + if ( _mesh$1.material === undefined ) return; + + // test with bounding sphere first + + if ( this.boundingSphere === null ) this.computeBoundingSphere(); + + _sphere$4.copy( this.boundingSphere ); + _sphere$4.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return; + + // now test each instance + + for ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) { + + // calculate the world matrix for each instance + + this.getMatrixAt( instanceId, _instanceLocalMatrix ); + + _instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix ); + + // the mesh represents this single instance + + _mesh$1.matrixWorld = _instanceWorldMatrix; + + _mesh$1.raycast( raycaster, _instanceIntersects ); + + // process the result of raycast + + for ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) { + + const intersect = _instanceIntersects[ i ]; + intersect.instanceId = instanceId; + intersect.object = this; + intersects.push( intersect ); + + } + + _instanceIntersects.length = 0; + + } + + } + + /** + * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of + * {@link InstancedMesh#instanceColor} to `true` after updating all the colors. + * + * @param {number} index - The instance index. + * @param {Color} color - The instance color. + */ + setColorAt( index, color ) { + + if ( this.instanceColor === null ) { + + this.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 ); + + } + + color.toArray( this.instanceColor.array, index * 3 ); + + } + + /** + * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of + * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors. + * + * @param {number} index - The instance index. + * @param {Matrix4} matrix - The the local transformation. + */ + setMatrixAt( index, matrix ) { + + matrix.toArray( this.instanceMatrix.array, index * 16 ); + + } + + /** + * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of + * {@link InstancedMesh#morphTexture} to `true` after updating all the influences. + * + * @param {number} index - The instance index. + * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights + * of a single instance. + */ + setMorphAt( index, object ) { + + const objectInfluences = object.morphTargetInfluences; + + const len = objectInfluences.length + 1; // morphBaseInfluence + all influences + + if ( this.morphTexture === null ) { + + this.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType ); + + } + + const array = this.morphTexture.source.data.data; + + let morphInfluencesSum = 0; + + for ( let i = 0; i < objectInfluences.length; i ++ ) { + + morphInfluencesSum += objectInfluences[ i ]; + + } + + const morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + + const dataIndex = len * index; + + array[ dataIndex ] = morphBaseInfluence; + + array.set( objectInfluences, dataIndex + 1 ); + + } + + updateMorphTargets() { + + } + + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + + this.dispatchEvent( { type: 'dispose' } ); + + if ( this.morphTexture !== null ) { + + this.morphTexture.dispose(); + this.morphTexture = null; + + } + + } + +} + +const _vector1 = /*@__PURE__*/ new Vector3(); +const _vector2 = /*@__PURE__*/ new Vector3(); +const _normalMatrix = /*@__PURE__*/ new Matrix3(); + +/** + * A two dimensional surface that extends infinitely in 3D space, represented + * in [Hessian normal form]{@link http://mathworld.wolfram.com/HessianNormalForm.html} + * by a unit length normal vector and a constant. + */ +class Plane { + + /** + * Constructs a new plane. + * + * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane. + * @param {number} [constant=0] - The signed distance from the origin to the plane. + */ + constructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isPlane = true; + + /** + * A unit length vector defining the normal of the plane. + * + * @type {Vector3} + */ + this.normal = normal; + + /** + * The signed distance from the origin to the plane. + * + * @type {number} + * @default 0 + */ + this.constant = constant; + + } + + /** + * Sets the plane components by copying the given values. + * + * @param {Vector3} normal - The normal. + * @param {number} constant - The constant. + * @return {Plane} A reference to this plane. + */ + set( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + } + + /** + * Sets the plane components by defining `x`, `y`, `z` as the + * plane normal and `w` as the constant. + * + * @param {number} x - The value for the normal's x component. + * @param {number} y - The value for the normal's y component. + * @param {number} z - The value for the normal's z component. + * @param {number} w - The constant value. + * @return {Plane} A reference to this plane. + */ + setComponents( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + } + + /** + * Sets the plane from the given normal and coplanar point (that is a point + * that lies onto the plane). + * + * @param {Vector3} normal - The normal. + * @param {Vector3} point - A coplanar point. + * @return {Plane} A reference to this plane. + */ + setFromNormalAndCoplanarPoint( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); + + return this; + + } + + /** + * Sets the plane from three coplanar points. The winding order is + * assumed to be counter-clockwise, and determines the direction of + * the plane normal. + * + * @param {Vector3} a - The first coplanar point. + * @param {Vector3} b - The second coplanar point. + * @param {Vector3} c - The third coplanar point. + * @return {Plane} A reference to this plane. + */ + setFromCoplanarPoints( a, b, c ) { + + const normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + } + + /** + * Copies the values of the given plane to this instance. + * + * @param {Plane} plane - The plane to copy. + * @return {Plane} A reference to this plane. + */ + copy( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + } + + /** + * Normalizes the plane normal and adjusts the constant accordingly. + * + * @return {Plane} A reference to this plane. + */ + normalize() { + + // Note: will lead to a divide by zero if the plane is invalid. + + const inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + } + + /** + * Negates both the plane normal and the constant. + * + * @return {Plane} A reference to this plane. + */ + negate() { + + this.constant *= -1; + this.normal.negate(); + + return this; + + } + + /** + * Returns the signed distance from the given point to this plane. + * + * @param {Vector3} point - The point to compute the distance for. + * @return {number} The signed distance. + */ + distanceToPoint( point ) { + + return this.normal.dot( point ) + this.constant; + + } + + /** + * Returns the signed distance from the given sphere to this plane. + * + * @param {Sphere} sphere - The sphere to compute the distance for. + * @return {number} The signed distance. + */ + distanceToSphere( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + } + + /** + * Projects a the given point onto the plane. + * + * @param {Vector3} point - The point to project. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The projected point on the plane. + */ + projectPoint( point, target ) { + + return target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) ); + + } + + /** + * Returns the intersection point of the passed line and the plane. Returns + * `null` if the line does not intersect. Returns the line's starting point if + * the line is coplanar with the plane. + * + * @param {Line3} line - The line to compute the intersection for. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectLine( line, target ) { + + const direction = line.delta( _vector1 ); + + const denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return target.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return null; + + } + + const t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return null; + + } + + return target.copy( line.start ).addScaledVector( direction, t ); + + } + + /** + * Returns `true` if the given line segment intersects with (passes through) the plane. + * + * @param {Line3} line - The line to test. + * @return {boolean} Whether the given line segment intersects with the plane or not. + */ + intersectsLine( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + const startSign = this.distanceToPoint( line.start ); + const endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + } + + /** + * Returns `true` if the given bounding box intersects with the plane. + * + * @param {Box3} box - The bounding box to test. + * @return {boolean} Whether the given bounding box intersects with the plane or not. + */ + intersectsBox( box ) { + + return box.intersectsPlane( this ); + + } + + /** + * Returns `true` if the given bounding sphere intersects with the plane. + * + * @param {Sphere} sphere - The bounding sphere to test. + * @return {boolean} Whether the given bounding sphere intersects with the plane or not. + */ + intersectsSphere( sphere ) { + + return sphere.intersectsPlane( this ); + + } + + /** + * Returns a coplanar vector to the plane, by calculating the + * projection of the normal at the origin onto the plane. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The coplanar point. + */ + coplanarPoint( target ) { + + return target.copy( this.normal ).multiplyScalar( - this.constant ); + + } + + /** + * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform. + * + * The optional normal matrix can be pre-computed like so: + * ```js + * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); + * ``` + * + * @param {Matrix4} matrix - The transformation matrix. + * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix. + * @return {Plane} A reference to this plane. + */ + applyMatrix4( matrix, optionalNormalMatrix ) { + + const normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix ); + + const referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix ); + + const normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + this.constant = - referencePoint.dot( normal ); + + return this; + + } + + /** + * Translates the plane by the distance defined by the given offset vector. + * Note that this only affects the plane constant and will not affect the normal vector. + * + * @param {Vector3} offset - The offset vector. + * @return {Plane} A reference to this plane. + */ + translate( offset ) { + + this.constant -= offset.dot( this.normal ); + + return this; + + } + + /** + * Returns `true` if this plane is equal with the given one. + * + * @param {Plane} plane - The plane to test for equality. + * @return {boolean} Whether this plane is equal with the given one. + */ + equals( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + /** + * Returns a new plane with copied values from this instance. + * + * @return {Plane} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + +} + +const _sphere$3 = /*@__PURE__*/ new Sphere(); +const _vector$6 = /*@__PURE__*/ new Vector3(); + +/** + * Frustums are used to determine what is inside the camera's field of view. + * They help speed up the rendering process - objects which lie outside a camera's + * frustum can safely be excluded from rendering. + * + * This class is mainly intended for use internally by a renderer. + */ +class Frustum { + + /** + * Constructs a new frustum. + * + * @param {Plane} [p0] - The first plane that encloses the frustum. + * @param {Plane} [p1] - The second plane that encloses the frustum. + * @param {Plane} [p2] - The third plane that encloses the frustum. + * @param {Plane} [p3] - The fourth plane that encloses the frustum. + * @param {Plane} [p4] - The fifth plane that encloses the frustum. + * @param {Plane} [p5] - The sixth plane that encloses the frustum. + */ + constructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) { + + /** + * This array holds the planes that enclose the frustum. + * + * @type {Array} + */ + this.planes = [ p0, p1, p2, p3, p4, p5 ]; + + } + + /** + * Sets the frustum planes by copying the given planes. + * + * @param {Plane} [p0] - The first plane that encloses the frustum. + * @param {Plane} [p1] - The second plane that encloses the frustum. + * @param {Plane} [p2] - The third plane that encloses the frustum. + * @param {Plane} [p3] - The fourth plane that encloses the frustum. + * @param {Plane} [p4] - The fifth plane that encloses the frustum. + * @param {Plane} [p5] - The sixth plane that encloses the frustum. + * @return {Frustum} A reference to this frustum. + */ + set( p0, p1, p2, p3, p4, p5 ) { + + const planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + } + + /** + * Copies the values of the given frustum to this instance. + * + * @param {Frustum} frustum - The frustum to copy. + * @return {Frustum} A reference to this frustum. + */ + copy( frustum ) { + + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + } + + /** + * Sets the frustum planes from the given projection matrix. + * + * @param {Matrix4} m - The projection matrix. + * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system. + * @return {Frustum} A reference to this frustum. + */ + setFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem ) { + + const planes = this.planes; + const me = m.elements; + const me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + const me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + const me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + const me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + + if ( coordinateSystem === WebGLCoordinateSystem ) { + + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + } else if ( coordinateSystem === WebGPUCoordinateSystem ) { + + planes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); + + } else { + + throw new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem ); + + } + + return this; + + } + + /** + * Returns `true` if the 3D object's bounding sphere is intersecting this frustum. + * + * Note that the 3D object must have a geometry so that the bounding sphere can be calculated. + * + * @param {Object3D} object - The 3D object to test. + * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not. + */ + intersectsObject( object ) { + + if ( object.boundingSphere !== undefined ) { + + if ( object.boundingSphere === null ) object.computeBoundingSphere(); + + _sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld ); + + } else { + + const geometry = object.geometry; + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld ); + + } + + return this.intersectsSphere( _sphere$3 ); + + } + + /** + * Returns `true` if the given sprite is intersecting this frustum. + * + * @param {Sprite} sprite - The sprite to test. + * @return {boolean} Whether the sprite is intersecting this frustum or not. + */ + intersectsSprite( sprite ) { + + _sphere$3.center.set( 0, 0, 0 ); + _sphere$3.radius = 0.7071067811865476; + _sphere$3.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( _sphere$3 ); + + } + + /** + * Returns `true` if the given bounding sphere is intersecting this frustum. + * + * @param {Sphere} sphere - The bounding sphere to test. + * @return {boolean} Whether the bounding sphere is intersecting this frustum or not. + */ + intersectsSphere( sphere ) { + + const planes = this.planes; + const center = sphere.center; + const negRadius = - sphere.radius; + + for ( let i = 0; i < 6; i ++ ) { + + const distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + } + + /** + * Returns `true` if the given bounding box is intersecting this frustum. + * + * @param {Box3} box - The bounding box to test. + * @return {boolean} Whether the bounding box is intersecting this frustum or not. + */ + intersectsBox( box ) { + + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + const plane = planes[ i ]; + + // corner at max distance + + _vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x; + _vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y; + _vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + if ( plane.distanceToPoint( _vector$6 ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + /** + * Returns `true` if the given point lies within the frustum. + * + * @param {Vector3} point - The point to test. + * @return {boolean} Whether the point lies within this frustum or not. + */ + containsPoint( point ) { + + const planes = this.planes; + + for ( let i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + /** + * Returns a new frustum with copied values from this instance. + * + * @return {Frustum} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + +} + +class LineBasicMaterial extends Material$1 { + + constructor( parameters ) { + + super(); + + this.isLineBasicMaterial = true; + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.fog = true; + + this.setValues( parameters ); + + } + + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + this.fog = source.fog; + + return this; + + } + +} + +const _vStart = /*@__PURE__*/ new Vector3(); +const _vEnd = /*@__PURE__*/ new Vector3(); + +const _inverseMatrix$1 = /*@__PURE__*/ new Matrix4(); +const _ray$1 = /*@__PURE__*/ new Ray(); +const _sphere$1 = /*@__PURE__*/ new Sphere(); + +const _intersectPointOnRay = /*@__PURE__*/ new Vector3(); +const _intersectPointOnSegment = /*@__PURE__*/ new Vector3(); + +/** + * A continuous line. The line are rendered by connecting consecutive + * vertices with straight lines. + * + * ```js + * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } ); + * + * const points = []; + * points.push( new THREE.Vector3( - 10, 0, 0 ) ); + * points.push( new THREE.Vector3( 0, 10, 0 ) ); + * points.push( new THREE.Vector3( 10, 0, 0 ) ); + * + * const geometry = new THREE.BufferGeometry().setFromPoints( points ); + * + * const line = new THREE.Line( geometry, material ); + * scene.add( line ); + * ``` + * + * @augments Object3D + */ +class Line extends Object3D { + + /** + * Constructs a new line. + * + * @param {BufferGeometry} [geometry] - The line geometry. + * @param {Material|Array} [material] - The line material. + */ + constructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isLine = true; + + this.type = 'Line'; + + /** + * The line geometry. + * + * @type {BufferGeometry} + */ + this.geometry = geometry; + + /** + * The line material. + * + * @type {Material|Array} + * @default LineBasicMaterial + */ + this.material = material; + + /** + * A dictionary representing the morph targets in the geometry. The key is the + * morph targets name, the value its attribute index. This member is `undefined` + * by default and only set when morph targets are detected in the geometry. + * + * @type {Object|undefined} + * @default undefined + */ + this.morphTargetDictionary = undefined; + + /** + * An array of weights typically in the range `[0,1]` that specify how much of the morph + * is applied. This member is `undefined` by default and only set when morph targets are + * detected in the geometry. + * + * @type {Array|undefined} + * @default undefined + */ + this.morphTargetInfluences = undefined; + + this.updateMorphTargets(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.material = Array.isArray( source.material ) ? source.material.slice() : source.material; + this.geometry = source.geometry; + + return this; + + } + + /** + * Computes an array of distance values which are necessary for rendering dashed lines. + * For each vertex in the geometry, the method calculates the cumulative length from the + * current point to the very beginning of the line. + * + * @return {Line} A reference to this line. + */ + computeLineDistances() { + + const geometry = this.geometry; + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + const positionAttribute = geometry.attributes.position; + const lineDistances = [ 0 ]; + + for ( let i = 1, l = positionAttribute.count; i < l; i ++ ) { + + _vStart.fromBufferAttribute( positionAttribute, i - 1 ); + _vEnd.fromBufferAttribute( positionAttribute, i ); + + lineDistances[ i ] = lineDistances[ i - 1 ]; + lineDistances[ i ] += _vStart.distanceTo( _vEnd ); + + } + + geometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + return this; + + } + + /** + * Computes intersection points between a casted ray and this line. + * + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - The target array that holds the intersection points. + */ + raycast( raycaster, intersects ) { + + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Line.threshold; + const drawRange = geometry.drawRange; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere$1.copy( geometry.boundingSphere ); + _sphere$1.applyMatrix4( matrixWorld ); + _sphere$1.radius += threshold; + + if ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return; + + // + + _inverseMatrix$1.copy( matrixWorld ).invert(); + _ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 ); + + const localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + const localThresholdSq = localThreshold * localThreshold; + + const step = this.isLineSegments ? 2 : 1; + + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + + if ( index !== null ) { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, l = end - 1; i < l; i += step ) { + + const a = index.getX( i ); + const b = index.getX( i + 1 ); + + const intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i ); + + if ( intersect ) { + + intersects.push( intersect ); + + } + + } + + if ( this.isLineLoop ) { + + const a = index.getX( end - 1 ); + const b = index.getX( start ); + + const intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 ); + + if ( intersect ) { + + intersects.push( intersect ); + + } + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, l = end - 1; i < l; i += step ) { + + const intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i ); + + if ( intersect ) { + + intersects.push( intersect ); + + } + + } + + if ( this.isLineLoop ) { + + const intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 ); + + if ( intersect ) { + + intersects.push( intersect ); + + } + + } + + } + + } + + /** + * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences} + * to make sure existing morph targets can influence this 3D object. + */ + updateMorphTargets() { + + const geometry = this.geometry; + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } + +} + +function checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) { + + const positionAttribute = object.geometry.attributes.position; + + _vStart.fromBufferAttribute( positionAttribute, a ); + _vEnd.fromBufferAttribute( positionAttribute, b ); + + const distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment ); + + if ( distSq > thresholdSq ) return; + + _intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation + + const distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + return { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ), + index: i, + face: null, + faceIndex: null, + barycoord: null, + object: object + + }; + +} + +const _start = /*@__PURE__*/ new Vector3(); +const _end = /*@__PURE__*/ new Vector3(); + +/** + * A series of lines drawn between pairs of vertices. + * + * @augments Line + */ +class LineSegments extends Line { + + /** + * Constructs a new line segments. + * + * @param {BufferGeometry} [geometry] - The line geometry. + * @param {Material|Array} [material] - The line material. + */ + constructor( geometry, material ) { + + super( geometry, material ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isLineSegments = true; + + this.type = 'LineSegments'; + + } + + computeLineDistances() { + + const geometry = this.geometry; + + // we assume non-indexed geometry + + if ( geometry.index === null ) { + + const positionAttribute = geometry.attributes.position; + const lineDistances = []; + + for ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) { + + _start.fromBufferAttribute( positionAttribute, i ); + _end.fromBufferAttribute( positionAttribute, i + 1 ); + + lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ]; + lineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end ); + + } + + geometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) ); + + } else { + + console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); + + } + + return this; + + } + +} + +/** + * A continuous line. This is nearly the same as {@link Line} the only difference + * is that the last vertex is connected with the first vertex in order to close + * the line to form a loop. + * + * @augments Line + */ +class LineLoop extends Line { + + /** + * Constructs a new line loop. + * + * @param {BufferGeometry} [geometry] - The line geometry. + * @param {Material|Array} [material] - The line material. + */ + constructor( geometry, material ) { + + super( geometry, material ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isLineLoop = true; + + this.type = 'LineLoop'; + + } + +} + +class PointsMaterial extends Material$1 { + + constructor( parameters ) { + + super(); + + this.isPointsMaterial = true; + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.alphaMap = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + this.fog = source.fog; + + return this; + + } + +} + +const _inverseMatrix = /*@__PURE__*/ new Matrix4(); +const _ray = /*@__PURE__*/ new Ray(); +const _sphere = /*@__PURE__*/ new Sphere(); +const _position$2 = /*@__PURE__*/ new Vector3(); + +/** + * A class for displaying points or point clouds. + * + * @augments Object3D + */ +class Points extends Object3D { + + /** + * Constructs a new point cloud. + * + * @param {BufferGeometry} [geometry] - The points geometry. + * @param {Material|Array} [material] - The points material. + */ + constructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isPoints = true; + + this.type = 'Points'; + + /** + * The points geometry. + * + * @type {BufferGeometry} + */ + this.geometry = geometry; + + /** + * The line material. + * + * @type {Material|Array} + * @default PointsMaterial + */ + this.material = material; + + /** + * A dictionary representing the morph targets in the geometry. The key is the + * morph targets name, the value its attribute index. This member is `undefined` + * by default and only set when morph targets are detected in the geometry. + * + * @type {Object|undefined} + * @default undefined + */ + this.morphTargetDictionary = undefined; + + /** + * An array of weights typically in the range `[0,1]` that specify how much of the morph + * is applied. This member is `undefined` by default and only set when morph targets are + * detected in the geometry. + * + * @type {Array|undefined} + * @default undefined + */ + this.morphTargetInfluences = undefined; + + this.updateMorphTargets(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.material = Array.isArray( source.material ) ? source.material.slice() : source.material; + this.geometry = source.geometry; + + return this; + + } + + /** + * Computes intersection points between a casted ray and this point cloud. + * + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - The target array that holds the intersection points. + */ + raycast( raycaster, intersects ) { + + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Points.threshold; + const drawRange = geometry.drawRange; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ); + _sphere.applyMatrix4( matrixWorld ); + _sphere.radius += threshold; + + if ( raycaster.ray.intersectsSphere( _sphere ) === false ) return; + + // + + _inverseMatrix.copy( matrixWorld ).invert(); + _ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix ); + + const localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + const localThresholdSq = localThreshold * localThreshold; + + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + + if ( index !== null ) { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( index.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, il = end; i < il; i ++ ) { + + const a = index.getX( i ); + + _position$2.fromBufferAttribute( positionAttribute, a ); + + testPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this ); + + } + + } else { + + const start = Math.max( 0, drawRange.start ); + const end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) ); + + for ( let i = start, l = end; i < l; i ++ ) { + + _position$2.fromBufferAttribute( positionAttribute, i ); + + testPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this ); + + } + + } + + } + + /** + * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences} + * to make sure existing morph targets can influence this 3D object. + */ + updateMorphTargets() { + + const geometry = this.geometry; + + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys( morphAttributes ); + + if ( keys.length > 0 ) { + + const morphAttribute = morphAttributes[ keys[ 0 ] ]; + + if ( morphAttribute !== undefined ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) { + + const name = morphAttribute[ m ].name || String( m ); + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ name ] = m; + + } + + } + + } + + } + +} + +function testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) { + + const rayPointDistanceSq = _ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + const intersectPoint = new Vector3(); + + _ray.closestPointToPoint( point, intersectPoint ); + intersectPoint.applyMatrix4( matrixWorld ); + + const distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint, + index: index, + face: null, + faceIndex: null, + barycoord: null, + object: object + + } ); + + } + +} + +class VideoTexture extends Texture$1 { + + constructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + super( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.isVideoTexture = true; + + this.minFilter = minFilter !== undefined ? minFilter : LinearFilter; + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + + this.generateMipmaps = false; + + const scope = this; + + function updateVideo() { + + scope.needsUpdate = true; + video.requestVideoFrameCallback( updateVideo ); + + } + + if ( 'requestVideoFrameCallback' in video ) { + + video.requestVideoFrameCallback( updateVideo ); + + } + + } + + clone() { + + return new this.constructor( this.image ).copy( this ); + + } + + update() { + + const video = this.image; + const hasVideoFrameCallback = 'requestVideoFrameCallback' in video; + + if ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) { + + this.needsUpdate = true; + + } + + } + +} + +class CompressedTexture extends Texture$1 { + + constructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) { + + super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ); + + this.isCompressedTexture = true; + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + +} + +class CompressedArrayTexture extends CompressedTexture { + + constructor( mipmaps, width, height, depth, format, type ) { + + super( mipmaps, width, height, format, type ); + + this.isCompressedArrayTexture = true; + this.image.depth = depth; + this.wrapR = ClampToEdgeWrapping; + + this.layerUpdates = new Set(); + + } + + addLayerUpdate( layerIndex ) { + + this.layerUpdates.add( layerIndex ); + + } + + clearLayerUpdates() { + + this.layerUpdates.clear(); + + } + +} + +class CompressedCubeTexture extends CompressedTexture { + + constructor( images, format, type ) { + + super( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping ); + + this.isCompressedCubeTexture = true; + this.isCubeTexture = true; + + this.image = images; + + } + +} + +class CanvasTexture extends Texture$1 { + + constructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + super( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.isCanvasTexture = true; + + this.needsUpdate = true; + + } + +} + +class DepthTexture extends Texture$1 { + + constructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format = DepthFormat ) { + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); + + } + + if ( type === undefined && format === DepthFormat ) type = UnsignedIntType; + if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type; + + super( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.isDepthTexture = true; + + this.image = { width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + this.compareFunction = null; + + } + + + copy( source ) { + + super.copy( source ); + + this.source = new Source( Object.assign( {}, source.image ) ); // see #30540 + this.compareFunction = source.compareFunction; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + if ( this.compareFunction !== null ) data.compareFunction = this.compareFunction; + + return data; + + } + +} + +/** + * An abstract base class for creating an analytic curve object that contains methods + * for interpolation. + * + * @abstract + */ +class Curve { + + /** + * Constructs a new curve. + */ + constructor() { + + /** + * The type property is used for detecting the object type + * in context of serialization/deserialization. + * + * @type {string} + * @readonly + */ + this.type = 'Curve'; + + /** + * This value determines the amount of divisions when calculating the + * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure + * precision when using methods like {@link Curve#getSpacedPoints}, it is + * recommended to increase the value of this property if the curve is very large. + * + * @type {number} + * @default 200 + */ + this.arcLengthDivisions = 200; + + /** + * Must be set to `true` if the curve parameters have changed. + * + * @type {boolean} + * @default false + */ + this.needsUpdate = false; + + /** + * An internal cache that holds precomputed curve length values. + * + * @private + * @type {?Array} + * @default null + */ + this.cacheArcLengths = null; + + } + + /** + * This method returns a vector in 2D or 3D space (depending on the curve definition) + * for the given interpolation factor. + * + * @abstract + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition. + */ + getPoint( /* t, optionalTarget */ ) { + + console.warn( 'THREE.Curve: .getPoint() not implemented.' ); + + } + + /** + * This method returns a vector in 2D or 3D space (depending on the curve definition) + * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length + * of the curve which equidistant samples. + * + * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition. + */ + getPointAt( u, optionalTarget ) { + + const t = this.getUtoTmapping( u ); + return this.getPoint( t, optionalTarget ); + + } + + /** + * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing + * the curve shape. + * + * @param {number} [divisions=5] - The number of divisions. + * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`. + */ + getPoints( divisions = 5 ) { + + const points = []; + + for ( let d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + } + + // Get sequence of points using getPointAt( u ) + + /** + * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing + * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire + * curve. + * + * @param {number} [divisions=5] - The number of divisions. + * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`. + */ + getSpacedPoints( divisions = 5 ) { + + const points = []; + + for ( let d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + } + + /** + * Returns the total arc length of the curve. + * + * @return {number} The length of the curve. + */ + getLength() { + + const lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + } + + /** + * Returns an array of cumulative segment lengths of the curve. + * + * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions. + * @return {Array} An array holding the cumulative segment lengths. + */ + getLengths( divisions = this.arcLengthDivisions ) { + + if ( this.cacheArcLengths && + ( this.cacheArcLengths.length === divisions + 1 ) && + ! this.needsUpdate ) { + + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + const cache = []; + let current, last = this.getPoint( 0 ); + let sum = 0; + + cache.push( 0 ); + + for ( let p = 1; p <= divisions; p ++ ) { + + current = this.getPoint( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum: sum }; Sum is in the last element. + + } + + /** + * Update the cumulative segment distance cache. The method must be called + * every time curve parameters are changed. If an updated curve is part of a + * composed curve like {@link CurvePath}, this method must be called on the + * composed curve, too. + */ + updateArcLengths() { + + this.needsUpdate = true; + this.getLengths(); + + } + + /** + * Given an interpolation factor in the range `[0,1]`, this method returns an updated + * interpolation factor in the same range that can be ued to sample equidistant points + * from a curve. + * + * @param {number} u - The interpolation factor. + * @param {?number} distance - An optional distance on the curve. + * @return {number} The updated interpolation factor. + */ + getUtoTmapping( u, distance = null ) { + + const arcLengths = this.getLengths(); + + let i = 0; + const il = arcLengths.length; + + let targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + // binary search for the index with largest value smaller than target u distance + + let low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + if ( arcLengths[ i ] === targetArcLength ) { + + return i / ( il - 1 ); + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + const lengthBefore = arcLengths[ i ]; + const lengthAfter = arcLengths[ i + 1 ]; + + const segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + const segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + const t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + } + + /** + * Returns a unit vector tangent for the given interpolation factor. + * If the derived curve does not implement its tangent derivation, + * two points a small delta apart will be used to find its gradient + * which seems to give a reasonable approximation. + * + * @param {number} t - The interpolation factor. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {(Vector2|Vector3)} The tangent vector. + */ + getTangent( t, optionalTarget ) { + + const delta = 0.0001; + let t1 = t - delta; + let t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + const pt1 = this.getPoint( t1 ); + const pt2 = this.getPoint( t2 ); + + const tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() ); + + tangent.copy( pt2 ).sub( pt1 ).normalize(); + + return tangent; + + } + + /** + * Same as {@link Curve#getTangent} but with equidistant samples. + * + * @param {number} u - The interpolation factor. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {(Vector2|Vector3)} The tangent vector. + * @see {@link Curve#getPointAt} + */ + getTangentAt( u, optionalTarget ) { + + const t = this.getUtoTmapping( u ); + return this.getTangent( t, optionalTarget ); + + } + + /** + * Generates the Frenet Frames. Requires a curve definition in 3D space. Used + * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}. + * + * @param {number} segments - The number of segments. + * @param {boolean} [closed=false] - Whether the curve is closed or not. + * @return {{tangents: Array, normals: Array, binormals: Array}} The Frenet Frames. + */ + computeFrenetFrames( segments, closed = false ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + const normal = new Vector3(); + + const tangents = []; + const normals = []; + const binormals = []; + + const vec = new Vector3(); + const mat = new Matrix4(); + + // compute the tangent vectors for each segment on the curve + + for ( let i = 0; i <= segments; i ++ ) { + + const u = i / segments; + + tangents[ i ] = this.getTangentAt( u, new Vector3() ); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + let min = Number.MAX_VALUE; + const tx = Math.abs( tangents[ 0 ].x ); + const ty = Math.abs( tangents[ 0 ].y ); + const tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( let i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + const theta = Math.acos( clamp$1( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + let theta = Math.acos( clamp$1( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( let i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + } + + /** + * Returns a new curve with copied values from this instance. + * + * @return {Curve} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + + /** + * Copies the values of the given curve to this instance. + * + * @param {Curve} source - The curve to copy. + * @return {Curve} A reference to this curve. + */ + copy( source ) { + + this.arcLengthDivisions = source.arcLengthDivisions; + + return this; + + } + + /** + * Serializes the curve into JSON. + * + * @return {Object} A JSON object representing the serialized curve. + * @see {@link ObjectLoader#parse} + */ + toJSON() { + + const data = { + metadata: { + version: 4.6, + type: 'Curve', + generator: 'Curve.toJSON' + } + }; + + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + + return data; + + } + + /** + * Deserializes the curve from the given JSON. + * + * @param {Object} json - The JSON holding the serialized curve. + * @return {Curve} A reference to this curve. + */ + fromJSON( json ) { + + this.arcLengthDivisions = json.arcLengthDivisions; + + return this; + + } + +} + +/** + * A curve representing an ellipse. + * + * ```js + * const curve = new THREE.EllipseCurve( + * 0, 0, + * 10, 10, + * 0, 2 * Math.PI, + * false, + * 0 + * ); + * + * const points = curve.getPoints( 50 ); + * const geometry = new THREE.BufferGeometry().setFromPoints( points ); + * + * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } ); + * + * // Create the final object to add to the scene + * const ellipse = new THREE.Line( geometry, material ); + * ``` + * + * @augments Curve + */ +class EllipseCurve extends Curve { + + /** + * Constructs a new ellipse curve. + * + * @param {number} [aX=0] - The X center of the ellipse. + * @param {number} [aY=0] - The Y center of the ellipse. + * @param {number} [xRadius=1] - The radius of the ellipse in the x direction. + * @param {number} [yRadius=1] - The radius of the ellipse in the y direction. + * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis. + * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis. + * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not. + * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis. + */ + constructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isEllipseCurve = true; + + this.type = 'EllipseCurve'; + + /** + * The X center of the ellipse. + * + * @type {number} + * @default 0 + */ + this.aX = aX; + + /** + * The Y center of the ellipse. + * + * @type {number} + * @default 0 + */ + this.aY = aY; + + /** + * The radius of the ellipse in the x direction. + * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle. + * + * @type {number} + * @default 1 + */ + this.xRadius = xRadius; + + /** + * The radius of the ellipse in the y direction. + * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle. + * + * @type {number} + * @default 1 + */ + this.yRadius = yRadius; + + /** + * The start angle of the curve in radians starting from the positive X axis. + * + * @type {number} + * @default 0 + */ + this.aStartAngle = aStartAngle; + + /** + * The end angle of the curve in radians starting from the positive X axis. + * + * @type {number} + * @default Math.PI*2 + */ + this.aEndAngle = aEndAngle; + + /** + * Whether the ellipse is drawn clockwise or not. + * + * @type {boolean} + * @default false + */ + this.aClockwise = aClockwise; + + /** + * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis. + * + * @type {number} + * @default 0 + */ + this.aRotation = aRotation; + + } + + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the curve. + */ + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const twoPi = Math.PI * 2; + let deltaAngle = this.aEndAngle - this.aStartAngle; + const samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + const angle = this.aStartAngle + t * deltaAngle; + let x = this.aX + this.xRadius * Math.cos( angle ); + let y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + const cos = Math.cos( this.aRotation ); + const sin = Math.sin( this.aRotation ); + + const tx = x - this.aX; + const ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return point.set( x, y ); + + } + + copy( source ) { + + super.copy( source ); + + this.aX = source.aX; + this.aY = source.aY; + + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + + this.aClockwise = source.aClockwise; + + this.aRotation = source.aRotation; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.aX = this.aX; + data.aY = this.aY; + + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + + data.aClockwise = this.aClockwise; + + data.aRotation = this.aRotation; + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.aX = json.aX; + this.aY = json.aY; + + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + + this.aClockwise = json.aClockwise; + + this.aRotation = json.aRotation; + + return this; + + } + +} + +/** + * A curve representing an arc. + * + * @augments EllipseCurve + */ +class ArcCurve extends EllipseCurve { + + /** + * Constructs a new arc curve. + * + * @param {number} [aX=0] - The X center of the ellipse. + * @param {number} [aY=0] - The Y center of the ellipse. + * @param {number} [aRadius=1] - The radius of the ellipse in the x direction. + * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis. + * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis. + * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not. + */ + constructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + super( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isArcCurve = true; + + this.type = 'ArcCurve'; + + } + +} + +function CubicPoly() { + + /** + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + let c0 = 0, c1 = 0, c2 = 0, c3 = 0; + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init( x0, x1, t0, t1 ) { + + c0 = x0; + c1 = t0; + c2 = -3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + + } + + return { + + initCatmullRom: function ( x0, x1, x2, x3, tension ) { + + init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }, + + initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + let t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + let t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + init( x1, x2, t1, t2 ); + + }, + + calc: function ( t ) { + + const t2 = t * t; + const t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + + } + + }; + +} + +// + +const tmp = /*@__PURE__*/ new Vector3(); +const px = /*@__PURE__*/ new CubicPoly(); +const py = /*@__PURE__*/ new CubicPoly(); +const pz = /*@__PURE__*/ new CubicPoly(); + +/** + * A curve representing a Catmull-Rom spline. + * + * ```js + * //Create a closed wavey loop + * const curve = new THREE.CatmullRomCurve3( [ + * new THREE.Vector3( -10, 0, 10 ), + * new THREE.Vector3( -5, 5, 5 ), + * new THREE.Vector3( 0, 0, 0 ), + * new THREE.Vector3( 5, -5, 5 ), + * new THREE.Vector3( 10, 0, 10 ) + * ] ); + * + * const points = curve.getPoints( 50 ); + * const geometry = new THREE.BufferGeometry().setFromPoints( points ); + * + * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } ); + * + * // Create the final object to add to the scene + * const curveObject = new THREE.Line( geometry, material ); + * ``` + * + * @augments Curve + */ +class CatmullRomCurve3 extends Curve { + + /** + * Constructs a new Catmull-Rom curve. + * + * @param {Array} [points] - An array of 3D points defining the curve. + * @param {boolean} [closed=false] - Whether the curve is closed or not. + * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type. + * @param {number} [tension=0.5] - Tension of the curve. + */ + constructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isCatmullRomCurve3 = true; + + this.type = 'CatmullRomCurve3'; + + /** + * An array of 3D points defining the curve. + * + * @type {Array} + */ + this.points = points; + + /** + * Whether the curve is closed or not. + * + * @type {boolean} + * @default false + */ + this.closed = closed; + + /** + * The curve type. + * + * @type {('centripetal'|'chordal'|'catmullrom')} + * @default 'centripetal' + */ + this.curveType = curveType; + + /** + * Tension of the curve. + * + * @type {number} + * @default 0.5 + */ + this.tension = tension; + + } + + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector3} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector3} The position on the curve. + */ + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const points = this.points; + const l = points.length; + + const p = ( l - ( this.closed ? 0 : 1 ) ) * t; + let intPoint = Math.floor( p ); + let weight = p - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + let p0, p3; // 4 points (p1 & p2 defined below) + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + const p1 = points[ intPoint % l ]; + const p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + const pow = this.curveType === 'chordal' ? 0.5 : 0.25; + let dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + let dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + let dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.curveType === 'catmullrom' ) { + + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension ); + + } + + point.set( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.points = []; + + for ( let i = 0, l = source.points.length; i < l; i ++ ) { + + const point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.points = []; + + for ( let i = 0, l = this.points.length; i < l; i ++ ) { + + const point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.points = []; + + for ( let i = 0, l = json.points.length; i < l; i ++ ) { + + const point = json.points[ i ]; + this.points.push( new Vector3().fromArray( point ) ); + + } + + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + + return this; + + } + +} + +// Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve + +/** + * Computes a point on a Catmull-Rom spline. + * + * @param {number} t - The interpolation factor. + * @param {number} p0 - The first control point. + * @param {number} p1 - The second control point. + * @param {number} p2 - The third control point. + * @param {number} p3 - The fourth control point. + * @return {number} The calculated point on a Catmull-Rom spline. + */ +function CatmullRom( t, p0, p1, p2, p3 ) { + + const v0 = ( p2 - p0 ) * 0.5; + const v1 = ( p3 - p1 ) * 0.5; + const t2 = t * t; + const t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + +} + +// + +function QuadraticBezierP0( t, p ) { + + const k = 1 - t; + return k * k * p; + +} + +function QuadraticBezierP1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + +} + +function QuadraticBezierP2( t, p ) { + + return t * t * p; + +} + +/** + * Computes a point on a Quadratic Bezier curve. + * + * @param {number} t - The interpolation factor. + * @param {number} p0 - The first control point. + * @param {number} p1 - The second control point. + * @param {number} p2 - The third control point. + * @return {number} The calculated point on a Quadratic Bezier curve. + */ +function QuadraticBezier( t, p0, p1, p2 ) { + + return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) + + QuadraticBezierP2( t, p2 ); + +} + +// + +function CubicBezierP0( t, p ) { + + const k = 1 - t; + return k * k * k * p; + +} + +function CubicBezierP1( t, p ) { + + const k = 1 - t; + return 3 * k * k * t * p; + +} + +function CubicBezierP2( t, p ) { + + return 3 * ( 1 - t ) * t * t * p; + +} + +function CubicBezierP3( t, p ) { + + return t * t * t * p; + +} + +/** + * Computes a point on a Cubic Bezier curve. + * + * @param {number} t - The interpolation factor. + * @param {number} p0 - The first control point. + * @param {number} p1 - The second control point. + * @param {number} p2 - The third control point. + * @param {number} p3 - The fourth control point. + * @return {number} The calculated point on a Cubic Bezier curve. + */ +function CubicBezier( t, p0, p1, p2, p3 ) { + + return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) + + CubicBezierP3( t, p3 ); + +} + +/** + * A curve representing a 2D Cubic Bezier curve. + * + * ```js + * const curve = new THREE.CubicBezierCurve( + * new THREE.Vector2( - 0, 0 ), + * new THREE.Vector2( - 5, 15 ), + * new THREE.Vector2( 20, 15 ), + * new THREE.Vector2( 10, 0 ) + * ); + * + * const points = curve.getPoints( 50 ); + * const geometry = new THREE.BufferGeometry().setFromPoints( points ); + * + * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } ); + * + * // Create the final object to add to the scene + * const curveObject = new THREE.Line( geometry, material ); + * ``` + * + * @augments Curve + */ +class CubicBezierCurve extends Curve { + + /** + * Constructs a new Cubic Bezier curve. + * + * @param {Vector2} [v0] - The start point. + * @param {Vector2} [v1] - The first control point. + * @param {Vector2} [v2] - The second control point. + * @param {Vector2} [v3] - The end point. + */ + constructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isCubicBezierCurve = true; + + this.type = 'CubicBezierCurve'; + + /** + * The start point. + * + * @type {Vector2} + */ + this.v0 = v0; + + /** + * The first control point. + * + * @type {Vector2} + */ + this.v1 = v1; + + /** + * The second control point. + * + * @type {Vector2} + */ + this.v2 = v2; + + /** + * The end point. + * + * @type {Vector2} + */ + this.v3 = v3; + + } + + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the curve. + */ + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + } + +} + +/** + * A curve representing a 3D Cubic Bezier curve. + * + * @augments Curve + */ +class CubicBezierCurve3 extends Curve { + + /** + * Constructs a new Cubic Bezier curve. + * + * @param {Vector3} [v0] - The start point. + * @param {Vector3} [v1] - The first control point. + * @param {Vector3} [v2] - The second control point. + * @param {Vector3} [v3] - The end point. + */ + constructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isCubicBezierCurve3 = true; + + this.type = 'CubicBezierCurve3'; + + /** + * The start point. + * + * @type {Vector3} + */ + this.v0 = v0; + + /** + * The first control point. + * + * @type {Vector3} + */ + this.v1 = v1; + + /** + * The second control point. + * + * @type {Vector3} + */ + this.v2 = v2; + + /** + * The end point. + * + * @type {Vector3} + */ + this.v3 = v3; + + } + + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector3} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector3} The position on the curve. + */ + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + + point.set( + CubicBezier( t, v0.x, v1.x, v2.x, v3.x ), + CubicBezier( t, v0.y, v1.y, v2.y, v3.y ), + CubicBezier( t, v0.z, v1.z, v2.z, v3.z ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + this.v3.copy( source.v3 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + this.v3.fromArray( json.v3 ); + + return this; + + } + +} + +/** + * A curve representing a 2D line segment. + * + * @augments Curve + */ +class LineCurve extends Curve { + + /** + * Constructs a new line curve. + * + * @param {Vector2} [v1] - The start point. + * @param {Vector2} [v2] - The end point. + */ + constructor( v1 = new Vector2(), v2 = new Vector2() ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isLineCurve = true; + + this.type = 'LineCurve'; + + /** + * The start point. + * + * @type {Vector2} + */ + this.v1 = v1; + + /** + * The end point. + * + * @type {Vector2} + */ + this.v2 = v2; + + } + + /** + * Returns a point on the line. + * + * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the line. + */ + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + } + + // Line curve is linear, so we can overwrite default getPointAt + getPointAt( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + } + + getTangent( t, optionalTarget = new Vector2() ) { + + return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); + + } + + getTangentAt( u, optionalTarget ) { + + return this.getTangent( u, optionalTarget ); + + } + + copy( source ) { + + super.copy( source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +/** + * A curve representing a 3D line segment. + * + * @augments Curve + */ +class LineCurve3 extends Curve { + + /** + * Constructs a new line curve. + * + * @param {Vector3} [v1] - The start point. + * @param {Vector3} [v2] - The end point. + */ + constructor( v1 = new Vector3(), v2 = new Vector3() ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isLineCurve3 = true; + + this.type = 'LineCurve3'; + + /** + * The start point. + * + * @type {Vector3} + */ + this.v1 = v1; + + /** + * The end point. + * + * @type {Vector2} + */ + this.v2 = v2; + + } + + /** + * Returns a point on the line. + * + * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`. + * @param {Vector3} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector3} The position on the line. + */ + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + if ( t === 1 ) { + + point.copy( this.v2 ); + + } else { + + point.copy( this.v2 ).sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + } + + return point; + + } + + // Line curve is linear, so we can overwrite default getPointAt + getPointAt( u, optionalTarget ) { + + return this.getPoint( u, optionalTarget ); + + } + + getTangent( t, optionalTarget = new Vector3() ) { + + return optionalTarget.subVectors( this.v2, this.v1 ).normalize(); + + } + + getTangentAt( u, optionalTarget ) { + + return this.getTangent( u, optionalTarget ); + + } + + copy( source ) { + + super.copy( source ); + + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +/** + * A curve representing a 2D Quadratic Bezier curve. + * + * ```js + * const curve = new THREE.QuadraticBezierCurve( + * new THREE.Vector2( - 10, 0 ), + * new THREE.Vector2( 20, 15 ), + * new THREE.Vector2( 10, 0 ) + * ) + * + * const points = curve.getPoints( 50 ); + * const geometry = new THREE.BufferGeometry().setFromPoints( points ); + * + * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } ); + * + * // Create the final object to add to the scene + * const curveObject = new THREE.Line( geometry, material ); + * ``` + * + * @augments Curve + */ +class QuadraticBezierCurve extends Curve { + + /** + * Constructs a new Quadratic Bezier curve. + * + * @param {Vector2} [v0] - The start point. + * @param {Vector2} [v1] - The control point. + * @param {Vector2} [v2] - The end point. + */ + constructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isQuadraticBezierCurve = true; + + this.type = 'QuadraticBezierCurve'; + + /** + * The start point. + * + * @type {Vector2} + */ + this.v0 = v0; + + /** + * The control point. + * + * @type {Vector2} + */ + this.v1 = v1; + + /** + * The end point. + * + * @type {Vector2} + */ + this.v2 = v2; + + } + + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the curve. + */ + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +/** + * A curve representing a 3D Quadratic Bezier curve. + * + * @augments Curve + */ +class QuadraticBezierCurve3 extends Curve { + + /** + * Constructs a new Quadratic Bezier curve. + * + * @param {Vector3} [v0] - The start point. + * @param {Vector3} [v1] - The control point. + * @param {Vector3} [v2] - The end point. + */ + constructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isQuadraticBezierCurve3 = true; + + this.type = 'QuadraticBezierCurve3'; + + /** + * The start point. + * + * @type {Vector3} + */ + this.v0 = v0; + + /** + * The control point. + * + * @type {Vector3} + */ + this.v1 = v1; + + /** + * The end point. + * + * @type {Vector3} + */ + this.v2 = v2; + + } + + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector3} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector3} The position on the curve. + */ + getPoint( t, optionalTarget = new Vector3() ) { + + const point = optionalTarget; + + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + + point.set( + QuadraticBezier( t, v0.x, v1.x, v2.x ), + QuadraticBezier( t, v0.y, v1.y, v2.y ), + QuadraticBezier( t, v0.z, v1.z, v2.z ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.v0.copy( source.v0 ); + this.v1.copy( source.v1 ); + this.v2.copy( source.v2 ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.v0.fromArray( json.v0 ); + this.v1.fromArray( json.v1 ); + this.v2.fromArray( json.v2 ); + + return this; + + } + +} + +/** + * A curve representing a 2D spline curve. + * + * ```js + * // Create a sine-like wave + * const curve = new THREE.SplineCurve( [ + * new THREE.Vector2( -10, 0 ), + * new THREE.Vector2( -5, 5 ), + * new THREE.Vector2( 0, 0 ), + * new THREE.Vector2( 5, -5 ), + * new THREE.Vector2( 10, 0 ) + * ] ); + * + * const points = curve.getPoints( 50 ); + * const geometry = new THREE.BufferGeometry().setFromPoints( points ); + * + * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } ); + * + * // Create the final object to add to the scene + * const splineObject = new THREE.Line( geometry, material ); + * ``` + * + * @augments Curve + */ +class SplineCurve extends Curve { + + /** + * Constructs a new 2D spline curve. + * + * @param {Array} [points] - An array of 2D points defining the curve. + */ + constructor( points = [] ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isSplineCurve = true; + + this.type = 'SplineCurve'; + + /** + * An array of 2D points defining the curve. + * + * @type {Array} + */ + this.points = points; + + } + + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the curve. + */ + getPoint( t, optionalTarget = new Vector2() ) { + + const point = optionalTarget; + + const points = this.points; + const p = ( points.length - 1 ) * t; + + const intPoint = Math.floor( p ); + const weight = p - intPoint; + + const p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + const p1 = points[ intPoint ]; + const p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + const p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + point.set( + CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ), + CatmullRom( weight, p0.y, p1.y, p2.y, p3.y ) + ); + + return point; + + } + + copy( source ) { + + super.copy( source ); + + this.points = []; + + for ( let i = 0, l = source.points.length; i < l; i ++ ) { + + const point = source.points[ i ]; + + this.points.push( point.clone() ); + + } + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.points = []; + + for ( let i = 0, l = this.points.length; i < l; i ++ ) { + + const point = this.points[ i ]; + data.points.push( point.toArray() ); + + } + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.points = []; + + for ( let i = 0, l = json.points.length; i < l; i ++ ) { + + const point = json.points[ i ]; + this.points.push( new Vector2().fromArray( point ) ); + + } + + return this; + + } + +} + +var Curves = /*#__PURE__*/Object.freeze({ + __proto__: null, + ArcCurve: ArcCurve, + CatmullRomCurve3: CatmullRomCurve3, + CubicBezierCurve: CubicBezierCurve, + CubicBezierCurve3: CubicBezierCurve3, + EllipseCurve: EllipseCurve, + LineCurve: LineCurve, + LineCurve3: LineCurve3, + QuadraticBezierCurve: QuadraticBezierCurve, + QuadraticBezierCurve3: QuadraticBezierCurve3, + SplineCurve: SplineCurve +}); + +/** + * A base class extending {@link Curve}. `CurvePath` is simply an + * array of connected curves, but retains the API of a curve. + * + * @augments Curve + */ +class CurvePath extends Curve { + + /** + * Constructs a new curve path. + */ + constructor() { + + super(); + + this.type = 'CurvePath'; + + /** + * An array of curves defining the + * path. + * + * @type {Array} + */ + this.curves = []; + + /** + * Whether the path should automatically be closed + * by a line curve. + * + * @type {boolean} + * @default false + */ + this.autoClose = false; + + } + + /** + * Adds a curve to this curve path. + * + * @param {Curve} curve - The curve to add. + */ + add( curve ) { + + this.curves.push( curve ); + + } + + /** + * Adds a line curve to close the path. + * + * @return {CurvePath} A reference to this curve path. + */ + closePath() { + + // Add a line curve if start and end of lines are not connected + const startPoint = this.curves[ 0 ].getPoint( 0 ); + const endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + const lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3'; + this.curves.push( new Curves[ lineType ]( endPoint, startPoint ) ); + + } + + return this; + + } + + /** + * This method returns a vector in 2D or 3D space (depending on the curve definitions) + * for the given interpolation factor. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition. + */ + getPoint( t, optionalTarget ) { + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + const d = t * this.getLength(); + const curveLengths = this.getCurveLengths(); + let i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + const diff = curveLengths[ i ] - d; + const curve = this.curves[ i ]; + + const segmentLength = curve.getLength(); + const u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u, optionalTarget ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 } The curve lengths. + */ + getCurveLengths() { + + // Compute lengths and cache them + // We cannot overwrite getLengths() because UtoT mapping uses it. + // We use cache values if curves and cache array are same length + + if ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) { + + return this.cacheLengths; + + } + + // Get length of sub-curve + // Push sums into cached array + + const lengths = []; + let sums = 0; + + for ( let i = 0, l = this.curves.length; i < l; i ++ ) { + + sums += this.curves[ i ].getLength(); + lengths.push( sums ); + + } + + this.cacheLengths = lengths; + + return lengths; + + } + + getSpacedPoints( divisions = 40 ) { + + const points = []; + + for ( let i = 0; i <= divisions; i ++ ) { + + points.push( this.getPoint( i / divisions ) ); + + } + + if ( this.autoClose ) { + + points.push( points[ 0 ] ); + + } + + return points; + + } + + getPoints( divisions = 12 ) { + + const points = []; + let last; + + for ( let i = 0, curves = this.curves; i < curves.length; i ++ ) { + + const curve = curves[ i ]; + const resolution = curve.isEllipseCurve ? divisions * 2 + : ( curve.isLineCurve || curve.isLineCurve3 ) ? 1 + : curve.isSplineCurve ? divisions * curve.points.length + : divisions; + + const pts = curve.getPoints( resolution ); + + for ( let j = 0; j < pts.length; j ++ ) { + + const point = pts[ j ]; + + if ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates + + points.push( point ); + last = point; + + } + + } + + if ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + } + + copy( source ) { + + super.copy( source ); + + this.curves = []; + + for ( let i = 0, l = source.curves.length; i < l; i ++ ) { + + const curve = source.curves[ i ]; + + this.curves.push( curve.clone() ); + + } + + this.autoClose = source.autoClose; + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.autoClose = this.autoClose; + data.curves = []; + + for ( let i = 0, l = this.curves.length; i < l; i ++ ) { + + const curve = this.curves[ i ]; + data.curves.push( curve.toJSON() ); + + } + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.autoClose = json.autoClose; + this.curves = []; + + for ( let i = 0, l = json.curves.length; i < l; i ++ ) { + + const curve = json.curves[ i ]; + this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) ); + + } + + return this; + + } + +} + +/** + * A 2D path representation. The class provides methods for creating paths + * and contours of 2D shapes similar to the 2D Canvas API. + * + * ```js + * const path = new THREE.Path(); + * + * path.lineTo( 0, 0.8 ); + * path.quadraticCurveTo( 0, 1, 0.2, 1 ); + * path.lineTo( 1, 1 ); + * + * const points = path.getPoints(); + * + * const geometry = new THREE.BufferGeometry().setFromPoints( points ); + * const material = new THREE.LineBasicMaterial( { color: 0xffffff } ); + * + * const line = new THREE.Line( geometry, material ); + * scene.add( line ); + * ``` + * + * @augments CurvePath + */ +class Path extends CurvePath { + + /** + * Constructs a new path. + * + * @param {Array} [points] - An array of 2D points defining the path. + */ + constructor( points ) { + + super(); + + this.type = 'Path'; + + /** + * The current offset of the path. Any new curve added will start here. + * + * @type {Vector2} + */ + this.currentPoint = new Vector2(); + + if ( points ) { + + this.setFromPoints( points ); + + } + + } + + /** + * Creates a path from the given list of points. The points are added + * to the path as instances of {@link LineCurve}. + * + * @param {Array} points - An array of 2D points. + * @return {Path} A reference to this path. + */ + setFromPoints( points ) { + + this.moveTo( points[ 0 ].x, points[ 0 ].y ); + + for ( let i = 1, l = points.length; i < l; i ++ ) { + + this.lineTo( points[ i ].x, points[ i ].y ); + + } + + return this; + + } + + /** + * Moves {@link Path#currentPoint} to the given point. + * + * @param {number} x - The x coordinate. + * @param {number} y - The y coordinate. + * @return {Path} A reference to this path. + */ + moveTo( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + return this; + + } + + /** + * Adds an instance of {@link LineCurve} to the path by connecting + * the current point with the given one. + * + * @param {number} x - The x coordinate of the end point. + * @param {number} y - The y coordinate of the end point. + * @return {Path} A reference to this path. + */ + lineTo( x, y ) { + + const curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + return this; + + } + + /** + * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting + * the current point with the given one. + * + * @param {number} aCPx - The x coordinate of the control point. + * @param {number} aCPy - The y coordinate of the control point. + * @param {number} aX - The x coordinate of the end point. + * @param {number} aY - The y coordinate of the end point. + * @return {Path} A reference to this path. + */ + quadraticCurveTo( aCPx, aCPy, aX, aY ) { + + const curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + return this; + + } + + /** + * Adds an instance of {@link CubicBezierCurve} to the path by connecting + * the current point with the given one. + * + * @param {number} aCP1x - The x coordinate of the first control point. + * @param {number} aCP1y - The y coordinate of the first control point. + * @param {number} aCP2x - The x coordinate of the second control point. + * @param {number} aCP2y - The y coordinate of the second control point. + * @param {number} aX - The x coordinate of the end point. + * @param {number} aY - The y coordinate of the end point. + * @return {Path} A reference to this path. + */ + bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + const curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + return this; + + } + + /** + * Adds an instance of {@link SplineCurve} to the path by connecting + * the current point with the given list of points. + * + * @param {Array} pts - An array of points in 2D space. + * @return {Path} A reference to this path. + */ + splineThru( pts ) { + + const npts = [ this.currentPoint.clone() ].concat( pts ); + + const curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + return this; + + } + + /** + * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative + * to the current point. + * + * @param {number} aX - The x coordinate of the center of the arc offsetted from the previous curve. + * @param {number} aY - The y coordinate of the center of the arc offsetted from the previous curve. + * @param {number} aRadius - The radius of the arc. + * @param {number} aStartAngle - The start angle in radians. + * @param {number} aEndAngle - The end angle in radians. + * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not. + * @return {Path} A reference to this path. + */ + arc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + return this; + + } + + /** + * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path. + * + * @param {number} aX - The x coordinate of the center of the arc. + * @param {number} aY - The y coordinate of the center of the arc. + * @param {number} aRadius - The radius of the arc. + * @param {number} aStartAngle - The start angle in radians. + * @param {number} aEndAngle - The end angle in radians. + * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not. + * @return {Path} A reference to this path. + */ + absarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + return this; + + } + + /** + * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative + * to the current point + * + * @param {number} aX - The x coordinate of the center of the ellipse offsetted from the previous curve. + * @param {number} aY - The y coordinate of the center of the ellipse offsetted from the previous curve. + * @param {number} xRadius - The radius of the ellipse in the x axis. + * @param {number} yRadius - The radius of the ellipse in the y axis. + * @param {number} aStartAngle - The start angle in radians. + * @param {number} aEndAngle - The end angle in radians. + * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not. + * @param {boolean} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis. + * @return {Path} A reference to this path. + */ + ellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + return this; + + } + + /** + * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path. + * + * @param {number} aX - The x coordinate of the absolute center of the ellipse. + * @param {number} aY - The y coordinate of the absolute center of the ellipse. + * @param {number} xRadius - The radius of the ellipse in the x axis. + * @param {number} yRadius - The radius of the ellipse in the y axis. + * @param {number} aStartAngle - The start angle in radians. + * @param {number} aEndAngle - The end angle in radians. + * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not. + * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis. + * @return {Path} A reference to this path. + */ + absellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + const curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + const firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + const lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + return this; + + } + + copy( source ) { + + super.copy( source ); + + this.currentPoint.copy( source.currentPoint ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.currentPoint = this.currentPoint.toArray(); + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.currentPoint.fromArray( json.currentPoint ); + + return this; + + } + +} + +/** + * Defines an arbitrary 2d shape plane using paths with optional holes. It + * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get + * points, or to get triangulated faces. + * + * ```js + * const heartShape = new THREE.Shape(); + * + * heartShape.moveTo( 25, 25 ); + * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 ); + * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 ); + * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 ); + * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 ); + * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 ); + * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 ); + * + * const extrudeSettings = { + * depth: 8, + * bevelEnabled: true, + * bevelSegments: 2, + * steps: 2, + * bevelSize: 1, + * bevelThickness: 1 + * }; + * + * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings ); + * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() ); + * ``` + * + * @augments Path + */ +class Shape extends Path { + + /** + * Constructs a new shape. + * + * @param {Array} [points] - An array of 2D points defining the shape. + */ + constructor( points ) { + + super( points ); + + /** + * The UUID of the shape. + * + * @type {string} + * @readonly + */ + this.uuid = generateUUID(); + + this.type = 'Shape'; + + /** + * Defines the holes in the shape. Hole definitions must use the + * opposite winding order (CW/CCW) than the outer shape. + * + * @type {Array} + * @readonly + */ + this.holes = []; + + } + + /** + * Returns an array representing each contour of the holes + * as a list of 2D points. + * + * @param {number} divisions - The fineness of the result. + * @return {Array>} The holes as a series of 2D points. + */ + getPointsHoles( divisions ) { + + const holesPts = []; + + for ( let i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + } + + // get points of shape and holes (keypoints based on segments parameter) + + /** + * Returns an object that holds contour data for the shape and its holes as + * arrays of 2D points. + * + * @param {number} divisions - The fineness of the result. + * @return {{shape:Array,holes:Array>}} An object with contour data. + */ + extractPoints( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + } + + copy( source ) { + + super.copy( source ); + + this.holes = []; + + for ( let i = 0, l = source.holes.length; i < l; i ++ ) { + + const hole = source.holes[ i ]; + + this.holes.push( hole.clone() ); + + } + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + data.uuid = this.uuid; + data.holes = []; + + for ( let i = 0, l = this.holes.length; i < l; i ++ ) { + + const hole = this.holes[ i ]; + data.holes.push( hole.toJSON() ); + + } + + return data; + + } + + fromJSON( json ) { + + super.fromJSON( json ); + + this.uuid = json.uuid; + this.holes = []; + + for ( let i = 0, l = json.holes.length; i < l; i ++ ) { + + const hole = json.holes[ i ]; + this.holes.push( new Path().fromJSON( hole ) ); + + } + + return this; + + } + +} + +/** + * An implementation of the earcut polygon triangulation algorithm. The code + * is a port of [mapbox/earcut]{@link https://github.com/mapbox/earcut mapbox/earcut} (v2.2.4). + * + * @hideconstructor + */ +class Earcut { + + /** + * Triangulates the given shape definition by returning an array of triangles. + * + * @param {Array} data - An array with 2D points. + * @param {Array} holeIndices - An array with indices defining holes. + * @param {number} [dim=2] - The number of coordinates per vertex in the input array. + * @return {Array} An array representing the triangulated faces. Each face is defined by three consecutive numbers + * representing vertex indices. + */ + static triangulate( data, holeIndices, dim = 2 ) { + + const hasHoles = holeIndices && holeIndices.length; + const outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length; + let outerNode = linkedList( data, 0, outerLen, dim, true ); + const triangles = []; + + if ( ! outerNode || outerNode.next === outerNode.prev ) return triangles; + + let minX, minY, maxX, maxY, x, y, invSize; + + if ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim ); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + if ( data.length > 80 * dim ) { + + minX = maxX = data[ 0 ]; + minY = maxY = data[ 1 ]; + + for ( let i = dim; i < outerLen; i += dim ) { + + x = data[ i ]; + y = data[ i + 1 ]; + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + + } + + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + invSize = Math.max( maxX - minX, maxY - minY ); + invSize = invSize !== 0 ? 32767 / invSize : 0; + + } + + earcutLinked( outerNode, triangles, dim, minX, minY, invSize, 0 ); + + return triangles; + + } + +} + +// create a circular doubly linked list from polygon points in the specified winding order +function linkedList( data, start, end, dim, clockwise ) { + + let i, last; + + if ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) { + + for ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } else { + + for ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last ); + + } + + if ( last && equals( last, last.next ) ) { + + removeNode( last ); + last = last.next; + + } + + return last; + +} + +// eliminate colinear or duplicate points +function filterPoints( start, end ) { + + if ( ! start ) return start; + if ( ! end ) end = start; + + let p = start, + again; + do { + + again = false; + + if ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) { + + removeNode( p ); + p = end = p.prev; + if ( p === p.next ) break; + again = true; + + } else { + + p = p.next; + + } + + } while ( again || p !== end ); + + return end; + +} + +// main ear slicing loop which triangulates a polygon (given as a linked list) +function earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) { + + if ( ! ear ) return; + + // interlink polygon nodes in z-order + if ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize ); + + let stop = ear, + prev, next; + + // iterate through ears, slicing them one by one + while ( ear.prev !== ear.next ) { + + prev = ear.prev; + next = ear.next; + + if ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) { + + // cut off the triangle + triangles.push( prev.i / dim | 0 ); + triangles.push( ear.i / dim | 0 ); + triangles.push( next.i / dim | 0 ); + + removeNode( ear ); + + // skipping the next vertex leads to less sliver triangles + ear = next.next; + stop = next.next; + + continue; + + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + if ( ear === stop ) { + + // try filtering points and slicing again + if ( ! pass ) { + + earcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 ); + + // if this didn't work, try curing all small self-intersections locally + + } else if ( pass === 1 ) { + + ear = cureLocalIntersections( filterPoints( ear ), triangles, dim ); + earcutLinked( ear, triangles, dim, minX, minY, invSize, 2 ); + + // as a last resort, try splitting the remaining polygon into two + + } else if ( pass === 2 ) { + + splitEarcut( ear, triangles, dim, minX, minY, invSize ); + + } + + break; + + } + + } + +} + +// check whether a polygon node forms a valid ear with adjacent nodes +function isEar( ear ) { + + const a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + + // triangle bbox; min & max are calculated like this for speed + const x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ), + y0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ), + x1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ), + y1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy ); + + let p = c.next; + while ( p !== a ) { + + if ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && + pointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && + area( p.prev, p, p.next ) >= 0 ) return false; + p = p.next; + + } + + return true; + +} + +function isEarHashed( ear, minX, minY, invSize ) { + + const a = ear.prev, + b = ear, + c = ear.next; + + if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear + + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + + // triangle bbox; min & max are calculated like this for speed + const x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ), + y0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ), + x1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ), + y1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy ); + + // z-order range for the current triangle bbox; + const minZ = zOrder( x0, y0, minX, minY, invSize ), + maxZ = zOrder( x1, y1, minX, minY, invSize ); + + let p = ear.prevZ, + n = ear.nextZ; + + // look for points inside the triangle in both directions + while ( p && p.z >= minZ && n && n.z <= maxZ ) { + + if ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && + pointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false; + p = p.prevZ; + + if ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && + pointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false; + n = n.nextZ; + + } + + // look for remaining points in decreasing z-order + while ( p && p.z >= minZ ) { + + if ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && + pointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false; + p = p.prevZ; + + } + + // look for remaining points in increasing z-order + while ( n && n.z <= maxZ ) { + + if ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && + pointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false; + n = n.nextZ; + + } + + return true; + +} + +// go through all polygon nodes and cure small local self-intersections +function cureLocalIntersections( start, triangles, dim ) { + + let p = start; + do { + + const a = p.prev, + b = p.next.next; + + if ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) { + + triangles.push( a.i / dim | 0 ); + triangles.push( p.i / dim | 0 ); + triangles.push( b.i / dim | 0 ); + + // remove two nodes involved + removeNode( p ); + removeNode( p.next ); + + p = start = b; + + } + + p = p.next; + + } while ( p !== start ); + + return filterPoints( p ); + +} + +// try splitting polygon into two and triangulate them independently +function splitEarcut( start, triangles, dim, minX, minY, invSize ) { + + // look for a valid diagonal that divides the polygon into two + let a = start; + do { + + let b = a.next.next; + while ( b !== a.prev ) { + + if ( a.i !== b.i && isValidDiagonal( a, b ) ) { + + // split the polygon in two by the diagonal + let c = splitPolygon( a, b ); + + // filter colinear points around the cuts + a = filterPoints( a, a.next ); + c = filterPoints( c, c.next ); + + // run earcut on each half + earcutLinked( a, triangles, dim, minX, minY, invSize, 0 ); + earcutLinked( c, triangles, dim, minX, minY, invSize, 0 ); + return; + + } + + b = b.next; + + } + + a = a.next; + + } while ( a !== start ); + +} + +// link every hole into the outer loop, producing a single-ring polygon without holes +function eliminateHoles( data, holeIndices, outerNode, dim ) { + + const queue = []; + let i, len, start, end, list; + + for ( i = 0, len = holeIndices.length; i < len; i ++ ) { + + start = holeIndices[ i ] * dim; + end = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length; + list = linkedList( data, start, end, dim, false ); + if ( list === list.next ) list.steiner = true; + queue.push( getLeftmost( list ) ); + + } + + queue.sort( compareX ); + + // process holes from left to right + for ( i = 0; i < queue.length; i ++ ) { + + outerNode = eliminateHole( queue[ i ], outerNode ); + + } + + return outerNode; + +} + +function compareX( a, b ) { + + return a.x - b.x; + +} + +// find a bridge between vertices that connects hole with an outer ring and link it +function eliminateHole( hole, outerNode ) { + + const bridge = findHoleBridge( hole, outerNode ); + if ( ! bridge ) { + + return outerNode; + + } + + const bridgeReverse = splitPolygon( bridge, hole ); + + // filter collinear points around the cuts + filterPoints( bridgeReverse, bridgeReverse.next ); + return filterPoints( bridge, bridge.next ); + +} + +// David Eberly's algorithm for finding a bridge between hole and outer polygon +function findHoleBridge( hole, outerNode ) { + + let p = outerNode, + qx = - Infinity, + m; + + const hx = hole.x, hy = hole.y; + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + do { + + if ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) { + + const x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y ); + if ( x <= hx && x > qx ) { + + qx = x; + m = p.x < p.next.x ? p : p.next; + if ( x === hx ) return m; // hole touches outer segment; pick leftmost endpoint + + } + + } + + p = p.next; + + } while ( p !== outerNode ); + + if ( ! m ) return null; + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + const stop = m, + mx = m.x, + my = m.y; + let tanMin = Infinity, tan; + + p = m; + + do { + + if ( hx >= p.x && p.x >= mx && hx !== p.x && + pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) { + + tan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential + + if ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) { + + m = p; + tanMin = tan; + + } + + } + + p = p.next; + + } while ( p !== stop ); + + return m; + +} + +// whether sector in vertex m contains sector in vertex p in the same coordinates +function sectorContainsSector( m, p ) { + + return area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0; + +} + +// interlink polygon nodes in z-order +function indexCurve( start, minX, minY, invSize ) { + + let p = start; + do { + + if ( p.z === 0 ) p.z = zOrder( p.x, p.y, minX, minY, invSize ); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + + } while ( p !== start ); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked( p ); + +} + +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html +function sortLinked( list ) { + + let i, p, q, e, tail, numMerges, pSize, qSize, + inSize = 1; + + do { + + p = list; + list = null; + tail = null; + numMerges = 0; + + while ( p ) { + + numMerges ++; + q = p; + pSize = 0; + for ( i = 0; i < inSize; i ++ ) { + + pSize ++; + q = q.nextZ; + if ( ! q ) break; + + } + + qSize = inSize; + + while ( pSize > 0 || ( qSize > 0 && q ) ) { + + if ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) { + + e = p; + p = p.nextZ; + pSize --; + + } else { + + e = q; + q = q.nextZ; + qSize --; + + } + + if ( tail ) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + + } + + p = q; + + } + + tail.nextZ = null; + inSize *= 2; + + } while ( numMerges > 1 ); + + return list; + +} + +// z-order of a point given coords and inverse of the longer side of data bbox +function zOrder( x, y, minX, minY, invSize ) { + + // coords are transformed into non-negative 15-bit integer range + x = ( x - minX ) * invSize | 0; + y = ( y - minY ) * invSize | 0; + + x = ( x | ( x << 8 ) ) & 0x00FF00FF; + x = ( x | ( x << 4 ) ) & 0x0F0F0F0F; + x = ( x | ( x << 2 ) ) & 0x33333333; + x = ( x | ( x << 1 ) ) & 0x55555555; + + y = ( y | ( y << 8 ) ) & 0x00FF00FF; + y = ( y | ( y << 4 ) ) & 0x0F0F0F0F; + y = ( y | ( y << 2 ) ) & 0x33333333; + y = ( y | ( y << 1 ) ) & 0x55555555; + + return x | ( y << 1 ); + +} + +// find the leftmost node of a polygon ring +function getLeftmost( start ) { + + let p = start, + leftmost = start; + do { + + if ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p; + p = p.next; + + } while ( p !== start ); + + return leftmost; + +} + +// check if a point lies within a convex triangle +function pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) { + + return ( cx - px ) * ( ay - py ) >= ( ax - px ) * ( cy - py ) && + ( ax - px ) * ( by - py ) >= ( bx - px ) * ( ay - py ) && + ( bx - px ) * ( cy - py ) >= ( cx - px ) * ( by - py ); + +} + +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) +function isValidDiagonal( a, b ) { + + return a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // doesn't intersect other edges + ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible + ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors + equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case + +} + +// signed area of a triangle +function area( p, q, r ) { + + return ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y ); + +} + +// check if two points are equal +function equals( p1, p2 ) { + + return p1.x === p2.x && p1.y === p2.y; + +} + +// check if two segments intersect +function intersects( p1, q1, p2, q2 ) { + + const o1 = sign( area( p1, q1, p2 ) ); + const o2 = sign( area( p1, q1, q2 ) ); + const o3 = sign( area( p2, q2, p1 ) ); + const o4 = sign( area( p2, q2, q1 ) ); + + if ( o1 !== o2 && o3 !== o4 ) return true; // general case + + if ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 + if ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 + if ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2 + if ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2 + + return false; + +} + +// for collinear points p, q, r, check if point q lies on segment pr +function onSegment( p, q, r ) { + + return q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y ); + +} + +function sign( num ) { + + return num > 0 ? 1 : num < 0 ? -1 : 0; + +} + +// check if a polygon diagonal intersects any polygon segments +function intersectsPolygon( a, b ) { + + let p = a; + do { + + if ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects( p, p.next, a, b ) ) return true; + p = p.next; + + } while ( p !== a ); + + return false; + +} + +// check if a polygon diagonal is locally inside the polygon +function locallyInside( a, b ) { + + return area( a.prev, a, a.next ) < 0 ? + area( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 : + area( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0; + +} + +// check if the middle point of a polygon diagonal is inside the polygon +function middleInside( a, b ) { + + let p = a, + inside = false; + const px = ( a.x + b.x ) / 2, + py = ( a.y + b.y ) / 2; + do { + + if ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y && + ( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) + inside = ! inside; + p = p.next; + + } while ( p !== a ); + + return inside; + +} + +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; +// if one belongs to the outer ring and another to a hole, it merges it into a single ring +function splitPolygon( a, b ) { + + const a2 = new Node$2( a.i, a.x, a.y ), + b2 = new Node$2( b.i, b.x, b.y ), + an = a.next, + bp = b.prev; + + a.next = b; + b.prev = a; + + a2.next = an; + an.prev = a2; + + b2.next = a2; + a2.prev = b2; + + bp.next = b2; + b2.prev = bp; + + return b2; + +} + +// create a node and optionally link it with previous one (in a circular doubly linked list) +function insertNode( i, x, y, last ) { + + const p = new Node$2( i, x, y ); + + if ( ! last ) { + + p.prev = p; + p.next = p; + + } else { + + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + + } + + return p; + +} + +function removeNode( p ) { + + p.next.prev = p.prev; + p.prev.next = p.next; + + if ( p.prevZ ) p.prevZ.nextZ = p.nextZ; + if ( p.nextZ ) p.nextZ.prevZ = p.prevZ; + +} + +function Node$2( i, x, y ) { + + // vertex index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertex nodes in a polygon ring + this.prev = null; + this.next = null; + + // z-order curve value + this.z = 0; + + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + + // indicates whether this is a steiner point + this.steiner = false; + +} + +function signedArea( data, start, end, dim ) { + + let sum = 0; + for ( let i = start, j = end - dim; i < end; i += dim ) { + + sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] ); + j = i; + + } + + return sum; + +} + +/** + * A class containing utility functions for shapes. + * + * @hideconstructor + */ +class ShapeUtils { + + /** + * Calculate area of a ( 2D ) contour polygon. + * + * @param {Array} contour - An array of 2D points. + * @return {number} The area. + */ + static area( contour ) { + + const n = contour.length; + let a = 0.0; + + for ( let p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + } + + /** + * Returns `true` if the given contour uses a clockwise winding order. + * + * @param {Array} pts - An array of 2D points defining a polygon. + * @return {boolean} Whether the given contour uses a clockwise winding order or not. + */ + static isClockWise( pts ) { + + return ShapeUtils.area( pts ) < 0; + + } + + /** + * Triangulates the given shape definition. + * + * @param {Array} contour - An array of 2D points defining the contour. + * @param {Array>} holes - An array that holds arrays of 2D points defining the holes. + * @return {Array>} An array that holds for each face definition an array with three indices. + */ + static triangulateShape( contour, holes ) { + + const vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + const holeIndices = []; // array of hole indices + const faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts( contour ); + addContour( vertices, contour ); + + // + + let holeIndex = contour.length; + + holes.forEach( removeDupEndPts ); + + for ( let i = 0; i < holes.length; i ++ ) { + + holeIndices.push( holeIndex ); + holeIndex += holes[ i ].length; + addContour( vertices, holes[ i ] ); + + } + + // + + const triangles = Earcut.triangulate( vertices, holeIndices ); + + // + + for ( let i = 0; i < triangles.length; i += 3 ) { + + faces.push( triangles.slice( i, i + 3 ) ); + + } + + return faces; + + } + +} + +function removeDupEndPts( points ) { + + const l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + +} + +function addContour( vertices, contour ) { + + for ( let i = 0; i < contour.length; i ++ ) { + + vertices.push( contour[ i ].x ); + vertices.push( contour[ i ].y ); + + } + +} + +/** + * A geometry class for representing a plane. + * + * ```js + * const geometry = new THREE.PlaneGeometry( 1, 1 ); + * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } ); + * const plane = new THREE.Mesh( geometry, material ); + * scene.add( plane ); + * ``` + * + * @augments BufferGeometry + */ +class PlaneGeometry extends BufferGeometry { + + /** + * Constructs a new plane geometry. + * + * @param {number} [width=1] - The width along the X axis. + * @param {number} [height=1] - The height along the Y axis + * @param {number} [widthSegments=1] - The number of segments along the X axis. + * @param {number} [heightSegments=1] - The number of segments along the Y axis. + */ + constructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) { + + super(); + + this.type = 'PlaneGeometry'; + + /** + * Holds the constructor parameters that have been + * used to generate the geometry. Any modification + * after instantiation does not change the geometry. + * + * @type {Object} + */ + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + const width_half = width / 2; + const height_half = height / 2; + + const gridX = Math.floor( widthSegments ); + const gridY = Math.floor( heightSegments ); + + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + + const segment_width = width / gridX; + const segment_height = height / gridY; + + // + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + for ( let iy = 0; iy < gridY1; iy ++ ) { + + const y = iy * segment_height - height_half; + + for ( let ix = 0; ix < gridX1; ix ++ ) { + + const x = ix * segment_width - width_half; + + vertices.push( x, - y, 0 ); + + normals.push( 0, 0, 1 ); + + uvs.push( ix / gridX ); + uvs.push( 1 - ( iy / gridY ) ); + + } + + } + + for ( let iy = 0; iy < gridY; iy ++ ) { + + for ( let ix = 0; ix < gridX; ix ++ ) { + + const a = ix + gridX1 * iy; + const b = ix + gridX1 * ( iy + 1 ); + const c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + const d = ( ix + 1 ) + gridX1 * iy; + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {PlaneGeometry} A new instance. + */ + static fromJSON( data ) { + + return new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments ); + + } + +} + +/** + * Creates an one-sided polygonal geometry from one or more path shapes. + * + * ```js + * const arcShape = new THREE.Shape() + * .moveTo( 5, 1 ) + * .absarc( 1, 1, 4, 0, Math.PI * 2, false ); + * + * const geometry = new THREE.ShapeGeometry( arcShape ); + * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } ); + * const mesh = new THREE.Mesh( geometry, material ) ; + * scene.add( mesh ); + * ``` + * + * @augments BufferGeometry + */ +class ShapeGeometry extends BufferGeometry { + + /** + * Constructs a new shape geometry. + * + * @param {Shape|Array} [shapes] - A shape or an array of shapes. + * @param {number} [curveSegments=12] - Number of segments per shape. + */ + constructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) { + + super(); + + this.type = 'ShapeGeometry'; + + /** + * Holds the constructor parameters that have been + * used to generate the geometry. Any modification + * after instantiation does not change the geometry. + * + * @type {Object} + */ + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + }; + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // helper variables + + let groupStart = 0; + let groupCount = 0; + + // allow single and array values for "shapes" parameter + + if ( Array.isArray( shapes ) === false ) { + + addShape( shapes ); + + } else { + + for ( let i = 0; i < shapes.length; i ++ ) { + + addShape( shapes[ i ] ); + + this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support + + groupStart += groupCount; + groupCount = 0; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + + // helper functions + + function addShape( shape ) { + + const indexOffset = vertices.length / 3; + const points = shape.extractPoints( curveSegments ); + + let shapeVertices = points.shape; + const shapeHoles = points.holes; + + // check direction of vertices + + if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { + + shapeVertices = shapeVertices.reverse(); + + } + + for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) { + + const shapeHole = shapeHoles[ i ]; + + if ( ShapeUtils.isClockWise( shapeHole ) === true ) { + + shapeHoles[ i ] = shapeHole.reverse(); + + } + + } + + const faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); + + // join vertices of inner and outer paths to a single array + + for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) { + + const shapeHole = shapeHoles[ i ]; + shapeVertices = shapeVertices.concat( shapeHole ); + + } + + // vertices, normals, uvs + + for ( let i = 0, l = shapeVertices.length; i < l; i ++ ) { + + const vertex = shapeVertices[ i ]; + + vertices.push( vertex.x, vertex.y, 0 ); + normals.push( 0, 0, 1 ); + uvs.push( vertex.x, vertex.y ); // world uvs + + } + + // indices + + for ( let i = 0, l = faces.length; i < l; i ++ ) { + + const face = faces[ i ]; + + const a = face[ 0 ] + indexOffset; + const b = face[ 1 ] + indexOffset; + const c = face[ 2 ] + indexOffset; + + indices.push( a, b, c ); + groupCount += 3; + + } + + } + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + toJSON() { + + const data = super.toJSON(); + + const shapes = this.parameters.shapes; + + return toJSON( shapes, data ); + + } + + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @param {Array} shapes - An array of shapes. + * @return {ShapeGeometry} A new instance. + */ + static fromJSON( data, shapes ) { + + const geometryShapes = []; + + for ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) { + + const shape = shapes[ data.shapes[ j ] ]; + + geometryShapes.push( shape ); + + } + + return new ShapeGeometry( geometryShapes, data.curveSegments ); + + } + +} + +function toJSON( shapes, data ) { + + data.shapes = []; + + if ( Array.isArray( shapes ) ) { + + for ( let i = 0, l = shapes.length; i < l; i ++ ) { + + const shape = shapes[ i ]; + + data.shapes.push( shape.uuid ); + + } + + } else { + + data.shapes.push( shapes.uuid ); + + } + + return data; + +} + +/** + * A class for generating a sphere geometry. + * + * ```js + * const geometry = new THREE.SphereGeometry( 15, 32, 16 ); + * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } ); + * const sphere = new THREE.Mesh( geometry, material ); + * scene.add( sphere ); + * ``` + * + * @augments BufferGeometry + */ +class SphereGeometry extends BufferGeometry { + + /** + * Constructs a new sphere geometry. + * + * @param {number} [radius=1] - The sphere radius. + * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`. + * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`. + * @param {number} [phiStart=0] - The horizontal starting angle in radians. + * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size. + * @param {number} [thetaStart=0] - The vertical starting angle in radians. + * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size. + */ + constructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) { + + super(); + + this.type = 'SphereGeometry'; + + /** + * Holds the constructor parameters that have been + * used to generate the geometry. Any modification + * after instantiation does not change the geometry. + * + * @type {Object} + */ + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) ); + + const thetaEnd = Math.min( thetaStart + thetaLength, Math.PI ); + + let index = 0; + const grid = []; + + const vertex = new Vector3(); + const normal = new Vector3(); + + // buffers + + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + + // generate vertices, normals and uvs + + for ( let iy = 0; iy <= heightSegments; iy ++ ) { + + const verticesRow = []; + + const v = iy / heightSegments; + + // special case for the poles + + let uOffset = 0; + + if ( iy === 0 && thetaStart === 0 ) { + + uOffset = 0.5 / widthSegments; + + } else if ( iy === heightSegments && thetaEnd === Math.PI ) { + + uOffset = -0.5 / widthSegments; + + } + + for ( let ix = 0; ix <= widthSegments; ix ++ ) { + + const u = ix / widthSegments; + + // vertex + + vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); + vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + vertices.push( vertex.x, vertex.y, vertex.z ); + + // normal + + normal.copy( vertex ).normalize(); + normals.push( normal.x, normal.y, normal.z ); + + // uv + + uvs.push( u + uOffset, 1 - v ); + + verticesRow.push( index ++ ); + + } + + grid.push( verticesRow ); + + } + + // indices + + for ( let iy = 0; iy < heightSegments; iy ++ ) { + + for ( let ix = 0; ix < widthSegments; ix ++ ) { + + const a = grid[ iy ][ ix + 1 ]; + const b = grid[ iy ][ ix ]; + const c = grid[ iy + 1 ][ ix ]; + const d = grid[ iy + 1 ][ ix + 1 ]; + + if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); + if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( indices ); + this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); + this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); + this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); + + } + + copy( source ) { + + super.copy( source ); + + this.parameters = Object.assign( {}, source.parameters ); + + return this; + + } + + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {SphereGeometry} A new instance. + */ + static fromJSON( data ) { + + return new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength ); + + } + +} + +class MeshStandardMaterial extends Material$1 { + + constructor( parameters ) { + + super(); + + this.isMeshStandardMaterial = true; + + this.type = 'MeshStandardMaterial'; + + this.defines = { 'STANDARD': '' }; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 1.0; + this.metalness = 0.0; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapRotation = new Euler(); + this.envMapIntensity = 1.0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.flatShading = false; + + this.fog = true; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapRotation.copy( source.envMapRotation ); + this.envMapIntensity = source.envMapIntensity; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.flatShading = source.flatShading; + + this.fog = source.fog; + + return this; + + } + +} + +class MeshPhysicalMaterial extends MeshStandardMaterial { + + constructor( parameters ) { + + super(); + + this.isMeshPhysicalMaterial = true; + + this.defines = { + + 'STANDARD': '', + 'PHYSICAL': '' + + }; + + this.type = 'MeshPhysicalMaterial'; + + this.anisotropyRotation = 0; + this.anisotropyMap = null; + + this.clearcoatMap = null; + this.clearcoatRoughness = 0.0; + this.clearcoatRoughnessMap = null; + this.clearcoatNormalScale = new Vector2( 1, 1 ); + this.clearcoatNormalMap = null; + + this.ior = 1.5; + + Object.defineProperty( this, 'reflectivity', { + get: function () { + + return ( clamp$1( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) ); + + }, + set: function ( reflectivity ) { + + this.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity ); + + } + } ); + + this.iridescenceMap = null; + this.iridescenceIOR = 1.3; + this.iridescenceThicknessRange = [ 100, 400 ]; + this.iridescenceThicknessMap = null; + + this.sheenColor = new Color( 0x000000 ); + this.sheenColorMap = null; + this.sheenRoughness = 1.0; + this.sheenRoughnessMap = null; + + this.transmissionMap = null; + + this.thickness = 0; + this.thicknessMap = null; + this.attenuationDistance = Infinity; + this.attenuationColor = new Color( 1, 1, 1 ); + + this.specularIntensity = 1.0; + this.specularIntensityMap = null; + this.specularColor = new Color( 1, 1, 1 ); + this.specularColorMap = null; + + this._anisotropy = 0; + this._clearcoat = 0; + this._dispersion = 0; + this._iridescence = 0; + this._sheen = 0.0; + this._transmission = 0; + + this.setValues( parameters ); + + } + + get anisotropy() { + + return this._anisotropy; + + } + + set anisotropy( value ) { + + if ( this._anisotropy > 0 !== value > 0 ) { + + this.version ++; + + } + + this._anisotropy = value; + + } + + get clearcoat() { + + return this._clearcoat; + + } + + set clearcoat( value ) { + + if ( this._clearcoat > 0 !== value > 0 ) { + + this.version ++; + + } + + this._clearcoat = value; + + } + + get iridescence() { + + return this._iridescence; + + } + + set iridescence( value ) { + + if ( this._iridescence > 0 !== value > 0 ) { + + this.version ++; + + } + + this._iridescence = value; + + } + + get dispersion() { + + return this._dispersion; + + } + + set dispersion( value ) { + + if ( this._dispersion > 0 !== value > 0 ) { + + this.version ++; + + } + + this._dispersion = value; + + } + + get sheen() { + + return this._sheen; + + } + + set sheen( value ) { + + if ( this._sheen > 0 !== value > 0 ) { + + this.version ++; + + } + + this._sheen = value; + + } + + get transmission() { + + return this._transmission; + + } + + set transmission( value ) { + + if ( this._transmission > 0 !== value > 0 ) { + + this.version ++; + + } + + this._transmission = value; + + } + + copy( source ) { + + super.copy( source ); + + this.defines = { + + 'STANDARD': '', + 'PHYSICAL': '' + + }; + + this.anisotropy = source.anisotropy; + this.anisotropyRotation = source.anisotropyRotation; + this.anisotropyMap = source.anisotropyMap; + + this.clearcoat = source.clearcoat; + this.clearcoatMap = source.clearcoatMap; + this.clearcoatRoughness = source.clearcoatRoughness; + this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; + this.clearcoatNormalMap = source.clearcoatNormalMap; + this.clearcoatNormalScale.copy( source.clearcoatNormalScale ); + + this.dispersion = source.dispersion; + this.ior = source.ior; + + this.iridescence = source.iridescence; + this.iridescenceMap = source.iridescenceMap; + this.iridescenceIOR = source.iridescenceIOR; + this.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ]; + this.iridescenceThicknessMap = source.iridescenceThicknessMap; + + this.sheen = source.sheen; + this.sheenColor.copy( source.sheenColor ); + this.sheenColorMap = source.sheenColorMap; + this.sheenRoughness = source.sheenRoughness; + this.sheenRoughnessMap = source.sheenRoughnessMap; + + this.transmission = source.transmission; + this.transmissionMap = source.transmissionMap; + + this.thickness = source.thickness; + this.thicknessMap = source.thicknessMap; + this.attenuationDistance = source.attenuationDistance; + this.attenuationColor.copy( source.attenuationColor ); + + this.specularIntensity = source.specularIntensity; + this.specularIntensityMap = source.specularIntensityMap; + this.specularColor.copy( source.specularColor ); + this.specularColorMap = source.specularColorMap; + + return this; + + } + +} + +class MeshDepthMaterial extends Material$1 { + + constructor( parameters ) { + + super(); + + this.isMeshDepthMaterial = true; + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.depthPacking = source.depthPacking; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + } + +} + +class MeshDistanceMaterial extends Material$1 { + + constructor( parameters ) { + + super(); + + this.isMeshDistanceMaterial = true; + + this.type = 'MeshDistanceMaterial'; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.setValues( parameters ); + + } + + copy( source ) { + + super.copy( source ); + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + return this; + + } + +} + +// converts an array to a specific type +function convertArray( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + +} + +function isTypedArray( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + +} + +// returns an array by which times and values can be sorted +function getKeyframeOrder( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + const n = times.length; + const result = new Array( n ); + for ( let i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + +} + +// uses the array previously returned by 'getKeyframeOrder' to sort data +function sortedArray( values, stride, order ) { + + const nValues = values.length; + const result = new values.constructor( nValues ); + + for ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + const srcOffset = order[ i ] * stride; + + for ( let j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + +} + +// function for parsing AOS keyframe formats +function flattenJSON( jsonKeys, times, values, valuePropertyName ) { + + let i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + let value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( ...value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + +} + +/** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: {@link http://www.oodesign.com/template-method-pattern.html} + * + * @abstract + */ +class Interpolant { + + /** + * Constructs a new interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + /** + * The parameter positions. + * + * @type {TypedArray} + */ + this.parameterPositions = parameterPositions; + + /** + * A cache index. + * + * @private + * @type {number} + * @default 0 + */ + this._cachedIndex = 0; + + /** + * The result buffer. + * + * @type {TypedArray} + */ + this.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize ); + + /** + * The sample values. + * + * @type {TypedArray} + */ + this.sampleValues = sampleValues; + + /** + * The value size. + * + * @type {TypedArray} + */ + this.valueSize = sampleSize; + + /** + * The interpolation settings. + * + * @type {?Object} + * @default null + */ + this.settings = null; + + /** + * The default settings object. + * + * @type {Object} + */ + this.DefaultSettings_ = {}; + + } + + /** + * Evaluate the interpolant at position `t`. + * + * @param {number} t - The interpolation factor. + * @return {TypedArray} The result buffer. + */ + evaluate( t ) { + + const pp = this.parameterPositions; + let i1 = this._cachedIndex, + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + let right; + + linear_scan: { + + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( let giveUpAt = i1 + 2; ; ) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.copySampleValue_( i1 - 1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + const t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( let giveUpAt = i1 - 2; ; ) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.copySampleValue_( 0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + const mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.copySampleValue_( 0 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.copySampleValue_( i1 - 1 ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + } + + /** + * Returns the interpolation settings. + * + * @return {Object} The interpolation settings. + */ + getSettings_() { + + return this.settings || this.DefaultSettings_; + + } + + /** + * Copies a sample value to the result buffer. + * + * @param {number} index - An index into the sample value buffer. + * @return {TypedArray} The result buffer. + */ + copySampleValue_( index ) { + + // copies a sample value to the result buffer + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + } + + /** + * Copies a sample value to the result buffer. + * + * @abstract + * @param {number} i1 - An index into the sample value buffer. + * @param {number} t0 - The previous interpolation factor. + * @param {number} t - The current interpolation factor. + * @param {number} t1 - The next interpolation factor. + * @return {TypedArray} The result buffer. + */ + interpolate_( /* i1, t0, t, t1 */ ) { + + throw new Error( 'call to abstract method' ); + // implementations shall return this.resultBuffer + + } + + /** + * Optional method that is executed when the interval has changed. + * + * @param {number} i1 - An index into the sample value buffer. + * @param {number} t0 - The previous interpolation factor. + * @param {number} t - The current interpolation factor. + */ + intervalChanged_( /* i1, t0, t1 */ ) { + + // empty + + } + +} + +/** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @augments Interpolant + */ +class CubicInterpolant extends Interpolant { + + /** + * Constructs a new cubic interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = -0; + this._offsetPrev = -0; + this._weightNext = -0; + this._offsetNext = -0; + + this.DefaultSettings_ = { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }; + + } + + intervalChanged_( i1, t0, t1 ) { + + const pp = this.parameterPositions; + let iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + const halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + const sP = - wP * ppp + 2 * wP * pp - wP * p; + const s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1; + const s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + const sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + +} + +/** + * A basic linear interpolant. + * + * @augments Interpolant + */ +class LinearInterpolant extends Interpolant { + + /** + * Constructs a new linear interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( let i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + +} + +/** + * Interpolant that evaluates to the sample value at the position preceding + * the parameter. + * + * @augments Interpolant + */ +class DiscreteInterpolant extends Interpolant { + + /** + * Constructs a new discrete interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + interpolate_( i1 /*, t0, t, t1 */ ) { + + return this.copySampleValue_( i1 - 1 ); + + } + +} + +class KeyframeTrack { + + constructor( name, times, values, interpolation ) { + + if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' ); + if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name ); + + this.name = name; + + this.times = convertArray( times, this.TimeBufferType ); + this.values = convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + } + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + static toJSON( track ) { + + const trackType = track.constructor; + + let json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== this.toJSON ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': convertArray( track.times, Array ), + 'values': convertArray( track.values, Array ) + + }; + + const interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + } + + InterpolantFactoryMethodDiscrete( result ) { + + return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + + InterpolantFactoryMethodLinear( result ) { + + return new LinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + + InterpolantFactoryMethodSmooth( result ) { + + return new CubicInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + + setInterpolation( interpolation ) { + + let factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + const message = 'unsupported interpolation for ' + + this.ValueTypeName + ' keyframe track named ' + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( 'THREE.KeyframeTrack:', message ); + return this; + + } + + this.createInterpolant = factoryMethod; + + return this; + + } + + getInterpolation() { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + } + + getValueSize() { + + return this.values.length / this.times.length; + + } + + // move all keyframes either forwards or backwards in time + shift( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + const times = this.times; + + for ( let i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + } + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale( timeScale ) { + + if ( timeScale !== 1.0 ) { + + const times = this.times; + + for ( let i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + } + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim( startTime, endTime ) { + + const times = this.times, + nKeys = times.length; + + let from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) { + + ++ from; + + } + + while ( to !== -1 && times[ to ] > endTime ) { + + -- to; + + } + + ++ to; // inclusive -> exclusive bound + + if ( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) { + + to = Math.max( to, 1 ); + from = to - 1; + + } + + const stride = this.getValueSize(); + this.times = times.slice( from, to ); + this.values = this.values.slice( from * stride, to * stride ); + + } + + return this; + + } + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate() { + + let valid = true; + + const valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ); + valid = false; + + } + + const times = this.times, + values = this.values, + + nKeys = times.length; + + if ( nKeys === 0 ) { + + console.error( 'THREE.KeyframeTrack: Track is empty.', this ); + valid = false; + + } + + let prevTime = null; + + for ( let i = 0; i !== nKeys; i ++ ) { + + const currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime ); + valid = false; + break; + + } + + if ( prevTime !== null && prevTime > currTime ) { + + console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( isTypedArray( values ) ) { + + for ( let i = 0, n = values.length; i !== n; ++ i ) { + + const value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + } + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize() { + + // times or values may be shared with other tracks, so overwriting is unsafe + const times = this.times.slice(), + values = this.values.slice(), + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + lastIndex = times.length - 1; + + let writeIndex = 1; + + for ( let i = 1; i < lastIndex; ++ i ) { + + let keep = false; + + const time = times[ i ]; + const timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + const offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( let j = 0; j !== stride; ++ j ) { + + const value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else { + + keep = true; + + } + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + const readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( let j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = times.slice( 0, writeIndex ); + this.values = values.slice( 0, writeIndex * stride ); + + } else { + + this.times = times; + this.values = values; + + } + + return this; + + } + + clone() { + + const times = this.times.slice(); + const values = this.values.slice(); + + const TypedKeyframeTrack = this.constructor; + const track = new TypedKeyframeTrack( this.name, times, values ); + + // Interpolant argument to constructor is not saved, so copy the factory method directly. + track.createInterpolant = this.createInterpolant; + + return track; + + } + +} + +KeyframeTrack.prototype.TimeBufferType = Float32Array; +KeyframeTrack.prototype.ValueBufferType = Float32Array; +KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; + +/** + * A Track of Boolean keyframe values. + */ +class BooleanKeyframeTrack extends KeyframeTrack { + + // No interpolation parameter because only InterpolateDiscrete is valid. + constructor( name, times, values ) { + + super( name, times, values ); + + } + +} + +BooleanKeyframeTrack.prototype.ValueTypeName = 'bool'; +BooleanKeyframeTrack.prototype.ValueBufferType = Array; +BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; + +/** + * A Track of keyframe values that represent color. + */ +class ColorKeyframeTrack extends KeyframeTrack {} + +ColorKeyframeTrack.prototype.ValueTypeName = 'color'; + +/** + * A Track of numeric keyframe values. + */ +class NumberKeyframeTrack extends KeyframeTrack {} + +NumberKeyframeTrack.prototype.ValueTypeName = 'number'; + +/** + * Spherical linear unit quaternion interpolant. + * + * @augments Interpolant + */ +class QuaternionLinearInterpolant extends Interpolant { + + /** + * Constructs a new SLERP interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + let offset = i1 * stride; + + for ( let end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + +} + +/** + * A Track of quaternion keyframe values. + */ +class QuaternionKeyframeTrack extends KeyframeTrack { + + InterpolantFactoryMethodLinear( result ) { + + return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); + + } + +} + +QuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion'; +// ValueBufferType is inherited +// DefaultInterpolation is inherited; +QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; + +/** + * A Track that interpolates Strings + */ +class StringKeyframeTrack extends KeyframeTrack { + + // No interpolation parameter because only InterpolateDiscrete is valid. + constructor( name, times, values ) { + + super( name, times, values ); + + } + +} + +StringKeyframeTrack.prototype.ValueTypeName = 'string'; +StringKeyframeTrack.prototype.ValueBufferType = Array; +StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined; +StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; + +/** + * A Track of vectored keyframe values. + */ +class VectorKeyframeTrack extends KeyframeTrack {} + +VectorKeyframeTrack.prototype.ValueTypeName = 'vector'; + +class AnimationClip { + + constructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) { + + this.name = name; + this.tracks = tracks; + this.duration = duration; + this.blendMode = blendMode; + + this.uuid = generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + } + + + static parse( json ) { + + const tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + const clip = new this( json.name, json.duration, tracks, json.blendMode ); + clip.uuid = json.uuid; + + return clip; + + } + + static toJSON( clip ) { + + const tracks = [], + clipTracks = clip.tracks; + + const json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks, + 'uuid': clip.uuid, + 'blendMode': clip.blendMode + + }; + + for ( let i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + } + + static CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) { + + const numMorphTargets = morphTargetSequence.length; + const tracks = []; + + for ( let i = 0; i < numMorphTargets; i ++ ) { + + let times = []; + let values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + const order = getKeyframeOrder( times ); + times = sortedArray( times, 1, order ); + values = sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + + } + + return new this( name, -1, tracks ); + + } + + static findByName( objectOrClipArray, name ) { + + let clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + const o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( let i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + + } + + return null; + + } + + static CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) { + + const animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + const pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( let i = 0, il = morphTargets.length; i < il; i ++ ) { + + const morphTarget = morphTargets[ i ]; + const parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + const name = parts[ 1 ]; + + let animationMorphTargets = animationToMorphTargets[ name ]; + + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + const clips = []; + + for ( const name in animationToMorphTargets ) { + + clips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + } + + // parse the animation.hierarchy format + static parseAnimation( animation, bones ) { + + if ( ! animation ) { + + console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); + return null; + + } + + const addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + const times = []; + const values = []; + + flattenJSON( animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + const tracks = []; + + const clipName = animation.name || 'default'; + const fps = animation.fps || 30; + const blendMode = animation.blendMode; + + // automatic length determination in AnimationClip. + let duration = animation.length || -1; + + const hierarchyTracks = animation.hierarchy || []; + + for ( let h = 0; h < hierarchyTracks.length; h ++ ) { + + const animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets + if ( animationKeys[ 0 ].morphTargets ) { + + // figure out all morph targets used in this track + const morphTargetNames = {}; + + let k; + + for ( k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[ k ].morphTargets ) { + + for ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1; + + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( const morphTargetName in morphTargetNames ) { + + const times = []; + const values = []; + + for ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { + + const animationKey = animationKeys[ k ]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * fps; + + } else { + + // ...assume skeletal animation + + const boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + const clip = new this( clipName, duration, tracks, blendMode ); + + return clip; + + } + + resetDuration() { + + const tracks = this.tracks; + let duration = 0; + + for ( let i = 0, n = tracks.length; i !== n; ++ i ) { + + const track = this.tracks[ i ]; + + duration = Math.max( duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + return this; + + } + + trim() { + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + } + + validate() { + + let valid = true; + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + valid = valid && this.tracks[ i ].validate(); + + } + + return valid; + + } + + optimize() { + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + clone() { + + const tracks = []; + + for ( let i = 0; i < this.tracks.length; i ++ ) { + + tracks.push( this.tracks[ i ].clone() ); + + } + + return new this.constructor( this.name, this.duration, tracks, this.blendMode ); + + } + + toJSON() { + + return this.constructor.toJSON( this ); + + } + +} + +function getTrackTypeForValueTypeName( typeName ) { + + switch ( typeName.toLowerCase() ) { + + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + + return NumberKeyframeTrack; + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + + return VectorKeyframeTrack; + + case 'color': + + return ColorKeyframeTrack; + + case 'quaternion': + + return QuaternionKeyframeTrack; + + case 'bool': + case 'boolean': + + return BooleanKeyframeTrack; + + case 'string': + + return StringKeyframeTrack; + + } + + throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); + +} + +function parseKeyframeTrack( json ) { + + if ( json.type === undefined ) { + + throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); + + } + + const trackType = getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + const times = [], values = []; + + flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we assume a constructor compatible with the base + return new trackType( json.name, json.times, json.values, json.interpolation ); + + } + +} + +const Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + +}; + +class LoadingManager { + + constructor( onLoad, onProgress, onError ) { + + const scope = this; + + let isLoading = false; + let itemsLoaded = 0; + let itemsTotal = 0; + let urlModifier = undefined; + const handlers = []; + + // Refer to #5689 for the reason why we don't set .onStart + // in the constructor + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + this.resolveURL = function ( url ) { + + if ( urlModifier ) { + + return urlModifier( url ); + + } + + return url; + + }; + + this.setURLModifier = function ( transform ) { + + urlModifier = transform; + + return this; + + }; + + this.addHandler = function ( regex, loader ) { + + handlers.push( regex, loader ); + + return this; + + }; + + this.removeHandler = function ( regex ) { + + const index = handlers.indexOf( regex ); + + if ( index !== -1 ) { + + handlers.splice( index, 2 ); + + } + + return this; + + }; + + this.getHandler = function ( file ) { + + for ( let i = 0, l = handlers.length; i < l; i += 2 ) { + + const regex = handlers[ i ]; + const loader = handlers[ i + 1 ]; + + if ( regex.global ) regex.lastIndex = 0; // see #17920 + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + }; + + } + +} + +const DefaultLoadingManager = /*@__PURE__*/ new LoadingManager(); + +/** + * Abstract base class for loaders. + * + * @abstract + */ +class Loader { + + /** + * Constructs a new loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor( manager ) { + + /** + * The loading manager. + * + * @type {LoadingManager} + * @default DefaultLoadingManager + */ + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + /** + * The crossOrigin string to implement CORS for loading the url from a + * different domain that allows CORS. + * + * @type {string} + * @default 'anonymous' + */ + this.crossOrigin = 'anonymous'; + + /** + * Whether the XMLHttpRequest uses credentials. + * + * @type {boolean} + * @default false + */ + this.withCredentials = false; + + /** + * The base path from which the asset will be loaded. + * + * @type {string} + */ + this.path = ''; + + /** + * The base path from which additional resources like textures will be loaded. + * + * @type {string} + */ + this.resourcePath = ''; + + /** + * The [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header} + * used in HTTP request. + * + * @type {Object} + */ + this.requestHeader = {}; + + } + + /** + * This method needs to be implemented by all concrete loaders. It holds the + * logic for loading assets from the backend. + * + * @param {string} url - The path/URL of the file to be loaded. + * @param {Function} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @param {onErrorCallback} onError - Executed when errors occur. + */ + load( /* url, onLoad, onProgress, onError */ ) {} + + /** + * A async version of {@link Loader#load}. + * + * @param {string} url - The path/URL of the file to be loaded. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @return {Promise} A Promise that resolves when the asset has been loaded. + */ + loadAsync( url, onProgress ) { + + const scope = this; + + return new Promise( function ( resolve, reject ) { + + scope.load( url, resolve, onProgress, reject ); + + } ); + + } + + /** + * This method needs to be implemented by all concrete loaders. It holds the + * logic for parsing the asset into three.js entities. + * + * @param {any} data - The data to parse. + */ + parse( /* data */ ) {} + + /** + * Sets the `crossOrigin` String to implement CORS for loading the URL + * from a different domain that allows CORS. + * + * @param {string} crossOrigin - The `crossOrigin` value. + * @return {Loader} A reference to this instance. + */ + setCrossOrigin( crossOrigin ) { + + this.crossOrigin = crossOrigin; + return this; + + } + + /** + * Whether the XMLHttpRequest uses credentials such as cookies, authorization + * headers or TLS client certificates, see [XMLHttpRequest.withCredentials]{@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials}. + * + * Note: This setting has no effect if you are loading files locally or from the same domain. + * + * @param {boolean} value - The `withCredentials` value. + * @return {Loader} A reference to this instance. + */ + setWithCredentials( value ) { + + this.withCredentials = value; + return this; + + } + + /** + * Sets the base path for the asset. + * + * @param {string} path - The base path. + * @return {Loader} A reference to this instance. + */ + setPath( path ) { + + this.path = path; + return this; + + } + + /** + * Sets the base path for dependent resources like textures. + * + * @param {string} resourcePath - The resource path. + * @return {Loader} A reference to this instance. + */ + setResourcePath( resourcePath ) { + + this.resourcePath = resourcePath; + return this; + + } + + /** + * Sets the given request header. + * + * @param {Object} requestHeader - A [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header} + * for configuring the HTTP request. + * @return {Loader} A reference to this instance. + */ + setRequestHeader( requestHeader ) { + + this.requestHeader = requestHeader; + return this; + + } + +} + +/** + * Callback for onProgress in loaders. + * + * + * @callback onProgressCallback + * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status. + */ + +/** + * Callback for onError in loaders. + * + * + * @callback onErrorCallback + * @param {Error} error - The error which occurred during the loading process. + */ + +/** + * The default material name that is used by loaders + * when creating materials for loaded 3D objects. + * + * Note: Not all loaders might honor this setting. + * + * @static + * @type {string} + * @default '__DEFAULT' + */ +Loader.DEFAULT_MATERIAL_NAME = '__DEFAULT'; + +const loading = {}; + +class HttpError extends Error { + + constructor( message, response ) { + + super( message ); + this.response = response; + + } + +} + +class FileLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + this.manager.itemStart( url ); + + setTimeout( () => { + + if ( onLoad ) onLoad( cached ); + + this.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check if request is duplicate + + if ( loading[ url ] !== undefined ) { + + loading[ url ].push( { + + onLoad: onLoad, + onProgress: onProgress, + onError: onError + + } ); + + return; + + } + + // Initialise array for duplicate requests + loading[ url ] = []; + + loading[ url ].push( { + onLoad: onLoad, + onProgress: onProgress, + onError: onError, + } ); + + // create request + const req = new Request( url, { + headers: new Headers( this.requestHeader ), + credentials: this.withCredentials ? 'include' : 'same-origin', + // An abort controller could be added within a future PR + } ); + + // record states ( avoid data race ) + const mimeType = this.mimeType; + const responseType = this.responseType; + + // start the fetch + fetch( req ) + .then( response => { + + if ( response.status === 200 || response.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + if ( response.status === 0 ) { + + console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); + + } + + // Workaround: Checking if response.body === undefined for Alipay browser #23548 + + if ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) { + + return response; + + } + + const callbacks = loading[ url ]; + const reader = response.body.getReader(); + + // Nginx needs X-File-Size check + // https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content + const contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' ); + const total = contentLength ? parseInt( contentLength ) : 0; + const lengthComputable = total !== 0; + let loaded = 0; + + // periodically read data into the new stream tracking while download progress + const stream = new ReadableStream( { + start( controller ) { + + readData(); + + function readData() { + + reader.read().then( ( { done, value } ) => { + + if ( done ) { + + controller.close(); + + } else { + + loaded += value.byteLength; + + const event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } ); + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onProgress ) callback.onProgress( event ); + + } + + controller.enqueue( value ); + readData(); + + } + + }, ( e ) => { + + controller.error( e ); + + } ); + + } + + } + + } ); + + return new Response( stream ); + + } else { + + throw new HttpError( `fetch for "${response.url}" responded with ${response.status}: ${response.statusText}`, response ); + + } + + } ) + .then( response => { + + switch ( responseType ) { + + case 'arraybuffer': + + return response.arrayBuffer(); + + case 'blob': + + return response.blob(); + + case 'document': + + return response.text() + .then( text => { + + const parser = new DOMParser(); + return parser.parseFromString( text, mimeType ); + + } ); + + case 'json': + + return response.json(); + + default: + + if ( mimeType === undefined ) { + + return response.text(); + + } else { + + // sniff encoding + const re = /charset="?([^;"\s]*)"?/i; + const exec = re.exec( mimeType ); + const label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined; + const decoder = new TextDecoder( label ); + return response.arrayBuffer().then( ab => decoder.decode( ab ) ); + + } + + } + + } ) + .then( data => { + + // Add to cache only on HTTP success, so that we do not cache + // error response bodies as proper responses to requests. + Cache.add( url, data ); + + const callbacks = loading[ url ]; + delete loading[ url ]; + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onLoad ) callback.onLoad( data ); + + } + + } ) + .catch( err => { + + // Abort errors and other errors are handled the same + + const callbacks = loading[ url ]; + + if ( callbacks === undefined ) { + + // When onLoad was called and url was deleted in `loading` + this.manager.itemError( url ); + throw err; + + } + + delete loading[ url ]; + + for ( let i = 0, il = callbacks.length; i < il; i ++ ) { + + const callback = callbacks[ i ]; + if ( callback.onError ) callback.onError( err ); + + } + + this.manager.itemError( url ); + + } ) + .finally( () => { + + this.manager.itemEnd( url ); + + } ); + + this.manager.itemStart( url ); + + } + + setResponseType( value ) { + + this.responseType = value; + return this; + + } + + setMimeType( value ) { + + this.mimeType = value; + return this; + + } + +} + +class ImageLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const scope = this; + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + const image = createElementNS( 'img' ); + + function onImageLoad() { + + removeEventListeners(); + + Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + } + + function onImageError( event ) { + + removeEventListeners(); + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } + + function removeEventListeners() { + + image.removeEventListener( 'load', onImageLoad, false ); + image.removeEventListener( 'error', onImageError, false ); + + } + + image.addEventListener( 'load', onImageLoad, false ); + image.addEventListener( 'error', onImageError, false ); + + if ( url.slice( 0, 5 ) !== 'data:' ) { + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + } + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + } + +} + +/** + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + * + * Sub classes have to implement the parse() method which will be used in load(). + */ + +class DataTextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const texture = new DataTexture(); + + const loader = new FileLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setPath( this.path ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( buffer ) { + + let texData; + + try { + + texData = scope.parse( buffer ); + + } catch ( error ) { + + if ( onError !== undefined ) { + + onError( error ); + + } else { + + console.error( error ); + return; + + } + + } + + if ( texData.image !== undefined ) { + + texture.image = texData.image; + + } else if ( texData.data !== undefined ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter; + texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter; + + texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1; + + if ( texData.colorSpace !== undefined ) { + + texture.colorSpace = texData.colorSpace; + + } + + if ( texData.flipY !== undefined ) { + + texture.flipY = texData.flipY; + + } + + if ( texData.format !== undefined ) { + + texture.format = texData.format; + + } + + if ( texData.type !== undefined ) { + + texture.type = texData.type; + + } + + if ( texData.mipmaps !== undefined ) { + + texture.mipmaps = texData.mipmaps; + texture.minFilter = LinearMipmapLinearFilter; // presumably... + + } + + if ( texData.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + if ( texData.generateMipmaps !== undefined ) { + + texture.generateMipmaps = texData.generateMipmaps; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + +} + +class TextureLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + } + + load( url, onLoad, onProgress, onError ) { + + const texture = new Texture$1(); + + const loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + loader.load( url, function ( image ) { + + texture.image = image; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + } + +} + +/** + * Abstract base class for lights - all other light types inherit the + * properties and methods described here. + * + * @abstract + * @augments Object3D + */ +class Light extends Object3D { + + /** + * Constructs a new light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity. + */ + constructor( color, intensity = 1 ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isLight = true; + + this.type = 'Light'; + + /** + * The light's color. + * + * @type {Color} + */ + this.color = new Color( color ); + + /** + * The light's intensity. + * + * @type {number} + * @default 1 + */ + this.intensity = intensity; + + } + + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + + // Empty here in base class; some subclasses override. + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + if ( this.target !== undefined ) data.object.target = this.target.uuid; + + return data; + + } + +} + +const _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4(); +const _lightPositionWorld$1 = /*@__PURE__*/ new Vector3(); +const _lookTarget$1 = /*@__PURE__*/ new Vector3(); + +/** + * Abstract base class for light shadow classes. These classes + * represent the shadow configuration for different ligth types. + * + * @abstract + */ +class LightShadow { + + /** + * Constructs a new light shadow. + * + * @param {Camera} camera - The light's view of the world. + */ + constructor( camera ) { + + /** + * The light's view of the world. + * + * @type {Camera} + */ + this.camera = camera; + + /** + * The intensity of the shadow. The default is `1`. + * Valid values are in the range `[0, 1]`. + * + * @type {number} + * @default 1 + */ + this.intensity = 1; + + /** + * Shadow map bias, how much to add or subtract from the normalized depth + * when deciding whether a surface is in shadow. + * + * The default is `0`. Very tiny adjustments here (in the order of `0.0001`) + * may help reduce artifacts in shadows. + * + * @type {number} + * @default 0 + */ + this.bias = 0; + + /** + * Defines how much the position used to query the shadow map is offset along + * the object normal. The default is `0`. Increasing this value can be used to + * reduce shadow acne especially in large scenes where light shines onto + * geometry at a shallow angle. The cost is that shadows may appear distorted. + * + * @type {number} + * @default 0 + */ + this.normalBias = 0; + + /** + * Setting this to values greater than 1 will blur the edges of the shadow. + * High values will cause unwanted banding effects in the shadows - a greater + * map size will allow for a higher value to be used here before these effects + * become visible. + * + * The property has no effect when the shadow map type is `PCFSoftShadowMap` and + * and it is recommended to increase softness by decreasing the shadow map size instead. + * + * The property has no effect when the shadow map type is `BasicShadowMap`. + * + * @type {number} + * @default 1 + */ + this.radius = 1; + + /** + * The amount of samples to use when blurring a VSM shadow map. + * + * @type {number} + * @default 8 + */ + this.blurSamples = 8; + + /** + * Defines the width and height of the shadow map. Higher values give better quality + * shadows at the cost of computation time. Values must be powers of two. + * + * @type {Vector2} + * @default (512,512) + */ + this.mapSize = new Vector2( 512, 512 ); + + /** + * The depth map generated using the internal camera; a location beyond a + * pixel's depth is in shadow. Computed internally during rendering. + * + * @type {?RenderTarget} + * @default null + */ + this.map = null; + + /** + * The distribution map generated using the internal camera; an occlusion is + * calculated based on the distribution of depths. Computed internally during + * rendering. + * + * @type {?RenderTarget} + * @default null + */ + this.mapPass = null; + + /** + * Model to shadow camera space, to compute location and depth in shadow map. + * This is computed internally during rendering. + * + * @type {Matrix4} + */ + this.matrix = new Matrix4(); + + /** + * Enables automatic updates of the light's shadow. If you do not require dynamic + * lighting / shadows, you may set this to `false`. + * + * @type {boolean} + * @default true + */ + this.autoUpdate = true; + + /** + * When set to `true`, shadow maps will be updated in the next `render` call. + * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to + * set this property to `true` and then make a render call to update the light's shadow. + * + * @type {boolean} + * @default false + */ + this.needsUpdate = false; + + this._frustum = new Frustum(); + this._frameExtents = new Vector2( 1, 1 ); + + this._viewportCount = 1; + + this._viewports = [ + + new Vector4( 0, 0, 1, 1 ) + + ]; + + } + + /** + * Used internally by the renderer to get the number of viewports that need + * to be rendered for this shadow. + * + * @return {number} The viewport count. + */ + getViewportCount() { + + return this._viewportCount; + + } + + /** + * Gets the shadow cameras frustum. Used internally by the renderer to cull objects. + * + * @return {Frustum} The shadow camera frustum. + */ + getFrustum() { + + return this._frustum; + + } + + /** + * Update the matrices for the camera and shadow, used internally by the renderer. + * + * @param {Light} light - The light for which the shadow is being rendered. + */ + updateMatrices( light ) { + + const shadowCamera = this.camera; + const shadowMatrix = this.matrix; + + _lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld$1 ); + + _lookTarget$1.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget$1 ); + shadowCamera.updateMatrixWorld(); + + _projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + this._frustum.setFromProjectionMatrix( _projScreenMatrix$1 ); + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( _projScreenMatrix$1 ); + + } + + /** + * Returns a viewport definition for the given viewport index. + * + * @param {number} viewportIndex - The viewport index. + * @return {Vector4} The viewport. + */ + getViewport( viewportIndex ) { + + return this._viewports[ viewportIndex ]; + + } + + /** + * Returns the frame extends. + * + * @return {Vector2} The frame extends. + */ + getFrameExtents() { + + return this._frameExtents; + + } + + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + + if ( this.map ) { + + this.map.dispose(); + + } + + if ( this.mapPass ) { + + this.mapPass.dispose(); + + } + + } + + /** + * Copies the values of the given light shadow instance to this instance. + * + * @param {LightShadow} source - The light shadow to copy. + * @return {LightShadow} A reference to this light shadow instance. + */ + copy( source ) { + + this.camera = source.camera.clone(); + + this.intensity = source.intensity; + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + } + + /** + * Returns a new light shadow instance with copied values from this instance. + * + * @return {LightShadow} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + + /** + * Serializes the light shadow into JSON. + * + * @return {Object} A JSON object representing the serialized light shadow. + * @see {@link ObjectLoader#parse} + */ + toJSON() { + + const object = {}; + + if ( this.intensity !== 1 ) object.intensity = this.intensity; + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.normalBias !== 0 ) object.normalBias = this.normalBias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + +} + +/** + * Represents the shadow configuration of directional lights. + * + * @augments LightShadow + */ +class SpotLightShadow extends LightShadow { + + /** + * Constructs a new spot light shadow. + */ + constructor() { + + super( new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isSpotLightShadow = true; + + /** + * Used to focus the shadow camera. The camera's field of view is set as a + * percentage of the spotlight's field-of-view. Range is `[0, 1]`. + * + * @type {number} + * @default 1 + */ + this.focus = 1; + + } + + updateMatrices( light ) { + + const camera = this.camera; + + const fov = RAD2DEG * 2 * light.angle * this.focus; + const aspect = this.mapSize.width / this.mapSize.height; + const far = light.distance || camera.far; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + super.updateMatrices( light ); + + } + + copy( source ) { + + super.copy( source ); + + this.focus = source.focus; + + return this; + + } + +} + +/** + * This light gets emitted from a single point in one direction, along a cone + * that increases in size the further from the light it gets. + * + * This light can cast shadows - see the {@link SpotLightShadow} for details. + * + * ```js + * // white spotlight shining from the side, modulated by a texture + * const spotLight = new THREE.SpotLight( 0xffffff ); + * spotLight.position.set( 100, 1000, 100 ); + * spotLight.map = new THREE.TextureLoader().load( url ); + * + * spotLight.castShadow = true; + * spotLight.shadow.mapSize.width = 1024; + * spotLight.shadow.mapSize.height = 1024; + * spotLight.shadow.camera.near = 500; + * spotLight.shadow.camera.far = 4000; + * spotLight.shadow.camera.fov = 30;s + * ``` + * + * @augments Light + */ +class SpotLight extends Light { + + /** + * Constructs a new spot light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd). + * @param {number} [distance=0] - Maximum range of the light. `0` means no limit. + * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`. + * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`. + * @param {number} [decay=2] - The amount the light dims along the distance of the light. + */ + constructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) { + + super( color, intensity ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isSpotLight = true; + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DEFAULT_UP ); + this.updateMatrix(); + + /** + * The spot light points from its position to the + * target's position. + * + * For the target's position to be changed to anything other + * than the default, it must be added to the scene. + * + * It is also possible to set the target to be another 3D object + * in the scene. The light will now track the target object. + * + * @type {Object3D} + */ + this.target = new Object3D(); + + /** + * Maximum range of the light. `0` means no limit. + * + * @type {number} + * @default 0 + */ + this.distance = distance; + + /** + * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`. + * + * @type {number} + * @default Math.PI/3 + */ + this.angle = angle; + + /** + * Percent of the spotlight cone that is attenuated due to penumbra. + * Value range is `[0,1]`. + * + * @type {number} + * @default 0 + */ + this.penumbra = penumbra; + + /** + * The amount the light dims along the distance of the light. In context of + * physically-correct rendering the default value should not be changed. + * + * @type {number} + * @default 2 + */ + this.decay = decay; + + /** + * A texture used to modulate the color of the light. The spot light + * color is mixed with the RGB value of this texture, with a ratio + * corresponding to its alpha value. The cookie-like masking effect is + * reproduced using pixel values (0, 0, 0, 1-cookie_value). + * + * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`. + * + * @type {?Texture} + * @default null + */ + this.map = null; + + /** + * This property holds the light's shadow configuration. + * + * @type {SpotLightShadow} + */ + this.shadow = new SpotLightShadow(); + + } + + /** + * The light's power. Power is the luminous power of the light measured in lumens (lm). + * Changing the power will also change the light's intensity. + * + * @type {number} + */ + get power() { + + // compute the light's luminous power (in lumens) from its intensity (in candela) + // by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd) + return this.intensity * Math.PI; + + } + + set power( power ) { + + // set the light's intensity (in candela) from the desired luminous power (in lumens) + this.intensity = power / Math.PI; + + } + + dispose() { + + this.shadow.dispose(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + +} + +const _projScreenMatrix = /*@__PURE__*/ new Matrix4(); +const _lightPositionWorld = /*@__PURE__*/ new Vector3(); +const _lookTarget = /*@__PURE__*/ new Vector3(); + +/** + * Represents the shadow configuration of point lights. + * + * @augments LightShadow + */ +class PointLightShadow extends LightShadow { + + /** + * Constructs a new point light shadow. + */ + constructor() { + + super( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isPointLightShadow = true; + + this._frameExtents = new Vector2( 4, 2 ); + + this._viewportCount = 6; + + this._viewports = [ + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + new Vector4( 2, 1, 1, 1 ), + // negative X + new Vector4( 0, 1, 1, 1 ), + // positive Z + new Vector4( 3, 1, 1, 1 ), + // negative Z + new Vector4( 1, 1, 1, 1 ), + // positive Y + new Vector4( 3, 0, 1, 1 ), + // negative Y + new Vector4( 1, 0, 1, 1 ) + ]; + + this._cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( -1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, -1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, -1, 0 ) + ]; + + this._cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, -1 ) + ]; + + } + + /** + * Update the matrices for the camera and shadow, used internally by the renderer. + * + * @param {Light} light - The light for which the shadow is being rendered. + * @param {number} [viewportIndex=0] - The viewport index. + */ + updateMatrices( light, viewportIndex = 0 ) { + + const camera = this.camera; + const shadowMatrix = this.matrix; + + const far = light.distance || camera.far; + + if ( far !== camera.far ) { + + camera.far = far; + camera.updateProjectionMatrix(); + + } + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + camera.position.copy( _lightPositionWorld ); + + _lookTarget.copy( camera.position ); + _lookTarget.add( this._cubeDirections[ viewportIndex ] ); + camera.up.copy( this._cubeUps[ viewportIndex ] ); + camera.lookAt( _lookTarget ); + camera.updateMatrixWorld(); + + shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + this._frustum.setFromProjectionMatrix( _projScreenMatrix ); + + } + +} + +/** + * A light that gets emitted from a single point in all directions. A common + * use case for this is to replicate the light emitted from a bare + * lightbulb. + * + * This light can cast shadows - see the {@link PointLightShadow} for details. + * + * ```js + * const light = new THREE.PointLight( 0xff0000, 1, 100 ); + * light.position.set( 50, 50, 50 ); + * scene.add( light ); + * ``` + * + * @augments Light + */ +class PointLight extends Light { + + /** + * Constructs a new point light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd). + * @param {number} [distance=0] - Maximum range of the light. `0` means no limit. + * @param {number} [decay=2] - The amount the light dims along the distance of the light. + */ + constructor( color, intensity, distance = 0, decay = 2 ) { + + super( color, intensity ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isPointLight = true; + + this.type = 'PointLight'; + + /** + * When distance is zero, light will attenuate according to inverse-square + * law to infinite distance. When distance is non-zero, light will attenuate + * according to inverse-square law until near the distance cutoff, where it + * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not + * physically correct. + * + * @type {number} + * @default 0 + */ + this.distance = distance; + + /** + * The amount the light dims along the distance of the light. In context of + * physically-correct rendering the default value should not be changed. + * + * @type {number} + * @default 2 + */ + this.decay = decay; + + /** + * This property holds the light's shadow configuration. + * + * @type {PointLightShadow} + */ + this.shadow = new PointLightShadow(); + + } + + /** + * The light's power. Power is the luminous power of the light measured in lumens (lm). + * Changing the power will also change the light's intensity. + * + * @type {number} + */ + get power() { + + // compute the light's luminous power (in lumens) from its intensity (in candela) + // for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd) + return this.intensity * 4 * Math.PI; + + } + + set power( power ) { + + // set the light's intensity (in candela) from the desired luminous power (in lumens) + this.intensity = power / ( 4 * Math.PI ); + + } + + dispose() { + + this.shadow.dispose(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + +} + +/** + * Camera that uses [orthographic projection]{@link https://en.wikipedia.org/wiki/Orthographic_projection}. + * + * In this projection mode, an object's size in the rendered image stays + * constant regardless of its distance from the camera. This can be useful + * for rendering 2D scenes and UI elements, amongst other things. + * + * ```js + * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 ); + * scene.add( camera ); + * ``` + * + * @augments Camera + */ +class OrthographicCamera extends Camera { + + /** + * Constructs a new orthographic camera. + * + * @param {number} [left=-1] - The left plane of the camera's frustum. + * @param {number} [right=1] - The right plane of the camera's frustum. + * @param {number} [top=1] - The top plane of the camera's frustum. + * @param {number} [bottom=-1] - The bottom plane of the camera's frustum. + * @param {number} [near=0.1] - The camera's near plane. + * @param {number} [far=2000] - The camera's far plane. + */ + constructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isOrthographicCamera = true; + + this.type = 'OrthographicCamera'; + + /** + * The zoom factor of the camera. + * + * @type {number} + * @default 1 + */ + this.zoom = 1; + + /** + * Represents the frustum window specification. This property should not be edited + * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}. + * + * @type {?Object} + * @default null + */ + this.view = null; + + /** + * The left plane of the camera's frustum. + * + * @type {number} + * @default -1 + */ + this.left = left; + + /** + * The right plane of the camera's frustum. + * + * @type {number} + * @default 1 + */ + this.right = right; + + /** + * The top plane of the camera's frustum. + * + * @type {number} + * @default 1 + */ + this.top = top; + + /** + * The bottom plane of the camera's frustum. + * + * @type {number} + * @default -1 + */ + this.bottom = bottom; + + /** + * The camera's near plane. The valid range is greater than `0` + * and less than the current value of {@link OrthographicCamera#far}. + * + * Note that, unlike for the {@link PerspectiveCamera}, `0` is a + * valid value for an orthographic camera's near plane. + * + * @type {number} + * @default 0.1 + */ + this.near = near; + + /** + * The camera's far plane. Must be greater than the + * current value of {@link OrthographicCamera#near}. + * + * @type {number} + * @default 2000 + */ + this.far = far; + + this.updateProjectionMatrix(); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + } + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * @param {number} fullWidth - The full width of multiview setup. + * @param {number} fullHeight - The full height of multiview setup. + * @param {number} x - The horizontal offset of the subcamera. + * @param {number} y - The vertical offset of the subcamera. + * @param {number} width - The width of subcamera. + * @param {number} height - The height of subcamera. + * @see {@link PerspectiveCamera#setViewOffset} + */ + setViewOffset( fullWidth, fullHeight, x, y, width, height ) { + + if ( this.view === null ) { + + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + + } + + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + + this.updateProjectionMatrix(); + + } + + /** + * Removes the view offset from the projection matrix. + */ + clearViewOffset() { + + if ( this.view !== null ) { + + this.view.enabled = false; + + } + + this.updateProjectionMatrix(); + + } + + /** + * Updates the camera's projection matrix. Must be called after any change of + * camera properties. + */ + updateProjectionMatrix() { + + const dx = ( this.right - this.left ) / ( 2 * this.zoom ); + const dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + const cx = ( this.right + this.left ) / 2; + const cy = ( this.top + this.bottom ) / 2; + + let left = cx - dx; + let right = cx + dx; + let top = cy + dy; + let bottom = cy - dy; + + if ( this.view !== null && this.view.enabled ) { + + const scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom; + const scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom; + + left += scaleW * this.view.offsetX; + right = left + scaleW * this.view.width; + top -= scaleH * this.view.offsetY; + bottom = top - scaleH * this.view.height; + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem ); + + this.projectionMatrixInverse.copy( this.projectionMatrix ).invert(); + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + +} + +/** + * Represents the shadow configuration of directional lights. + * + * @augments LightShadow + */ +class DirectionalLightShadow extends LightShadow { + + /** + * Constructs a new directional light shadow. + */ + constructor() { + + super( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isDirectionalLightShadow = true; + + } + +} + +/** + * A light that gets emitted in a specific direction. This light will behave + * as though it is infinitely far away and the rays produced from it are all + * parallel. The common use case for this is to simulate daylight; the sun is + * far enough away that its position can be considered to be infinite, and + * all light rays coming from it are parallel. + * + * A common point of confusion for directional lights is that setting the + * rotation has no effect. This is because three.js's DirectionalLight is the + * equivalent to what is often called a 'Target Direct Light' in other + * applications. + * + * This means that its direction is calculated as pointing from the light's + * {@link Object3D#position} to the {@link DirectionalLight#target} position + * (as opposed to a 'Free Direct Light' that just has a rotation + * component). + * + * This light can cast shadows - see the {@link DirectionalLightShadow} for details. + * + * ```js + * // White directional light at half intensity shining from the top. + * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 ); + * scene.add( directionalLight ); + * ``` + * + * @augments Light + */ +class DirectionalLight extends Light { + + /** + * Constructs a new directional light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity. + */ + constructor( color, intensity ) { + + super( color, intensity ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isDirectionalLight = true; + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DEFAULT_UP ); + this.updateMatrix(); + + /** + * The directional light points from its position to the + * target's position. + * + * For the target's position to be changed to anything other + * than the default, it must be added to the scene. + * + * It is also possible to set the target to be another 3D object + * in the scene. The light will now track the target object. + * + * @type {Object3D} + */ + this.target = new Object3D(); + + /** + * This property holds the light's shadow configuration. + * + * @type {DirectionalLightShadow} + */ + this.shadow = new DirectionalLightShadow(); + + } + + dispose() { + + this.shadow.dispose(); + + } + + copy( source ) { + + super.copy( source ); + + this.target = source.target.clone(); + this.shadow = source.shadow.clone(); + + return this; + + } + +} + +/** + * Represents a third-order spherical harmonics (SH). Light probes use this class + * to encode lighting information. + * + * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf} + * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf} + */ +class SphericalHarmonics3 { + + /** + * Constructs a new spherical harmonics. + */ + constructor() { + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isSphericalHarmonics3 = true; + + /** + * An array holding the (9) SH coefficients. + * + * @type {Array} + */ + this.coefficients = []; + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients.push( new Vector3() ); + + } + + } + + /** + * Sets the given SH coefficients to this instance by copying + * the values. + * + * @param {Array} coefficients - The SH coefficients. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + set( coefficients ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].copy( coefficients[ i ] ); + + } + + return this; + + } + + /** + * Sets all SH coefficients to `0`. + * + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + zero() { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].set( 0, 0, 0 ); + + } + + return this; + + } + + /** + * Returns the radiance in the direction of the given normal. + * + * @param {Vector3} normal - The normal vector (assumed to be unit length) + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The radiance. + */ + getAt( normal, target ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + const coeff = this.coefficients; + + // band 0 + target.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 ); + + // band 1 + target.addScaledVector( coeff[ 1 ], 0.488603 * y ); + target.addScaledVector( coeff[ 2 ], 0.488603 * z ); + target.addScaledVector( coeff[ 3 ], 0.488603 * x ); + + // band 2 + target.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) ); + target.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) ); + target.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) ); + target.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) ); + target.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) ); + + return target; + + } + + /** + * Returns the irradiance (radiance convolved with cosine lobe) in the + * direction of the given normal. + * + * @param {Vector3} normal - The normal vector (assumed to be unit length) + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The irradiance. + */ + getIrradianceAt( normal, target ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + const coeff = this.coefficients; + + // band 0 + target.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095 + + // band 1 + target.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603 + target.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z ); + target.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x ); + + // band 2 + target.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548 + target.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z ); + target.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3 + target.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z ); + target.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274 + + return target; + + } + + /** + * Adds the given SH to this instance. + * + * @param {SphericalHarmonics3} sh - The SH to add. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + add( sh ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].add( sh.coefficients[ i ] ); + + } + + return this; + + } + + /** + * A convenience method for performing {@link SphericalHarmonics3#add} and + * {@link SphericalHarmonics3#scale} at once. + * + * @param {SphericalHarmonics3} sh - The SH to add. + * @param {number} s - The scale factor. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + addScaledSH( sh, s ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s ); + + } + + return this; + + } + + /** + * Scales this SH by the given scale factor. + * + * @param {number} s - The scale factor. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + scale( s ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].multiplyScalar( s ); + + } + + return this; + + } + + /** + * Linear interpolates between the given SH and this instance by the given + * alpha factor. + * + * @param {SphericalHarmonics3} sh - The SH to interpolate with. + * @param {number} alpha - The alpha factor. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + lerp( sh, alpha ) { + + for ( let i = 0; i < 9; i ++ ) { + + this.coefficients[ i ].lerp( sh.coefficients[ i ], alpha ); + + } + + return this; + + } + + /** + * Returns `true` if this spherical harmonics is equal with the given one. + * + * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality. + * @return {boolean} Whether this spherical harmonics is equal with the given one. + */ + equals( sh ) { + + for ( let i = 0; i < 9; i ++ ) { + + if ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) { + + return false; + + } + + } + + return true; + + } + + /** + * Copies the values of the given spherical harmonics to this instance. + * + * @param {SphericalHarmonics3} sh - The spherical harmonics to copy. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + copy( sh ) { + + return this.set( sh.coefficients ); + + } + + /** + * Returns a new spherical harmonics with copied values from this instance. + * + * @return {SphericalHarmonics3} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + + /** + * Sets the SH coefficients of this instance from the given array. + * + * @param {Array} array - An array holding the SH coefficients. + * @param {number} [offset=0] - The array offset where to start copying. + * @return {SphericalHarmonics3} A clone of this instance. + */ + fromArray( array, offset = 0 ) { + + const coefficients = this.coefficients; + + for ( let i = 0; i < 9; i ++ ) { + + coefficients[ i ].fromArray( array, offset + ( i * 3 ) ); + + } + + return this; + + } + + /** + * Returns an array with the SH coefficients, or copies them into the provided + * array. The coefficients are represented as numbers. + * + * @param {Array} [array=[]] - The target array. + * @param {number} [offset=0] - The array offset where to start copying. + * @return {Array} An array with flat SH coefficients. + */ + toArray( array = [], offset = 0 ) { + + const coefficients = this.coefficients; + + for ( let i = 0; i < 9; i ++ ) { + + coefficients[ i ].toArray( array, offset + ( i * 3 ) ); + + } + + return array; + + } + + /** + * Computes the SH basis for the given normal vector. + * + * @param {Vector3} normal - The normal. + * @param {Array} shBasis - The target array holding the SH basis. + */ + static getBasisAt( normal, shBasis ) { + + // normal is assumed to be unit length + + const x = normal.x, y = normal.y, z = normal.z; + + // band 0 + shBasis[ 0 ] = 0.282095; + + // band 1 + shBasis[ 1 ] = 0.488603 * y; + shBasis[ 2 ] = 0.488603 * z; + shBasis[ 3 ] = 0.488603 * x; + + // band 2 + shBasis[ 4 ] = 1.092548 * x * y; + shBasis[ 5 ] = 1.092548 * y * z; + shBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 ); + shBasis[ 7 ] = 1.092548 * x * z; + shBasis[ 8 ] = 0.546274 * ( x * x - y * y ); + + } + +} + +/** + * Light probes are an alternative way of adding light to a 3D scene. Unlike + * classical light sources (e.g. directional, point or spot lights), light + * probes do not emit light. Instead they store information about light + * passing through 3D space. During rendering, the light that hits a 3D + * object is approximated by using the data from the light probe. + * + * Light probes are usually created from (radiance) environment maps. The + * class {@link LightProbeGenerator} can be used to create light probes from + * cube textures or render targets. However, light estimation data could also + * be provided in other forms e.g. by WebXR. This enables the rendering of + * augmented reality content that reacts to real world lighting. + * + * The current probe implementation in three.js supports so-called diffuse + * light probes. This type of light probe is functionally equivalent to an + * irradiance environment map. + * + * @augments Light + */ +class LightProbe extends Light { + + /** + * Constructs a new light probe. + * + * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information. + * @param {number} [intensity=1] - The light's strength/intensity. + */ + constructor( sh = new SphericalHarmonics3(), intensity = 1 ) { + + super( undefined, intensity ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isLightProbe = true; + + /** + * A light probe uses spherical harmonics to encode lighting information. + * + * @type {SphericalHarmonics3} + */ + this.sh = sh; + + } + + copy( source ) { + + super.copy( source ); + + this.sh.copy( source.sh ); + + return this; + + } + + /** + * Deserializes the light prove from the given JSON. + * + * @param {Object} json - The JSON holding the serialized light probe. + * @return {LightProbe} A reference to this light probe. + */ + fromJSON( json ) { + + this.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON(); + this.sh.fromArray( json.sh ); + + return this; + + } + + toJSON( meta ) { + + const data = super.toJSON( meta ); + + data.object.sh = this.sh.toArray(); + + return data; + + } + +} + +class LoaderUtils { + + static decodeText( array ) { // @deprecated, r165 + + console.warn( 'THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead.' ); + + if ( typeof TextDecoder !== 'undefined' ) { + + return new TextDecoder().decode( array ); + + } + + // Avoid the String.fromCharCode.apply(null, array) shortcut, which + // throws a "maximum call stack size exceeded" error for large arrays. + + let s = ''; + + for ( let i = 0, il = array.length; i < il; i ++ ) { + + // Implicitly assumes little-endian. + s += String.fromCharCode( array[ i ] ); + + } + + try { + + // merges multi-byte utf-8 characters. + + return decodeURIComponent( escape( s ) ); + + } catch ( e ) { // see #16358 + + return s; + + } + + } + + static extractUrlBase( url ) { + + const index = url.lastIndexOf( '/' ); + + if ( index === -1 ) return './'; + + return url.slice( 0, index + 1 ); + + } + + static resolveURL( url, path ) { + + // Invalid URL + if ( typeof url !== 'string' || url === '' ) return ''; + + // Host Relative URL + if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { + + path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); + + } + + // Absolute URL http://,https://,// + if ( /^(https?:)?\/\//i.test( url ) ) return url; + + // Data URI + if ( /^data:.*,.*$/i.test( url ) ) return url; + + // Blob URL + if ( /^blob:.*$/i.test( url ) ) return url; + + // Relative URL + return path + url; + + } + +} + +class ImageBitmapLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.isImageBitmapLoader = true; + + if ( typeof createImageBitmap === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ); + + } + + if ( typeof fetch === 'undefined' ) { + + console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' ); + + } + + this.options = { premultiplyAlpha: 'none' }; + + } + + setOptions( options ) { + + this.options = options; + + return this; + + } + + load( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + url = this.manager.resolveURL( url ); + + const scope = this; + + const cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + // If cached is a promise, wait for it to resolve + if ( cached.then ) { + + cached.then( imageBitmap => { + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + } ).catch( e => { + + if ( onError ) onError( e ); + + } ); + return; + + } + + // If cached is not a promise (i.e., it's already an imageBitmap) + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + const fetchOptions = {}; + fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include'; + fetchOptions.headers = this.requestHeader; + + const promise = fetch( url, fetchOptions ).then( function ( res ) { + + return res.blob(); + + } ).then( function ( blob ) { + + return createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) ); + + } ).then( function ( imageBitmap ) { + + Cache.add( url, imageBitmap ); + + if ( onLoad ) onLoad( imageBitmap ); + + scope.manager.itemEnd( url ); + + return imageBitmap; + + } ).catch( function ( e ) { + + if ( onError ) onError( e ); + + Cache.remove( url ); + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + } ); + + Cache.add( url, promise ); + scope.manager.itemStart( url ); + + } + +} + +/** + * This type of camera can be used in order to efficiently render a scene with a + * predefined set of cameras. This is an important performance aspect for + * rendering VR scenes. + * + * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory + * to define for each sub camera the `viewport` property which determines the + * part of the viewport that is rendered with this camera. + * + * @augments PerspectiveCamera + */ +class ArrayCamera extends PerspectiveCamera { + + /** + * Constructs a new array camera. + * + * @param {Array} [array=[]] - An array of perspective sub cameras. + */ + constructor( array = [] ) { + + super(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isArrayCamera = true; + + /** + * An array of perspective sub cameras. + * + * @type {Array} + */ + this.cameras = array; + this.index = 0; + + } + +} + +class PropertyMixer { + + constructor( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + let mixFunction, + mixFunctionAdditive, + setIdentity; + + // buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + // + // 'add' is used for additive cumulative results + // + // 'work' is optional and is only present for quaternion types. It is used + // to store intermediate quaternion multiplication results + + switch ( typeName ) { + + case 'quaternion': + mixFunction = this._slerp; + mixFunctionAdditive = this._slerpAdditive; + setIdentity = this._setAdditiveIdentityQuaternion; + + this.buffer = new Float64Array( valueSize * 6 ); + this._workIndex = 5; + break; + + case 'string': + case 'bool': + mixFunction = this._select; + + // Use the regular mix function and for additive on these types, + // additive is not relevant for non-numeric types + mixFunctionAdditive = this._select; + + setIdentity = this._setAdditiveIdentityOther; + + this.buffer = new Array( valueSize * 5 ); + break; + + default: + mixFunction = this._lerp; + mixFunctionAdditive = this._lerpAdditive; + setIdentity = this._setAdditiveIdentityNumeric; + + this.buffer = new Float64Array( valueSize * 5 ); + + } + + this._mixBufferRegion = mixFunction; + this._mixBufferRegionAdditive = mixFunctionAdditive; + this._setIdentity = setIdentity; + this._origIndex = 3; + this._addIndex = 4; + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + // accumulate data in the 'incoming' region into 'accu' + accumulate( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + const buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride; + + let currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( let i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + const mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + } + + // accumulate data in the 'incoming' region into 'add' + accumulateAdditive( weight ) { + + const buffer = this.buffer, + stride = this.valueSize, + offset = stride * this._addIndex; + + if ( this.cumulativeWeightAdditive === 0 ) { + + // add = identity + + this._setIdentity(); + + } + + // add := add + incoming * weight + + this._mixBufferRegionAdditive( buffer, offset, 0, weight, stride ); + this.cumulativeWeightAdditive += weight; + + } + + // apply the state of 'accu' to the binding when accus differ + apply( accuIndex ) { + + const stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + weightAdditive = this.cumulativeWeightAdditive, + + binding = this.binding; + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + const originalValueOffset = stride * this._origIndex; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + if ( weightAdditive > 0 ) { + + // accuN := accuN + additive accuN + + this._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride ); + + } + + for ( let i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + } + + // remember the state of the bound property and copy it to both accus + saveOriginalState() { + + const binding = this.binding; + + const buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * this._origIndex; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( let i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + // Add to identity for additive + this._setIdentity(); + + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + + } + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState() { + + const originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + } + + _setAdditiveIdentityNumeric() { + + const startIndex = this._addIndex * this.valueSize; + const endIndex = startIndex + this.valueSize; + + for ( let i = startIndex; i < endIndex; i ++ ) { + + this.buffer[ i ] = 0; + + } + + } + + _setAdditiveIdentityQuaternion() { + + this._setAdditiveIdentityNumeric(); + this.buffer[ this._addIndex * this.valueSize + 3 ] = 1; + + } + + _setAdditiveIdentityOther() { + + const startIndex = this._origIndex * this.valueSize; + const targetIndex = this._addIndex * this.valueSize; + + for ( let i = 0; i < this.valueSize; i ++ ) { + + this.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ]; + + } + + } + + + // mix functions + + _select( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( let i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + } + + _slerp( buffer, dstOffset, srcOffset, t ) { + + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); + + } + + _slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) { + + const workOffset = this._workIndex * stride; + + // Store result in intermediate buffer offset + Quaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset ); + + // Slerp to the intermediate result + Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t ); + + } + + _lerp( buffer, dstOffset, srcOffset, t, stride ) { + + const s = 1 - t; + + for ( let i = 0; i !== stride; ++ i ) { + + const j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + _lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) { + + for ( let i = 0; i !== stride; ++ i ) { + + const j = dstOffset + i; + + buffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t; + + } + + } + +} + +// Characters [].:/ are reserved for track binding syntax. +const _RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; +const _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' ); + +// Attempts to allow node names from any language. ES5's `\w` regexp matches +// only latin characters, and the unicode \p{L} is not yet supported. So +// instead, we exclude reserved characters and match everything else. +const _wordChar = '[^' + _RESERVED_CHARS_RE + ']'; +const _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; + +// Parent directories, delimited by '/' or ':'. Currently unused, but must +// be matched to parse the rest of the track name. +const _directoryRe = /*@__PURE__*/ /((?:WC+[\/:])*)/.source.replace( 'WC', _wordChar ); + +// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. +const _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot ); + +// Object on target node, and accessor. May not contain reserved +// characters. Accessor may contain any character except closing bracket. +const _objectRe = /*@__PURE__*/ /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', _wordChar ); + +// Property and accessor. May not contain reserved characters. Accessor may +// contain any non-bracket characters. +const _propertyRe = /*@__PURE__*/ /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', _wordChar ); + +const _trackRe = new RegExp( '' + + '^' + + _directoryRe + + _nodeRe + + _objectRe + + _propertyRe + + '$' +); + +const _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ]; + +class Composite { + + constructor( targetGroup, path, optionalParsedPath ) { + + const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + } + + getValue( array, offset ) { + + this.bind(); // bind all binding + + const firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + } + + setValue( array, offset ) { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + } + + bind() { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + } + + unbind() { + + const bindings = this._bindings; + + for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + +} + +// Note: This class uses a State pattern on a per-method basis: +// 'bind' sets 'this.getValue' / 'setValue' and shadows the +// prototype version of these methods with one that represents +// the bound state. When the property is not found, the methods +// become no-ops. +class PropertyBinding { + + constructor( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ); + + this.rootNode = rootNode; + + // initial state of these methods that calls 'bind' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + + static create( root, path, parsedPath ) { + + if ( ! ( root && root.isAnimationObjectGroup ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + } + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + static sanitizeNodeName( name ) { + + return name.replace( /\s/g, '_' ).replace( _reservedRe, '' ); + + } + + static parseTrackName( trackName ) { + + const matches = _trackRe.exec( trackName ); + + if ( matches === null ) { + + throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); + + } + + const results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], // required + propertyIndex: matches[ 6 ] + }; + + const lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); + + if ( lastDot !== undefined && lastDot !== -1 ) { + + const objectName = results.nodeName.substring( lastDot + 1 ); + + // Object names must be checked against an allowlist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if ( _supportedObjectNames.indexOf( objectName ) !== -1 ) { + + results.nodeName = results.nodeName.substring( 0, lastDot ); + results.objectName = objectName; + + } + + } + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); + + } + + return results; + + } + + static findNode( root, nodeName ) { + + if ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + const bone = root.skeleton.getBoneByName( nodeName ); + + if ( bone !== undefined ) { + + return bone; + + } + + } + + // search into node subtree. + if ( root.children ) { + + const searchNodeSubtree = function ( children ) { + + for ( let i = 0; i < children.length; i ++ ) { + + const childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + const result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + const subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + } + + // these are used to "bind" a nonexistent property + _getValue_unavailable() {} + _setValue_unavailable() {} + + // Getters + + _getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.targetObject[ this.propertyName ]; + + } + + _getValue_array( buffer, offset ) { + + const source = this.resolvedProperty; + + for ( let i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + } + + _getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + } + + _getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + // Direct + + _setValue_direct( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + + } + + _setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + } + + _setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.targetObject[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + // EntireArray + + _setValue_array( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + } + + _setValue_array_setNeedsUpdate( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + } + + _setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + const dest = this.resolvedProperty; + + for ( let i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + // ArrayElement + + _setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + } + + _setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + } + + _setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + // HasToFromArray + + _setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + } + + _setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + } + + _setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + _getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + } + + _setValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + } + + // create getter / setter pair for a property in the scene graph + bind() { + + let targetObject = this.node; + const parsedPath = this.parsedPath; + + const objectName = parsedPath.objectName; + const propertyName = parsedPath.propertyName; + let propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ); + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.warn( 'THREE.PropertyBinding: No target node found for track: ' + this.path + '.' ); + return; + + } + + if ( objectName ) { + + let objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( let i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + case 'map': + + if ( 'map' in targetObject ) { + + targetObject = targetObject.map; + break; + + } + + if ( ! targetObject.material ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); + return; + + } + + if ( ! targetObject.material.map ) { + + console.error( 'THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.', this ); + return; + + } + + targetObject = targetObject.material.map; + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + const nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + const nodeName = parsedPath.nodeName; + + console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + + '.' + propertyName + ' but it wasn\'t found.', targetObject ); + return; + + } + + // determine versioning scheme + let versioning = this.Versioning.None; + + this.targetObject = targetObject; + + if ( targetObject.isMaterial === true ) { + + versioning = this.Versioning.NeedsUpdate; + + } else if ( targetObject.isObject3D === true ) { + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + + } + + // determine how the property gets bound + let bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === 'morphTargetInfluences' ) { + + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); + return; + + } + + if ( ! targetObject.geometry.morphAttributes ) { + + console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); + return; + + } + + if ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) { + + propertyIndex = targetObject.morphTargetDictionary[ propertyIndex ]; + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( Array.isArray( nodeProperty ) ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + } + + unbind() { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + +} + +PropertyBinding.Composite = Composite; + +PropertyBinding.prototype.BindingType = { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 +}; + +PropertyBinding.prototype.Versioning = { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 +}; + +PropertyBinding.prototype.GetterByBindingType = [ + + PropertyBinding.prototype._getValue_direct, + PropertyBinding.prototype._getValue_array, + PropertyBinding.prototype._getValue_arrayElement, + PropertyBinding.prototype._getValue_toArray, + +]; + +PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [ + + [ + // Direct + PropertyBinding.prototype._setValue_direct, + PropertyBinding.prototype._setValue_direct_setNeedsUpdate, + PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate, + + ], [ + + // EntireArray + + PropertyBinding.prototype._setValue_array, + PropertyBinding.prototype._setValue_array_setNeedsUpdate, + PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate, + + ], [ + + // ArrayElement + PropertyBinding.prototype._setValue_arrayElement, + PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate, + PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate, + + ], [ + + // HasToFromArray + PropertyBinding.prototype._setValue_fromArray, + PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate, + PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate, + + ] + +]; + +class AnimationAction { + + constructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot; + this.blendMode = blendMode; + + const tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + const interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( let i = 0; i !== nTracks; ++ i ) { + + const interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = -1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // true -> zero effective time scale + this.enabled = true; // false -> zero effective weight + + this.clampWhenFinished = false;// keep feeding the last frame? + + this.zeroSlopeAtStart = true;// for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true;// clips for start, loop and end + + } + + // State & Scheduling + + play() { + + this._mixer._activateAction( this ); + + return this; + + } + + stop() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + } + + reset() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = -1;// forget previous loops + this._startTime = null;// forget scheduling + + return this.stopFading().stopWarping(); + + } + + isRunning() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + } + + // return true when play has been called + isScheduled() { + + return this._mixer._isActiveAction( this ); + + } + + startAt( time ) { + + this._startTime = time; + + return this; + + } + + setLoop( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + } + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + } + + // return the weight considering fading and .enabled + getEffectiveWeight() { + + return this._effectiveWeight; + + } + + fadeIn( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + } + + fadeOut( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + } + + crossFadeFrom( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if ( warp ) { + + const fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + } + + crossFadeTo( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + } + + stopFading() { + + const weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + } + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + + return this.stopWarping(); + + } + + // return the time scale considering warping and .paused + getEffectiveTimeScale() { + + return this._effectiveTimeScale; + + } + + setDuration( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + } + + syncWith( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + } + + halt( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + } + + warp( startTimeScale, endTimeScale, duration ) { + + const mixer = this._mixer, + now = mixer.time, + timeScale = this.timeScale; + + let interpolant = this._timeScaleInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + + } + + const times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + } + + stopWarping() { + + const timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + } + + // Object Accessors + + getMixer() { + + return this._mixer; + + } + + getClip() { + + return this._clip; + + } + + getRoot() { + + return this._localRoot || this._mixer._root; + + } + + // Interna + + _update( time, deltaTime, timeDirection, accuIndex ) { + + // called by the mixer + + if ( ! this.enabled ) { + + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight( time ); + return; + + } + + const startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + const timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + deltaTime = 0; + + } else { + + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + const clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + const weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + const interpolants = this._interpolants; + const propertyMixers = this._propertyBindings; + + switch ( this.blendMode ) { + + case AdditiveAnimationBlendMode: + + for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulateAdditive( weight ); + + } + + break; + + case NormalAnimationBlendMode: + default: + + for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + } + + } + + _updateWeight( time ) { + + let weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + const interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + const interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + } + + _updateTimeScale( time ) { + + let timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + const interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + const interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + } + + _updateTime( deltaTime ) { + + const duration = this._clip.duration; + const loop = this.loop; + + let time = this.time + deltaTime; + let loopCount = this._loopCount; + + const pingPong = ( loop === LoopPingPong ); + + if ( deltaTime === 0 ) { + + if ( loopCount === -1 ) return time; + + return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time; + + } + + if ( loop === LoopOnce ) { + + if ( loopCount === -1 ) { + + // just started + + this._loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else { + + this.time = time; + + break handle_stop; + + } + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? -1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + if ( loopCount === -1 ) { + + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + + // wrap around + + const loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + const pending = this.repetitions - loopCount; + + if ( pending <= 0 ) { + + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : -1 + } ); + + } else { + + // keep running + + if ( pending === 1 ) { + + // entering the last round + + const atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this.time = time; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } else { + + this.time = time; + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + + // invert time for the "pong round" + + return duration - time; + + } + + } + + return time; + + } + + _setEndings( atStart, atEnd, pingPong ) { + + const settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + } + + _scheduleFading( duration, weightNow, weightThen ) { + + const mixer = this._mixer, now = mixer.time; + let interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + + } + + const times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + values[ 0 ] = weightNow; + times[ 1 ] = now + duration; + values[ 1 ] = weightThen; + + return this; + + } + +} + +const _controlInterpolantsResultBuffer = new Float32Array( 1 ); + + +class AnimationMixer extends EventDispatcher { + + constructor( root ) { + + super(); + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + this.time = 0; + this.timeScale = 1.0; + + } + + _bindAction( action, prototypeAction ) { + + const root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName; + + let bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( let i = 0; i !== nTracks; ++ i ) { + + const track = tracks[ i ], + trackName = track.name; + + let binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + ++ binding.referenceCount; + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + const path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + } + + _activateAction( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + const rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + const bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + } + + _deactivateAction( action ) { + + if ( this._isActiveAction( action ) ) { + + const bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + } + + // Memory manager + + _initMemoryManager() { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + const scope = this; + + this.stats = { + + actions: { + get total() { + + return scope._actions.length; + + }, + get inUse() { + + return scope._nActiveActions; + + } + }, + bindings: { + get total() { + + return scope._bindings.length; + + }, + get inUse() { + + return scope._nActiveBindings; + + } + }, + controlInterpolants: { + get total() { + + return scope._controlInterpolants.length; + + }, + get inUse() { + + return scope._nActiveControlInterpolants; + + } + } + + }; + + } + + // Memory management for AnimationAction objects + + _isActiveAction( action ) { + + const index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + } + + _addInactiveAction( action, clipUuid, rootUuid ) { + + const actions = this._actions, + actionsByClip = this._actionsByClip; + + let actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + const knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + } + + _removeInactiveAction( action ) { + + const actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + const clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + const actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( action._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + } + + _removeInactiveBindingsForAction( action ) { + + const bindings = action._propertyBindings; + + for ( let i = 0, n = bindings.length; i !== n; ++ i ) { + + const binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + } + + _lendAction( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + const actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + } + + _takeBackAction( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + const actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + } + + // Memory management for PropertyMixer objects + + _addInactiveBinding( binding, rootUuid, trackName ) { + + const bindingsByRoot = this._bindingsByRootAndName, + bindings = this._bindings; + + let bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + } + + _removeInactiveBinding( binding ) { + + const bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + if ( Object.keys( bindingByName ).length === 0 ) { + + delete bindingsByRoot[ rootUuid ]; + + } + + } + + _lendBinding( binding ) { + + const bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + } + + _takeBackBinding( binding ) { + + const bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + } + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant() { + + const interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++; + + let interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, _controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + } + + _takeBackControlInterpolant( interpolant ) { + + const interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + } + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction( clip, optionalRoot, blendMode ) { + + const root = optionalRoot || this._root, + rootUuid = root.uuid; + + let clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip; + + const clipUuid = clipObject !== null ? clipObject.uuid : clip; + + const actionsForClip = this._actionsByClip[ clipUuid ]; + let prototypeAction = null; + + if ( blendMode === undefined ) { + + if ( clipObject !== null ) { + + blendMode = clipObject.blendMode; + + } else { + + blendMode = NormalAnimationBlendMode; + + } + + } + + if ( actionsForClip !== undefined ) { + + const existingAction = actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined && existingAction.blendMode === blendMode ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + const newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + } + + // get an existing action + existingAction( clip, optionalRoot ) { + + const root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + } + + // deactivates all previously scheduled actions + stopAllAction() { + + const actions = this._actions, + nActions = this._nActiveActions; + + for ( let i = nActions - 1; i >= 0; -- i ) { + + actions[ i ].stop(); + + } + + return this; + + } + + // advance the time and update apply the animation + update( deltaTime ) { + + deltaTime *= this.timeScale; + + const actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( let i = 0; i !== nActions; ++ i ) { + + const action = actions[ i ]; + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + // update scene graph + + const bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( let i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + } + + // Allows you to seek to a specific time in an animation. + setTime( timeInSeconds ) { + + this.time = 0; // Zero out time attribute for AnimationMixer object; + for ( let i = 0; i < this._actions.length; i ++ ) { + + this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects. + + } + + return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object. + + } + + // return this mixer's root target object + getRoot() { + + return this._root; + + } + + // free all resources specific to a particular clip + uncacheClip( clip ) { + + const actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + const actionsToRemove = actionsForClip.knownActions; + + for ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + const action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + const cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + } + + // free all resources specific to a particular root target object + uncacheRoot( root ) { + + const rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( const clipUuid in actionsByClip ) { + + const actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + const bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( const trackName in bindingByName ) { + + const binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + } + + // remove a targeted clip from the cache + uncacheAction( clip, optionalRoot ) { + + const action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + +} + +const _matrix = /*@__PURE__*/ new Matrix4(); + +class Raycaster { + + constructor( origin, direction, near = 0, far = Infinity ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near; + this.far = far; + this.camera = null; + this.layers = new Layers(); + + this.params = { + Mesh: {}, + Line: { threshold: 1 }, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + } + + set( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + } + + setFromCamera( coords, camera ) { + + if ( camera.isPerspectiveCamera ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + this.camera = camera; + + } else if ( camera.isOrthographicCamera ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ); + this.camera = camera; + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type ); + + } + + } + + setFromXRController( controller ) { + + _matrix.identity().extractRotation( controller.matrixWorld ); + + this.ray.origin.setFromMatrixPosition( controller.matrixWorld ); + this.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix ); + + return this; + + } + + intersectObject( object, recursive = true, intersects = [] ) { + + intersect( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + } + + intersectObjects( objects, recursive = true, intersects = [] ) { + + for ( let i = 0, l = objects.length; i < l; i ++ ) { + + intersect( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + +} + +function ascSort( a, b ) { + + return a.distance - b.distance; + +} + +function intersect( object, raycaster, intersects, recursive ) { + + let propagate = true; + + if ( object.layers.test( raycaster.layers ) ) { + + const result = object.raycast( raycaster, intersects ); + + if ( result === false ) propagate = false; + + } + + if ( propagate === true && recursive === true ) { + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + intersect( children[ i ], raycaster, intersects, true ); + + } + + } + +} + +/** + * This class can be used to represent points in 3D space as + * [Spherical coordinates]{@link https://en.wikipedia.org/wiki/Spherical_coordinate_system}. + */ +class Spherical { + + /** + * Constructs a new spherical. + * + * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin. + * @param {number} [phi=0] - The polar angle in radians from the y (up) axis. + * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis. + */ + constructor( radius = 1, phi = 0, theta = 0 ) { + + /** + * The radius, or the Euclidean distance (straight-line distance) from the point to the origin. + * + * @type {number} + * @default 1 + */ + this.radius = radius; + + /** + * The polar angle in radians from the y (up) axis. + * + * @type {number} + * @default 0 + */ + this.phi = phi; + + /** + * The equator/azimuthal angle in radians around the y (up) axis. + * + * @type {number} + * @default 0 + */ + this.theta = theta; + + } + + /** + * Sets the spherical components by copying the given values. + * + * @param {number} radius - The radius. + * @param {number} phi - The polar angle. + * @param {number} theta - The azimuthal angle. + * @return {Spherical} A reference to this spherical. + */ + set( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + } + + /** + * Copies the values of the given spherical to this instance. + * + * @param {Spherical} other - The spherical to copy. + * @return {Spherical} A reference to this spherical. + */ + copy( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + } + + /** + * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi - + * `0.000001`. + * + * @return {Spherical} A reference to this spherical. + */ + makeSafe() { + + const EPS = 0.000001; + this.phi = clamp$1( this.phi, EPS, Math.PI - EPS ); + + return this; + + } + + /** + * Sets the spherical components from the given vector which is assumed to hold + * Cartesian coordinates. + * + * @param {Vector3} v - The vector to set. + * @return {Spherical} A reference to this spherical. + */ + setFromVector3( v ) { + + return this.setFromCartesianCoords( v.x, v.y, v.z ); + + } + + /** + * Sets the spherical components from the given Cartesian coordinates. + * + * @param {number} x - The x value. + * @param {number} y - The x value. + * @param {number} z - The x value. + * @return {Spherical} A reference to this spherical. + */ + setFromCartesianCoords( x, y, z ) { + + this.radius = Math.sqrt( x * x + y * y + z * z ); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( x, z ); + this.phi = Math.acos( clamp$1( y / this.radius, -1, 1 ) ); + + } + + return this; + + } + + /** + * Returns a new spherical with copied values from this instance. + * + * @return {Spherical} A clone of this instance. + */ + clone() { + + return new this.constructor().copy( this ); + + } + +} + +/** + * Determines how many bytes must be used to represent the texture. + * + * @param {number} width - The width of the texture. + * @param {number} height - The height of the texture. + * @param {number} format - The texture's format. + * @param {number} type - The texture's type. + * @return {number} The byte length. + */ +function getByteLength( width, height, format, type ) { + + const typeByteLength = getTextureTypeByteLength( type ); + + switch ( format ) { + + // https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml + case AlphaFormat: + return width * height; + case LuminanceFormat: + return width * height; + case LuminanceAlphaFormat: + return width * height * 2; + case RedFormat: + return ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength; + case RedIntegerFormat: + return ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength; + case RGFormat: + return ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength; + case RGIntegerFormat: + return ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength; + case RGBFormat: + return ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength; + case RGBAFormat: + return ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength; + case RGBAIntegerFormat: + return ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength; + + // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/ + case RGB_S3TC_DXT1_Format: + case RGBA_S3TC_DXT1_Format: + return Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8; + case RGBA_S3TC_DXT3_Format: + case RGBA_S3TC_DXT5_Format: + return Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16; + + // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/ + case RGB_PVRTC_2BPPV1_Format: + case RGBA_PVRTC_2BPPV1_Format: + return ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4; + case RGB_PVRTC_4BPPV1_Format: + case RGBA_PVRTC_4BPPV1_Format: + return ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2; + + // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/ + case RGB_ETC1_Format: + case RGB_ETC2_Format: + return Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8; + case RGBA_ETC2_EAC_Format: + return Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16; + + // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/ + case RGBA_ASTC_4x4_Format: + return Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16; + case RGBA_ASTC_5x4_Format: + return Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16; + case RGBA_ASTC_5x5_Format: + return Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16; + case RGBA_ASTC_6x5_Format: + return Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16; + case RGBA_ASTC_6x6_Format: + return Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16; + case RGBA_ASTC_8x5_Format: + return Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16; + case RGBA_ASTC_8x6_Format: + return Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16; + case RGBA_ASTC_8x8_Format: + return Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16; + case RGBA_ASTC_10x5_Format: + return Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16; + case RGBA_ASTC_10x6_Format: + return Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16; + case RGBA_ASTC_10x8_Format: + return Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16; + case RGBA_ASTC_10x10_Format: + return Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16; + case RGBA_ASTC_12x10_Format: + return Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16; + case RGBA_ASTC_12x12_Format: + return Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16; + + // https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/ + case RGBA_BPTC_Format: + case RGB_BPTC_SIGNED_Format: + case RGB_BPTC_UNSIGNED_Format: + return Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16; + + // https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/ + case RED_RGTC1_Format: + case SIGNED_RED_RGTC1_Format: + return Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8; + case RED_GREEN_RGTC2_Format: + case SIGNED_RED_GREEN_RGTC2_Format: + return Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16; + + } + + throw new Error( + `Unable to determine texture byte length for ${format} format.`, + ); + +} + +function getTextureTypeByteLength( type ) { + + switch ( type ) { + + case UnsignedByteType: + case ByteType: + return { byteLength: 1, components: 1 }; + case UnsignedShortType: + case ShortType: + case HalfFloatType: + return { byteLength: 2, components: 1 }; + case UnsignedShort4444Type: + case UnsignedShort5551Type: + return { byteLength: 2, components: 4 }; + case UnsignedIntType: + case IntType: + case FloatType: + return { byteLength: 4, components: 1 }; + case UnsignedInt5999Type: + return { byteLength: 4, components: 3 }; + + } + + throw new Error( `Unknown texture type ${type}.` ); + +} + +if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: { + revision: REVISION, + } } ) ); + +} + +if ( typeof window !== 'undefined' ) { + + if ( window.__THREE__ ) { + + console.warn( 'WARNING: Multiple instances of Three.js being imported.' ); + + } else { + + window.__THREE__ = REVISION; + + } + +} + +/** + * @license + * Copyright 2010-2025 Three.js Authors + * SPDX-License-Identifier: MIT + */ + +function WebGLAnimation() { + + let context = null; + let isAnimating = false; + let animationLoop = null; + let requestId = null; + + function onAnimationFrame( time, frame ) { + + animationLoop( time, frame ); + + requestId = context.requestAnimationFrame( onAnimationFrame ); + + } + + return { + + start: function () { + + if ( isAnimating === true ) return; + if ( animationLoop === null ) return; + + requestId = context.requestAnimationFrame( onAnimationFrame ); + + isAnimating = true; + + }, + + stop: function () { + + context.cancelAnimationFrame( requestId ); + + isAnimating = false; + + }, + + setAnimationLoop: function ( callback ) { + + animationLoop = callback; + + }, + + setContext: function ( value ) { + + context = value; + + } + + }; + +} + +function WebGLAttributes( gl ) { + + const buffers = new WeakMap(); + + function createBuffer( attribute, bufferType ) { + + const array = attribute.array; + const usage = attribute.usage; + const size = array.byteLength; + + const buffer = gl.createBuffer(); + + gl.bindBuffer( bufferType, buffer ); + gl.bufferData( bufferType, array, usage ); + + attribute.onUploadCallback(); + + let type; + + if ( array instanceof Float32Array ) { + + type = gl.FLOAT; + + } else if ( array instanceof Uint16Array ) { + + if ( attribute.isFloat16BufferAttribute ) { + + type = gl.HALF_FLOAT; + + } else { + + type = gl.UNSIGNED_SHORT; + + } + + } else if ( array instanceof Int16Array ) { + + type = gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = gl.UNSIGNED_BYTE; + + } else if ( array instanceof Uint8ClampedArray ) { + + type = gl.UNSIGNED_BYTE; + + } else { + + throw new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array ); + + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version, + size: size + }; + + } + + function updateBuffer( buffer, attribute, bufferType ) { + + const array = attribute.array; + const updateRanges = attribute.updateRanges; + + gl.bindBuffer( bufferType, buffer ); + + if ( updateRanges.length === 0 ) { + + // Not using update ranges + gl.bufferSubData( bufferType, 0, array ); + + } else { + + // Before applying update ranges, we merge any adjacent / overlapping + // ranges to reduce load on `gl.bufferSubData`. Empirically, this has led + // to performance improvements for applications which make heavy use of + // update ranges. Likely due to GPU command overhead. + // + // Note that to reduce garbage collection between frames, we merge the + // update ranges in-place. This is safe because this method will clear the + // update ranges once updated. + + updateRanges.sort( ( a, b ) => a.start - b.start ); + + // To merge the update ranges in-place, we work from left to right in the + // existing updateRanges array, merging ranges. This may result in a final + // array which is smaller than the original. This index tracks the last + // index representing a merged range, any data after this index can be + // trimmed once the merge algorithm is completed. + let mergeIndex = 0; + + for ( let i = 1; i < updateRanges.length; i ++ ) { + + const previousRange = updateRanges[ mergeIndex ]; + const range = updateRanges[ i ]; + + // We add one here to merge adjacent ranges. This is safe because ranges + // operate over positive integers. + if ( range.start <= previousRange.start + previousRange.count + 1 ) { + + previousRange.count = Math.max( + previousRange.count, + range.start + range.count - previousRange.start + ); + + } else { + + ++ mergeIndex; + updateRanges[ mergeIndex ] = range; + + } + + } + + // Trim the array to only contain the merged ranges. + updateRanges.length = mergeIndex + 1; + + for ( let i = 0, l = updateRanges.length; i < l; i ++ ) { + + const range = updateRanges[ i ]; + + gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT, + array, range.start, range.count ); + + } + + attribute.clearUpdateRanges(); + + } + + attribute.onUploadCallback(); + + } + + // + + function get( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + return buffers.get( attribute ); + + } + + function remove( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + const data = buffers.get( attribute ); + + if ( data ) { + + gl.deleteBuffer( data.buffer ); + + buffers.delete( attribute ); + + } + + } + + function update( attribute, bufferType ) { + + if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; + + if ( attribute.isGLBufferAttribute ) { + + const cached = buffers.get( attribute ); + + if ( ! cached || cached.version < attribute.version ) { + + buffers.set( attribute, { + buffer: attribute.buffer, + type: attribute.type, + bytesPerElement: attribute.elementSize, + version: attribute.version + } ); + + } + + return; + + } + + const data = buffers.get( attribute ); + + if ( data === undefined ) { + + buffers.set( attribute, createBuffer( attribute, bufferType ) ); + + } else if ( data.version < attribute.version ) { + + if ( data.size !== attribute.array.byteLength ) { + + throw new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' ); + + } + + updateBuffer( data.buffer, attribute, bufferType ); + + data.version = attribute.version; + + } + + } + + return { + + get: get, + remove: remove, + update: update + + }; + +} + +var alphahash_fragment = "#ifdef USE_ALPHAHASH\n\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif"; + +var alphahash_pars_fragment = "#ifdef USE_ALPHAHASH\n\tconst float ALPHA_HASH_SCALE = 0.05;\n\tfloat hash2D( vec2 value ) {\n\t\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n\t}\n\tfloat hash3D( vec3 value ) {\n\t\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\n\t}\n\tfloat getAlphaHashThreshold( vec3 position ) {\n\t\tfloat maxDeriv = max(\n\t\t\tlength( dFdx( position.xyz ) ),\n\t\t\tlength( dFdy( position.xyz ) )\n\t\t);\n\t\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n\t\tvec2 pixScales = vec2(\n\t\t\texp2( floor( log2( pixScale ) ) ),\n\t\t\texp2( ceil( log2( pixScale ) ) )\n\t\t);\n\t\tvec2 alpha = vec2(\n\t\t\thash3D( floor( pixScales.x * position.xyz ) ),\n\t\t\thash3D( floor( pixScales.y * position.xyz ) )\n\t\t);\n\t\tfloat lerpFactor = fract( log2( pixScale ) );\n\t\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n\t\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\n\t\tvec3 cases = vec3(\n\t\t\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\n\t\t\t( x - 0.5 * a ) / ( 1.0 - a ),\n\t\t\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n\t\t);\n\t\tfloat threshold = ( x < ( 1.0 - a ) )\n\t\t\t? ( ( x < a ) ? cases.x : cases.y )\n\t\t\t: cases.z;\n\t\treturn clamp( threshold , 1.0e-6, 1.0 );\n\t}\n#endif"; + +var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif"; + +var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif"; + +var alphatest_fragment = "#ifdef USE_ALPHATEST\n\t#ifdef ALPHA_TO_COVERAGE\n\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\n\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\tif ( diffuseColor.a < alphaTest ) discard;\n\t#endif\n#endif"; + +var alphatest_pars_fragment = "#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif"; + +var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif"; + +var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + +var batching_pars_vertex = "#ifdef USE_BATCHING\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\tvec3 getBatchingColor( const in float i ) {\n\t\tint size = textureSize( batchingColorTexture, 0 ).x;\n\t\tint j = int( i );\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\n\t}\n#endif"; + +var batching_vertex = "#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\n#endif"; + +var begin_vertex = "vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n\tvPosition = vec3( position );\n#endif"; + +var beginnormal_vertex = "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif"; + +var bsdfs = "float G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n} // validated"; + +var iridescence_fragment = "#ifdef USE_IRIDESCENCE\n\tconst mat3 XYZ_TO_REC709 = mat3(\n\t\t 3.2404542, -0.9692660, 0.0556434,\n\t\t-1.5371385, 1.8760108, -0.2040259,\n\t\t-0.4985314, 0.0415560, 1.0572252\n\t);\n\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\n\t\tvec3 sqrtF0 = sqrt( fresnel0 );\n\t\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n\t}\n\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n\t}\n\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n\t}\n\tvec3 evalSensitivity( float OPD, vec3 shift ) {\n\t\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\n\t\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\t\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\t\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\t\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n\t\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\n\t\txyz /= 1.0685e-7;\n\t\tvec3 rgb = XYZ_TO_REC709 * xyz;\n\t\treturn rgb;\n\t}\n\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n\t\tvec3 I;\n\t\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\t\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n\t\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\n\t\tif ( cosTheta2Sq < 0.0 ) {\n\t\t\treturn vec3( 1.0 );\n\t\t}\n\t\tfloat cosTheta2 = sqrt( cosTheta2Sq );\n\t\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n\t\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\n\t\tfloat T121 = 1.0 - R12;\n\t\tfloat phi12 = 0.0;\n\t\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\n\t\tfloat phi21 = PI - phi12;\n\t\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\t\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n\t\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n\t\tvec3 phi23 = vec3( 0.0 );\n\t\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n\t\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n\t\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n\t\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n\t\tvec3 phi = vec3( phi21 ) + phi23;\n\t\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n\t\tvec3 r123 = sqrt( R123 );\n\t\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n\t\tvec3 C0 = R12 + Rs;\n\t\tI = C0;\n\t\tvec3 Cm = Rs - T121;\n\t\tfor ( int m = 1; m <= 2; ++ m ) {\n\t\t\tCm *= r123;\n\t\t\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n\t\t\tI += Cm * Sm;\n\t\t}\n\t\treturn max( I, vec3( 0.0 ) );\n\t}\n#endif"; + +var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vBumpMapUv );\n\t\tvec2 dSTdy = dFdy( vBumpMapUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n\t\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif"; + +var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif"; + +var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"; + +var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif"; + +var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif"; + +var color_fragment = "#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif"; + +var color_pars_fragment = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif"; + +var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif"; + +var color_vertex = "#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif"; + +var common = "#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated"; + +var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif"; + +var defaultnormal_vertex = "vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif"; + +var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif"; + +var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif"; + +var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif"; + +var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif"; + +var colorspace_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );"; + +var colorspace_pars_fragment = "vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}"; + +var envmap_fragment = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif"; + +var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif"; + +var envmap_pars_fragment = "#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif"; + +var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif"; + +var envmap_vertex = "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif"; + +var fog_vertex = "#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif"; + +var fog_pars_vertex = "#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif"; + +var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif"; + +var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif"; + +var gradientmap_pars_fragment = "#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}"; + +var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + +var lights_lambert_fragment = "LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;"; + +var lights_lambert_pars_fragment = "varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert"; + +var lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif"; + +var envmap_physical_pars_fragment = "#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif"; + +var lights_toon_fragment = "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;"; + +var lights_toon_pars_fragment = "varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon"; + +var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;"; + +var lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong"; + +var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif"; + +var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}"; + +var lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; + +var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif"; + +var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif"; + +var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; + +var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif"; + +var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif"; + +var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif"; + +var map_fragment = "#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif"; + +var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif"; + +var map_particle_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif"; + +var map_particle_pars_fragment = "#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif"; + +var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif"; + +var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + +var morphinstance_vertex = "#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif"; + +var morphcolor_vertex = "#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif"; + +var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif"; + +var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif"; + +var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif"; + +var normal_fragment_begin = "float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;"; + +var normal_fragment_maps = "#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif"; + +var normal_pars_fragment = "#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif"; + +var normal_pars_vertex = "#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif"; + +var normal_vertex = "#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif"; + +var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif"; + +var clearcoat_normal_fragment_begin = "#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif"; + +var clearcoat_normal_fragment_maps = "#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif"; + +var clearcoat_pars_fragment = "#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif"; + +var iridescence_pars_fragment = "#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif"; + +var opaque_fragment = "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );"; + +var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}"; + +var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif"; + +var project_vertex = "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;"; + +var dithering_fragment = "#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif"; + +var dithering_pars_fragment = "#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif"; + +var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif"; + +var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + +var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif"; + +var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif"; + +var shadowmap_vertex = "#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif"; + +var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}"; + +var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + +var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif"; + +var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif"; + +var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif"; + +var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + +var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + +var tonemapping_fragment = "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif"; + +var tonemapping_pars_fragment = "#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }"; + +var transmission_fragment = "#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif"; + +var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif"; + +var uv_pars_fragment = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif"; + +var uv_pars_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif"; + +var uv_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif"; + +var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif"; + +const vertex$h = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}"; + +const fragment$h = "uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}"; + +const vertex$g = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}"; + +const fragment$g = "#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}"; + +const vertex$f = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}"; + +const fragment$f = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}"; + +const vertex$e = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}"; + +const fragment$e = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}"; + +const vertex$d = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}"; + +const fragment$d = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}"; + +const vertex$c = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}"; + +const fragment$c = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}"; + +const vertex$b = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$b = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$a = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$a = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$9 = "#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$8 = "#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}"; + +const fragment$8 = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$7 = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}"; + +const fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}"; + +const vertex$6 = "#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$5 = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}"; + +const fragment$5 = "#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$4 = "#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}"; + +const fragment$4 = "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$3 = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$3 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const vertex$2 = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const fragment$2 = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}"; + +const vertex$1 = "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"; + +const fragment$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"; + +const ShaderChunk = { + alphahash_fragment: alphahash_fragment, + alphahash_pars_fragment: alphahash_pars_fragment, + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + alphatest_pars_fragment: alphatest_pars_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + batching_pars_vertex: batching_pars_vertex, + batching_vertex: batching_vertex, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + iridescence_fragment: iridescence_fragment, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + colorspace_fragment: colorspace_fragment, + colorspace_pars_fragment: colorspace_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_common_pars_fragment: envmap_common_pars_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_physical_pars_fragment: envmap_physical_pars_fragment, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_fragment: lights_lambert_fragment, + lights_lambert_pars_fragment: lights_lambert_pars_fragment, + lights_pars_begin: lights_pars_begin, + lights_toon_fragment: lights_toon_fragment, + lights_toon_pars_fragment: lights_toon_pars_fragment, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_fragment_begin: lights_fragment_begin, + lights_fragment_maps: lights_fragment_maps, + lights_fragment_end: lights_fragment_end, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphinstance_vertex: morphinstance_vertex, + morphcolor_vertex: morphcolor_vertex, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment_begin: normal_fragment_begin, + normal_fragment_maps: normal_fragment_maps, + normal_pars_fragment: normal_pars_fragment, + normal_pars_vertex: normal_pars_vertex, + normal_vertex: normal_vertex, + normalmap_pars_fragment: normalmap_pars_fragment, + clearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin, + clearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps, + clearcoat_pars_fragment: clearcoat_pars_fragment, + iridescence_pars_fragment: iridescence_pars_fragment, + opaque_fragment: opaque_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + transmission_fragment: transmission_fragment, + transmission_pars_fragment: transmission_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + worldpos_vertex: worldpos_vertex, + + background_vert: vertex$h, + background_frag: fragment$h, + backgroundCube_vert: vertex$g, + backgroundCube_frag: fragment$g, + cube_vert: vertex$f, + cube_frag: fragment$f, + depth_vert: vertex$e, + depth_frag: fragment$e, + distanceRGBA_vert: vertex$d, + distanceRGBA_frag: fragment$d, + equirect_vert: vertex$c, + equirect_frag: fragment$c, + linedashed_vert: vertex$b, + linedashed_frag: fragment$b, + meshbasic_vert: vertex$a, + meshbasic_frag: fragment$a, + meshlambert_vert: vertex$9, + meshlambert_frag: fragment$9, + meshmatcap_vert: vertex$8, + meshmatcap_frag: fragment$8, + meshnormal_vert: vertex$7, + meshnormal_frag: fragment$7, + meshphong_vert: vertex$6, + meshphong_frag: fragment$6, + meshphysical_vert: vertex$5, + meshphysical_frag: fragment$5, + meshtoon_vert: vertex$4, + meshtoon_frag: fragment$4, + points_vert: vertex$3, + points_frag: fragment$3, + shadow_vert: vertex$2, + shadow_frag: fragment$2, + sprite_vert: vertex$1, + sprite_frag: fragment$1 +}; + +/** + * Uniforms library for shared webgl shaders + */ + +const UniformsLib = { + + common: { + + diffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + mapTransform: { value: /*@__PURE__*/ new Matrix3() }, + + alphaMap: { value: null }, + alphaMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + + alphaTest: { value: 0 } + + }, + + specularmap: { + + specularMap: { value: null }, + specularMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + envmap: { + + envMap: { value: null }, + envMapRotation: { value: /*@__PURE__*/ new Matrix3() }, + flipEnvMap: { value: -1 }, + reflectivity: { value: 1.0 }, // basic, lambert, phong + ior: { value: 1.5 }, // physical + refractionRatio: { value: 0.98 }, // basic, lambert, phong + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 }, + aoMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 }, + lightMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + normalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + emissivemap: { + + emissiveMap: { value: null }, + emissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + metalnessmap: { + + metalnessMap: { value: null }, + metalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + roughnessmap: { + + roughnessMap: { value: null }, + roughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + gradientmap: { + + gradientMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + lightProbe: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {} + } }, + + directionalLightShadows: { value: [], properties: { + shadowIntensity: 1, + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {} + } }, + + spotLightShadows: { value: [], properties: { + shadowIntensity: 1, + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotLightMap: { value: [] }, + spotShadowMap: { value: [] }, + spotLightMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {} + } }, + + pointLightShadows: { value: [], properties: { + shadowIntensity: 1, + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } }, + + ltc_1: { value: null }, + ltc_2: { value: null } + + }, + + points: { + + diffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + alphaMap: { value: null }, + alphaMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + alphaTest: { value: 0 }, + uvTransform: { value: /*@__PURE__*/ new Matrix3() } + + }, + + sprite: { + + diffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) }, + opacity: { value: 1.0 }, + center: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) }, + rotation: { value: 0.0 }, + map: { value: null }, + mapTransform: { value: /*@__PURE__*/ new Matrix3() }, + alphaMap: { value: null }, + alphaMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + alphaTest: { value: 0 } + + } + +}; + +const ShaderLib = { + + basic: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + specular: { value: /*@__PURE__*/ new Color( 0x111111 ) }, + shininess: { value: 30 } + } + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + roughness: { value: 1.0 }, + metalness: { value: 0.0 }, + envMapIntensity: { value: 1 } + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + toon: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) } + } + ] ), + + vertexShader: ShaderChunk.meshtoon_vert, + fragmentShader: ShaderChunk.meshtoon_frag + + }, + + matcap: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } + } + ] ), + + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag + + }, + + points: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.points, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.displacementmap + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ] ), + + vertexShader: ShaderChunk.meshnormal_vert, + fragmentShader: ShaderChunk.meshnormal_frag + + }, + + sprite: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.sprite, + UniformsLib.fog + ] ), + + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag + + }, + + background: { + + uniforms: { + uvTransform: { value: /*@__PURE__*/ new Matrix3() }, + t2D: { value: null }, + backgroundIntensity: { value: 1 } + }, + + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag + + }, + + backgroundCube: { + + uniforms: { + envMap: { value: null }, + flipEnvMap: { value: -1 }, + backgroundBlurriness: { value: 0 }, + backgroundIntensity: { value: 1 }, + backgroundRotation: { value: /*@__PURE__*/ new Matrix3() } + }, + + vertexShader: ShaderChunk.backgroundCube_vert, + fragmentShader: ShaderChunk.backgroundCube_frag + + }, + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: -1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + equirect: { + + uniforms: { + tEquirect: { value: null }, + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: /*@__PURE__*/ new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ] ), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + }, + + shadow: { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: /*@__PURE__*/ new Color( 0x00000 ) }, + opacity: { value: 1.0 } + }, + ] ), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + + } + +}; + +ShaderLib.physical = { + + uniforms: /*@__PURE__*/ mergeUniforms( [ + ShaderLib.standard.uniforms, + { + clearcoat: { value: 0 }, + clearcoatMap: { value: null }, + clearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + clearcoatNormalMap: { value: null }, + clearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + clearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }, + clearcoatRoughness: { value: 0 }, + clearcoatRoughnessMap: { value: null }, + clearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + dispersion: { value: 0 }, + iridescence: { value: 0 }, + iridescenceMap: { value: null }, + iridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + iridescenceIOR: { value: 1.3 }, + iridescenceThicknessMinimum: { value: 100 }, + iridescenceThicknessMaximum: { value: 400 }, + iridescenceThicknessMap: { value: null }, + iridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + sheen: { value: 0 }, + sheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + sheenColorMap: { value: null }, + sheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + sheenRoughness: { value: 1 }, + sheenRoughnessMap: { value: null }, + sheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + transmission: { value: 0 }, + transmissionMap: { value: null }, + transmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + transmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() }, + transmissionSamplerMap: { value: null }, + thickness: { value: 0 }, + thicknessMap: { value: null }, + thicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + attenuationDistance: { value: 0 }, + attenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) }, + specularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) }, + specularColorMap: { value: null }, + specularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + specularIntensity: { value: 1 }, + specularIntensityMap: { value: null }, + specularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + anisotropyVector: { value: /*@__PURE__*/ new Vector2() }, + anisotropyMap: { value: null }, + anisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() }, + } + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + +}; + +const _rgb = { r: 0, b: 0, g: 0 }; +const _e1$1 = /*@__PURE__*/ new Euler(); +const _m1$1 = /*@__PURE__*/ new Matrix4(); + +function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) { + + const clearColor = new Color( 0x000000 ); + let clearAlpha = alpha === true ? 0 : 1; + + let planeMesh; + let boxMesh; + + let currentBackground = null; + let currentBackgroundVersion = 0; + let currentTonemapping = null; + + function getBackground( scene ) { + + let background = scene.isScene === true ? scene.background : null; + + if ( background && background.isTexture ) { + + const usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background + background = ( usePMREM ? cubeuvmaps : cubemaps ).get( background ); + + } + + return background; + + } + + function render( scene ) { + + let forceClear = false; + const background = getBackground( scene ); + + if ( background === null ) { + + setClear( clearColor, clearAlpha ); + + } else if ( background && background.isColor ) { + + setClear( background, 1 ); + forceClear = true; + + } + + const environmentBlendMode = renderer.xr.getEnvironmentBlendMode(); + + if ( environmentBlendMode === 'additive' ) { + + state.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha ); + + } else if ( environmentBlendMode === 'alpha-blend' ) { + + state.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha ); + + } + + if ( renderer.autoClear || forceClear ) { + + // buffers might not be writable which is required to ensure a correct clear + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); + + } + + } + + function addToRenderList( renderList, scene ) { + + const background = getBackground( scene ); + + if ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) { + + if ( boxMesh === undefined ) { + + boxMesh = new Mesh( + new BoxGeometry( 1, 1, 1 ), + new ShaderMaterial( { + name: 'BackgroundCubeMaterial', + uniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ), + vertexShader: ShaderLib.backgroundCube.vertexShader, + fragmentShader: ShaderLib.backgroundCube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + boxMesh.geometry.deleteAttribute( 'normal' ); + boxMesh.geometry.deleteAttribute( 'uv' ); + + boxMesh.onBeforeRender = function ( renderer, scene, camera ) { + + this.matrixWorld.copyPosition( camera.matrixWorld ); + + }; + + // add "envMap" material property so the renderer can evaluate it like for built-in materials + Object.defineProperty( boxMesh.material, 'envMap', { + + get: function () { + + return this.uniforms.envMap.value; + + } + + } ); + + objects.update( boxMesh ); + + } + + _e1$1.copy( scene.backgroundRotation ); + + // accommodate left-handed frame + _e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1; + + if ( background.isCubeTexture && background.isRenderTargetTexture === false ) { + + // environment maps which are not cube render targets or PMREMs follow a different convention + _e1$1.y *= -1; + _e1$1.z *= -1; + + } + + boxMesh.material.uniforms.envMap.value = background; + boxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1; + boxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness; + boxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; + boxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) ); + boxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer; + + if ( currentBackground !== background || + currentBackgroundVersion !== background.version || + currentTonemapping !== renderer.toneMapping ) { + + boxMesh.material.needsUpdate = true; + + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; + + } + + boxMesh.layers.enableAll(); + + // push to the pre-sorted opaque render list + renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null ); + + } else if ( background && background.isTexture ) { + + if ( planeMesh === undefined ) { + + planeMesh = new Mesh( + new PlaneGeometry( 2, 2 ), + new ShaderMaterial( { + name: 'BackgroundMaterial', + uniforms: cloneUniforms( ShaderLib.background.uniforms ), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + planeMesh.geometry.deleteAttribute( 'normal' ); + + // add "map" material property so the renderer can evaluate it like for built-in materials + Object.defineProperty( planeMesh.material, 'map', { + + get: function () { + + return this.uniforms.t2D.value; + + } + + } ); + + objects.update( planeMesh ); + + } + + planeMesh.material.uniforms.t2D.value = background; + planeMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; + planeMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer; + + if ( background.matrixAutoUpdate === true ) { + + background.updateMatrix(); + + } + + planeMesh.material.uniforms.uvTransform.value.copy( background.matrix ); + + if ( currentBackground !== background || + currentBackgroundVersion !== background.version || + currentTonemapping !== renderer.toneMapping ) { + + planeMesh.material.needsUpdate = true; + + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; + + } + + planeMesh.layers.enableAll(); + + // push to the pre-sorted opaque render list + renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null ); + + } + + } + + function setClear( color, alpha ) { + + color.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) ); + + state.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha ); + + } + + function dispose() { + + if ( boxMesh !== undefined ) { + + boxMesh.geometry.dispose(); + boxMesh.material.dispose(); + + boxMesh = undefined; + + } + + if ( planeMesh !== undefined ) { + + planeMesh.geometry.dispose(); + planeMesh.material.dispose(); + + planeMesh = undefined; + + } + + } + + return { + + getClearColor: function () { + + return clearColor; + + }, + setClearColor: function ( color, alpha = 1 ) { + + clearColor.set( color ); + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + getClearAlpha: function () { + + return clearAlpha; + + }, + setClearAlpha: function ( alpha ) { + + clearAlpha = alpha; + setClear( clearColor, clearAlpha ); + + }, + render: render, + addToRenderList: addToRenderList, + dispose: dispose + + }; + +} + +function WebGLBindingStates( gl, attributes ) { + + const maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + + const bindingStates = {}; + + const defaultState = createBindingState( null ); + let currentState = defaultState; + let forceUpdate = false; + + function setup( object, material, program, geometry, index ) { + + let updateBuffers = false; + + const state = getBindingState( geometry, program, material ); + + if ( currentState !== state ) { + + currentState = state; + bindVertexArrayObject( currentState.object ); + + } + + updateBuffers = needsUpdate( object, geometry, program, index ); + + if ( updateBuffers ) saveCache( object, geometry, program, index ); + + if ( index !== null ) { + + attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + if ( updateBuffers || forceUpdate ) { + + forceUpdate = false; + + setupVertexAttributes( object, material, program, geometry ); + + if ( index !== null ) { + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer ); + + } + + } + + } + + function createVertexArrayObject() { + + return gl.createVertexArray(); + + } + + function bindVertexArrayObject( vao ) { + + return gl.bindVertexArray( vao ); + + } + + function deleteVertexArrayObject( vao ) { + + return gl.deleteVertexArray( vao ); + + } + + function getBindingState( geometry, program, material ) { + + const wireframe = ( material.wireframe === true ); + + let programMap = bindingStates[ geometry.id ]; + + if ( programMap === undefined ) { + + programMap = {}; + bindingStates[ geometry.id ] = programMap; + + } + + let stateMap = programMap[ program.id ]; + + if ( stateMap === undefined ) { + + stateMap = {}; + programMap[ program.id ] = stateMap; + + } + + let state = stateMap[ wireframe ]; + + if ( state === undefined ) { + + state = createBindingState( createVertexArrayObject() ); + stateMap[ wireframe ] = state; + + } + + return state; + + } + + function createBindingState( vao ) { + + const newAttributes = []; + const enabledAttributes = []; + const attributeDivisors = []; + + for ( let i = 0; i < maxVertexAttributes; i ++ ) { + + newAttributes[ i ] = 0; + enabledAttributes[ i ] = 0; + attributeDivisors[ i ] = 0; + + } + + return { + + // for backward compatibility on non-VAO support browser + geometry: null, + program: null, + wireframe: false, + + newAttributes: newAttributes, + enabledAttributes: enabledAttributes, + attributeDivisors: attributeDivisors, + object: vao, + attributes: {}, + index: null + + }; + + } + + function needsUpdate( object, geometry, program, index ) { + + const cachedAttributes = currentState.attributes; + const geometryAttributes = geometry.attributes; + + let attributesNum = 0; + + const programAttributes = program.getAttributes(); + + for ( const name in programAttributes ) { + + const programAttribute = programAttributes[ name ]; + + if ( programAttribute.location >= 0 ) { + + const cachedAttribute = cachedAttributes[ name ]; + let geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute === undefined ) { + + if ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix; + if ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor; + + } + + if ( cachedAttribute === undefined ) return true; + + if ( cachedAttribute.attribute !== geometryAttribute ) return true; + + if ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true; + + attributesNum ++; + + } + + } + + if ( currentState.attributesNum !== attributesNum ) return true; + + if ( currentState.index !== index ) return true; + + return false; + + } + + function saveCache( object, geometry, program, index ) { + + const cache = {}; + const attributes = geometry.attributes; + let attributesNum = 0; + + const programAttributes = program.getAttributes(); + + for ( const name in programAttributes ) { + + const programAttribute = programAttributes[ name ]; + + if ( programAttribute.location >= 0 ) { + + let attribute = attributes[ name ]; + + if ( attribute === undefined ) { + + if ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix; + if ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor; + + } + + const data = {}; + data.attribute = attribute; + + if ( attribute && attribute.data ) { + + data.data = attribute.data; + + } + + cache[ name ] = data; + + attributesNum ++; + + } + + } + + currentState.attributes = cache; + currentState.attributesNum = attributesNum; + + currentState.index = index; + + } + + function initAttributes() { + + const newAttributes = currentState.newAttributes; + + for ( let i = 0, il = newAttributes.length; i < il; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + enableAttributeAndDivisor( attribute, 0 ); + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute ) { + + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + const attributeDivisors = currentState.attributeDivisors; + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + gl.vertexAttribDivisor( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + + for ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) { + + if ( integer === true ) { + + gl.vertexAttribIPointer( index, size, type, stride, offset ); + + } else { + + gl.vertexAttribPointer( index, size, type, normalized, stride, offset ); + + } + + } + + function setupVertexAttributes( object, material, program, geometry ) { + + initAttributes(); + + const geometryAttributes = geometry.attributes; + + const programAttributes = program.getAttributes(); + + const materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( const name in programAttributes ) { + + const programAttribute = programAttributes[ name ]; + + if ( programAttribute.location >= 0 ) { + + let geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute === undefined ) { + + if ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix; + if ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor; + + } + + if ( geometryAttribute !== undefined ) { + + const normalized = geometryAttribute.normalized; + const size = geometryAttribute.itemSize; + + const attribute = attributes.get( geometryAttribute ); + + // TODO Attribute may not be available on context restore + + if ( attribute === undefined ) continue; + + const buffer = attribute.buffer; + const type = attribute.type; + const bytesPerElement = attribute.bytesPerElement; + + // check for integer attributes + + const integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType ); + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + const data = geometryAttribute.data; + const stride = data.stride; + const offset = geometryAttribute.offset; + + if ( data.isInstancedInterleavedBuffer ) { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute ); + + } + + if ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) { + + geometry._maxInstanceCount = data.meshPerAttribute * data.count; + + } + + } else { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttribute( programAttribute.location + i ); + + } + + } + + gl.bindBuffer( gl.ARRAY_BUFFER, buffer ); + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + stride * bytesPerElement, + ( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement, + integer + ); + + } + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute ); + + } + + if ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) { + + geometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + enableAttribute( programAttribute.location + i ); + + } + + } + + gl.bindBuffer( gl.ARRAY_BUFFER, buffer ); + + for ( let i = 0; i < programAttribute.locationSize; i ++ ) { + + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + size * bytesPerElement, + ( size / programAttribute.locationSize ) * i * bytesPerElement, + integer + ); + + } + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + const value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + gl.vertexAttrib2fv( programAttribute.location, value ); + break; + + case 3: + gl.vertexAttrib3fv( programAttribute.location, value ); + break; + + case 4: + gl.vertexAttrib4fv( programAttribute.location, value ); + break; + + default: + gl.vertexAttrib1fv( programAttribute.location, value ); + + } + + } + + } + + } + + } + + disableUnusedAttributes(); + + } + + function dispose() { + + reset(); + + for ( const geometryId in bindingStates ) { + + const programMap = bindingStates[ geometryId ]; + + for ( const programId in programMap ) { + + const stateMap = programMap[ programId ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ programId ]; + + } + + delete bindingStates[ geometryId ]; + + } + + } + + function releaseStatesOfGeometry( geometry ) { + + if ( bindingStates[ geometry.id ] === undefined ) return; + + const programMap = bindingStates[ geometry.id ]; + + for ( const programId in programMap ) { + + const stateMap = programMap[ programId ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ programId ]; + + } + + delete bindingStates[ geometry.id ]; + + } + + function releaseStatesOfProgram( program ) { + + for ( const geometryId in bindingStates ) { + + const programMap = bindingStates[ geometryId ]; + + if ( programMap[ program.id ] === undefined ) continue; + + const stateMap = programMap[ program.id ]; + + for ( const wireframe in stateMap ) { + + deleteVertexArrayObject( stateMap[ wireframe ].object ); + + delete stateMap[ wireframe ]; + + } + + delete programMap[ program.id ]; + + } + + } + + function reset() { + + resetDefaultState(); + forceUpdate = true; + + if ( currentState === defaultState ) return; + + currentState = defaultState; + bindVertexArrayObject( currentState.object ); + + } + + // for backward-compatibility + + function resetDefaultState() { + + defaultState.geometry = null; + defaultState.program = null; + defaultState.wireframe = false; + + } + + return { + + setup: setup, + reset: reset, + resetDefaultState: resetDefaultState, + dispose: dispose, + releaseStatesOfGeometry: releaseStatesOfGeometry, + releaseStatesOfProgram: releaseStatesOfProgram, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + disableUnusedAttributes: disableUnusedAttributes + + }; + +} + +function WebGLBufferRenderer( gl, extensions, info ) { + + let mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + info.update( count, mode, 1 ); + + } + + function renderInstances( start, count, primcount ) { + + if ( primcount === 0 ) return; + + gl.drawArraysInstanced( mode, start, count, primcount ); + + info.update( count, mode, primcount ); + + } + + function renderMultiDraw( starts, counts, drawCount ) { + + if ( drawCount === 0 ) return; + + const extension = extensions.get( 'WEBGL_multi_draw' ); + extension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount ); + + let elementCount = 0; + for ( let i = 0; i < drawCount; i ++ ) { + + elementCount += counts[ i ]; + + } + + info.update( elementCount, mode, 1 ); + + } + + function renderMultiDrawInstances( starts, counts, drawCount, primcount ) { + + if ( drawCount === 0 ) return; + + const extension = extensions.get( 'WEBGL_multi_draw' ); + + if ( extension === null ) { + + for ( let i = 0; i < starts.length; i ++ ) { + + renderInstances( starts[ i ], counts[ i ], primcount[ i ] ); + + } + + } else { + + extension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount ); + + let elementCount = 0; + for ( let i = 0; i < drawCount; i ++ ) { + + elementCount += counts[ i ] * primcount[ i ]; + + } + + info.update( elementCount, mode, 1 ); + + } + + } + + // + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + this.renderMultiDraw = renderMultiDraw; + this.renderMultiDrawInstances = renderMultiDrawInstances; + +} + +function WebGLCapabilities( gl, extensions, parameters, utils ) { + + let maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) { + + const extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function textureFormatReadable( textureFormat ) { + + if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + return false; + + } + + return true; + + } + + function textureTypeReadable( textureType ) { + + const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ); + + if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513) + textureType !== FloatType && ! halfFloatSupportedByExt ) { + + return false; + + } + + return true; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + let precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + const maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + const reverseDepthBuffer = parameters.reverseDepthBuffer === true && extensions.has( 'EXT_clip_control' ); + + const maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + const maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + const maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + const maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + const maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + const maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + const maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + const maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + const vertexTextures = maxVertexTextures > 0; + + const maxSamples = gl.getParameter( gl.MAX_SAMPLES ); + + return { + + isWebGL2: true, // keeping this for backwards compatibility + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + textureFormatReadable: textureFormatReadable, + textureTypeReadable: textureTypeReadable, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + reverseDepthBuffer: reverseDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + + maxSamples: maxSamples + + }; + +} + +function WebGLClipping( properties ) { + + const scope = this; + + let globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false; + + const plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function ( planes, enableLocalClipping ) { + + const enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function () { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function () { + + renderingShadows = false; + + }; + + this.setGlobalState = function ( planes, camera ) { + + globalState = projectPlanes( planes, camera, 0 ); + + }; + + this.setState = function ( material, camera, useCache ) { + + const planes = material.clippingPlanes, + clipIntersection = material.clipIntersection, + clipShadows = material.clipShadows; + + const materialProperties = properties.get( material ); + + if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { + + // there's no local clipping + + if ( renderingShadows ) { + + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + + } + + } else { + + const nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4; + + let dstArray = materialProperties.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, useCache ); + + for ( let i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + materialProperties.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + const nPlanes = planes !== null ? planes.length : 0; + let dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + const flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + scope.numIntersection = 0; + + return dstArray; + + } + +} + +function WebGLCubeMaps( renderer ) { + + let cubemaps = new WeakMap(); + + function mapTextureMapping( texture, mapping ) { + + if ( mapping === EquirectangularReflectionMapping ) { + + texture.mapping = CubeReflectionMapping; + + } else if ( mapping === EquirectangularRefractionMapping ) { + + texture.mapping = CubeRefractionMapping; + + } + + return texture; + + } + + function get( texture ) { + + if ( texture && texture.isTexture ) { + + const mapping = texture.mapping; + + if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) { + + if ( cubemaps.has( texture ) ) { + + const cubemap = cubemaps.get( texture ).texture; + return mapTextureMapping( cubemap, texture.mapping ); + + } else { + + const image = texture.image; + + if ( image && image.height > 0 ) { + + const renderTarget = new WebGLCubeRenderTarget( image.height ); + renderTarget.fromEquirectangularTexture( renderer, texture ); + cubemaps.set( texture, renderTarget ); + + texture.addEventListener( 'dispose', onTextureDispose ); + + return mapTextureMapping( renderTarget.texture, texture.mapping ); + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + return texture; + + } + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + const cubemap = cubemaps.get( texture ); + + if ( cubemap !== undefined ) { + + cubemaps.delete( texture ); + cubemap.dispose(); + + } + + } + + function dispose() { + + cubemaps = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + +} + +const LOD_MIN = 4; + +// The standard deviations (radians) associated with the extra mips. These are +// chosen to approximate a Trowbridge-Reitz distribution function times the +// geometric shadowing function. These sigma values squared must match the +// variance #defines in cube_uv_reflection_fragment.glsl.js. +const EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ]; + +// The maximum length of the blur for loop. Smaller sigmas will use fewer +// samples and exit early, but not recompile the shader. +const MAX_SAMPLES$1 = 20; + +const _flatCamera = /*@__PURE__*/ new OrthographicCamera(); +const _clearColor = /*@__PURE__*/ new Color(); +let _oldTarget = null; +let _oldActiveCubeFace = 0; +let _oldActiveMipmapLevel = 0; +let _oldXrEnabled = false; + +// Golden Ratio +const PHI = ( 1 + Math.sqrt( 5 ) ) / 2; +const INV_PHI = 1 / PHI; + +// Vertices of a dodecahedron (except the opposites, which represent the +// same axis), used as axis directions evenly spread on a sphere. +const _axisDirections = [ + /*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ), + /*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ), + /*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ), + /*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ), + /*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ), + /*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ), + /*@__PURE__*/ new Vector3( -1, 1, -1 ), + /*@__PURE__*/ new Vector3( 1, 1, -1 ), + /*@__PURE__*/ new Vector3( -1, 1, 1 ), + /*@__PURE__*/ new Vector3( 1, 1, 1 ) ]; + +const _origin = /*@__PURE__*/ new Vector3(); + +/** + * This class generates a Prefiltered, Mipmapped Radiance Environment Map + * (PMREM) from a cubeMap environment texture. This allows different levels of + * blur to be quickly accessed based on material roughness. It is packed into a + * special CubeUV format that allows us to perform custom interpolation so that + * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap + * chain, it only goes down to the LOD_MIN level (above), and then creates extra + * even more filtered 'mips' at the same LOD_MIN resolution, associated with + * higher roughness levels. In this way we maintain resolution to smoothly + * interpolate diffuse lighting while limiting sampling computation. + * + * Paper: Fast, Accurate Image-Based Lighting + * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view +*/ + +class PMREMGenerator { + + constructor( renderer ) { + + this._renderer = renderer; + this._pingPongRenderTarget = null; + + this._lodMax = 0; + this._cubeSize = 0; + this._lodPlanes = []; + this._sizeLods = []; + this._sigmas = []; + + this._blurMaterial = null; + this._cubemapMaterial = null; + this._equirectMaterial = null; + + this._compileMaterial( this._blurMaterial ); + + } + + /** + * Generates a PMREM from a supplied Scene, which can be faster than using an + * image if networking bandwidth is low. Optional sigma specifies a blur radius + * in radians to be applied to the scene before PMREM generation. Optional near + * and far planes ensure the scene is rendered in its entirety. + * + * @param {Scene} scene + * @param {number} sigma + * @param {number} near + * @param {number} far + * @param {Object} [options={}] + * @return {WebGLRenderTarget} + */ + fromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) { + + const { + size = 256, + position = _origin, + } = options; + + _oldTarget = this._renderer.getRenderTarget(); + _oldActiveCubeFace = this._renderer.getActiveCubeFace(); + _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); + _oldXrEnabled = this._renderer.xr.enabled; + + this._renderer.xr.enabled = false; + + this._setSize( size ); + + const cubeUVRenderTarget = this._allocateTargets(); + cubeUVRenderTarget.depthBuffer = true; + + this._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ); + + if ( sigma > 0 ) { + + this._blur( cubeUVRenderTarget, 0, 0, sigma ); + + } + + this._applyPMREM( cubeUVRenderTarget ); + this._cleanup( cubeUVRenderTarget ); + + return cubeUVRenderTarget; + + } + + /** + * Generates a PMREM from an equirectangular texture, which can be either LDR + * or HDR. The ideal input image size is 1k (1024 x 512), + * as this matches best with the 256 x 256 cubemap output. + * The smallest supported equirectangular image size is 64 x 32. + * + * @param {Texture} equirectangular + * @param {?WebGLRenderTarget} [renderTarget=null] - Optional render target. + * @return {WebGLRenderTarget} + */ + fromEquirectangular( equirectangular, renderTarget = null ) { + + return this._fromTexture( equirectangular, renderTarget ); + + } + + /** + * Generates a PMREM from an cubemap texture, which can be either LDR + * or HDR. The ideal input cube size is 256 x 256, + * as this matches best with the 256 x 256 cubemap output. + * The smallest supported cube size is 16 x 16. + * + * @param {Texture} cubemap + * @param {null} [renderTarget=null] - Optional render target. + * @return {WebGLRenderTarget} + */ + fromCubemap( cubemap, renderTarget = null ) { + + return this._fromTexture( cubemap, renderTarget ); + + } + + /** + * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileCubemapShader() { + + if ( this._cubemapMaterial === null ) { + + this._cubemapMaterial = _getCubemapMaterial(); + this._compileMaterial( this._cubemapMaterial ); + + } + + } + + /** + * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileEquirectangularShader() { + + if ( this._equirectMaterial === null ) { + + this._equirectMaterial = _getEquirectMaterial(); + this._compileMaterial( this._equirectMaterial ); + + } + + } + + /** + * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class, + * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on + * one of them will cause any others to also become unusable. + */ + dispose() { + + this._dispose(); + + if ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose(); + if ( this._equirectMaterial !== null ) this._equirectMaterial.dispose(); + + } + + // private interface + + _setSize( cubeSize ) { + + this._lodMax = Math.floor( Math.log2( cubeSize ) ); + this._cubeSize = Math.pow( 2, this._lodMax ); + + } + + _dispose() { + + if ( this._blurMaterial !== null ) this._blurMaterial.dispose(); + + if ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose(); + + for ( let i = 0; i < this._lodPlanes.length; i ++ ) { + + this._lodPlanes[ i ].dispose(); + + } + + } + + _cleanup( outputTarget ) { + + this._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel ); + this._renderer.xr.enabled = _oldXrEnabled; + + outputTarget.scissorTest = false; + _setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height ); + + } + + _fromTexture( texture, renderTarget ) { + + if ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) { + + this._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) ); + + } else { // Equirectangular + + this._setSize( texture.image.width / 4 ); + + } + + _oldTarget = this._renderer.getRenderTarget(); + _oldActiveCubeFace = this._renderer.getActiveCubeFace(); + _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); + _oldXrEnabled = this._renderer.xr.enabled; + + this._renderer.xr.enabled = false; + + const cubeUVRenderTarget = renderTarget || this._allocateTargets(); + this._textureToCubeUV( texture, cubeUVRenderTarget ); + this._applyPMREM( cubeUVRenderTarget ); + this._cleanup( cubeUVRenderTarget ); + + return cubeUVRenderTarget; + + } + + _allocateTargets() { + + const width = 3 * Math.max( this._cubeSize, 16 * 7 ); + const height = 4 * this._cubeSize; + + const params = { + magFilter: LinearFilter, + minFilter: LinearFilter, + generateMipmaps: false, + type: HalfFloatType, + format: RGBAFormat, + colorSpace: LinearSRGBColorSpace, + depthBuffer: false + }; + + const cubeUVRenderTarget = _createRenderTarget( width, height, params ); + + if ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) { + + if ( this._pingPongRenderTarget !== null ) { + + this._dispose(); + + } + + this._pingPongRenderTarget = _createRenderTarget( width, height, params ); + + const { _lodMax } = this; + ( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) ); + + this._blurMaterial = _getBlurShader( _lodMax, width, height ); + + } + + return cubeUVRenderTarget; + + } + + _compileMaterial( material ) { + + const tmpMesh = new Mesh( this._lodPlanes[ 0 ], material ); + this._renderer.compile( tmpMesh, _flatCamera ); + + } + + _sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) { + + const fov = 90; + const aspect = 1; + const cubeCamera = new PerspectiveCamera( fov, aspect, near, far ); + const upSign = [ 1, -1, 1, 1, 1, 1 ]; + const forwardSign = [ 1, 1, 1, -1, -1, -1 ]; + const renderer = this._renderer; + + const originalAutoClear = renderer.autoClear; + const toneMapping = renderer.toneMapping; + renderer.getClearColor( _clearColor ); + + renderer.toneMapping = NoToneMapping; + renderer.autoClear = false; + + const backgroundMaterial = new MeshBasicMaterial( { + name: 'PMREM.Background', + side: BackSide, + depthWrite: false, + depthTest: false, + } ); + + const backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial ); + + let useSolidColor = false; + const background = scene.background; + + if ( background ) { + + if ( background.isColor ) { + + backgroundMaterial.color.copy( background ); + scene.background = null; + useSolidColor = true; + + } + + } else { + + backgroundMaterial.color.copy( _clearColor ); + useSolidColor = true; + + } + + for ( let i = 0; i < 6; i ++ ) { + + const col = i % 3; + + if ( col === 0 ) { + + cubeCamera.up.set( 0, upSign[ i ], 0 ); + cubeCamera.position.set( position.x, position.y, position.z ); + cubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z ); + + } else if ( col === 1 ) { + + cubeCamera.up.set( 0, 0, upSign[ i ] ); + cubeCamera.position.set( position.x, position.y, position.z ); + cubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z ); + + + } else { + + cubeCamera.up.set( 0, upSign[ i ], 0 ); + cubeCamera.position.set( position.x, position.y, position.z ); + cubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] ); + + } + + const size = this._cubeSize; + + _setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size ); + + renderer.setRenderTarget( cubeUVRenderTarget ); + + if ( useSolidColor ) { + + renderer.render( backgroundBox, cubeCamera ); + + } + + renderer.render( scene, cubeCamera ); + + } + + backgroundBox.geometry.dispose(); + backgroundBox.material.dispose(); + + renderer.toneMapping = toneMapping; + renderer.autoClear = originalAutoClear; + scene.background = background; + + } + + _textureToCubeUV( texture, cubeUVRenderTarget ) { + + const renderer = this._renderer; + + const isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ); + + if ( isCubeTexture ) { + + if ( this._cubemapMaterial === null ) { + + this._cubemapMaterial = _getCubemapMaterial(); + + } + + this._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1; + + } else { + + if ( this._equirectMaterial === null ) { + + this._equirectMaterial = _getEquirectMaterial(); + + } + + } + + const material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial; + const mesh = new Mesh( this._lodPlanes[ 0 ], material ); + + const uniforms = material.uniforms; + + uniforms[ 'envMap' ].value = texture; + + const size = this._cubeSize; + + _setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size ); + + renderer.setRenderTarget( cubeUVRenderTarget ); + renderer.render( mesh, _flatCamera ); + + } + + _applyPMREM( cubeUVRenderTarget ) { + + const renderer = this._renderer; + const autoClear = renderer.autoClear; + renderer.autoClear = false; + const n = this._lodPlanes.length; + + for ( let i = 1; i < n; i ++ ) { + + const sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] ); + + const poleAxis = _axisDirections[ ( n - i - 1 ) % _axisDirections.length ]; + + this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis ); + + } + + renderer.autoClear = autoClear; + + } + + /** + * This is a two-pass Gaussian blur for a cubemap. Normally this is done + * vertically and horizontally, but this breaks down on a cube. Here we apply + * the blur latitudinally (around the poles), and then longitudinally (towards + * the poles) to approximate the orthogonally-separable blur. It is least + * accurate at the poles, but still does a decent job. + * + * @param {WebGLRenderTarget} cubeUVRenderTarget + * @param {number} lodIn + * @param {number} lodOut + * @param {number} sigma + * @param {Vector3} [poleAxis] + */ + _blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) { + + const pingPongRenderTarget = this._pingPongRenderTarget; + + this._halfBlur( + cubeUVRenderTarget, + pingPongRenderTarget, + lodIn, + lodOut, + sigma, + 'latitudinal', + poleAxis ); + + this._halfBlur( + pingPongRenderTarget, + cubeUVRenderTarget, + lodOut, + lodOut, + sigma, + 'longitudinal', + poleAxis ); + + } + + _halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) { + + const renderer = this._renderer; + const blurMaterial = this._blurMaterial; + + if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) { + + console.error( + 'blur direction must be either latitudinal or longitudinal!' ); + + } + + // Number of standard deviations at which to cut off the discrete approximation. + const STANDARD_DEVIATIONS = 3; + + const blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial ); + const blurUniforms = blurMaterial.uniforms; + + const pixels = this._sizeLods[ lodIn ] - 1; + const radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES$1 - 1 ); + const sigmaPixels = sigmaRadians / radiansPerPixel; + const samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES$1; + + if ( samples > MAX_SAMPLES$1 ) { + + console.warn( `sigmaRadians, ${ + sigmaRadians}, is too large and will clip, as it requested ${ + samples} samples when the maximum is set to ${MAX_SAMPLES$1}` ); + + } + + const weights = []; + let sum = 0; + + for ( let i = 0; i < MAX_SAMPLES$1; ++ i ) { + + const x = i / sigmaPixels; + const weight = Math.exp( - x * x / 2 ); + weights.push( weight ); + + if ( i === 0 ) { + + sum += weight; + + } else if ( i < samples ) { + + sum += 2 * weight; + + } + + } + + for ( let i = 0; i < weights.length; i ++ ) { + + weights[ i ] = weights[ i ] / sum; + + } + + blurUniforms[ 'envMap' ].value = targetIn.texture; + blurUniforms[ 'samples' ].value = samples; + blurUniforms[ 'weights' ].value = weights; + blurUniforms[ 'latitudinal' ].value = direction === 'latitudinal'; + + if ( poleAxis ) { + + blurUniforms[ 'poleAxis' ].value = poleAxis; + + } + + const { _lodMax } = this; + blurUniforms[ 'dTheta' ].value = radiansPerPixel; + blurUniforms[ 'mipInt' ].value = _lodMax - lodIn; + + const outputSize = this._sizeLods[ lodOut ]; + const x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 ); + const y = 4 * ( this._cubeSize - outputSize ); + + _setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize ); + renderer.setRenderTarget( targetOut ); + renderer.render( blurMesh, _flatCamera ); + + } + +} + + + +function _createPlanes( lodMax ) { + + const lodPlanes = []; + const sizeLods = []; + const sigmas = []; + + let lod = lodMax; + + const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length; + + for ( let i = 0; i < totalLods; i ++ ) { + + const sizeLod = Math.pow( 2, lod ); + sizeLods.push( sizeLod ); + let sigma = 1.0 / sizeLod; + + if ( i > lodMax - LOD_MIN ) { + + sigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ]; + + } else if ( i === 0 ) { + + sigma = 0; + + } + + sigmas.push( sigma ); + + const texelSize = 1.0 / ( sizeLod - 2 ); + const min = - texelSize; + const max = 1 + texelSize; + const uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ]; + + const cubeFaces = 6; + const vertices = 6; + const positionSize = 3; + const uvSize = 2; + const faceIndexSize = 1; + + const position = new Float32Array( positionSize * vertices * cubeFaces ); + const uv = new Float32Array( uvSize * vertices * cubeFaces ); + const faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces ); + + for ( let face = 0; face < cubeFaces; face ++ ) { + + const x = ( face % 3 ) * 2 / 3 - 1; + const y = face > 2 ? 0 : -1; + const coordinates = [ + x, y, 0, + x + 2 / 3, y, 0, + x + 2 / 3, y + 1, 0, + x, y, 0, + x + 2 / 3, y + 1, 0, + x, y + 1, 0 + ]; + position.set( coordinates, positionSize * vertices * face ); + uv.set( uv1, uvSize * vertices * face ); + const fill = [ face, face, face, face, face, face ]; + faceIndex.set( fill, faceIndexSize * vertices * face ); + + } + + const planes = new BufferGeometry(); + planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) ); + planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) ); + planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) ); + lodPlanes.push( planes ); + + if ( lod > LOD_MIN ) { + + lod --; + + } + + } + + return { lodPlanes, sizeLods, sigmas }; + +} + +function _createRenderTarget( width, height, params ) { + + const cubeUVRenderTarget = new WebGLRenderTarget( width, height, params ); + cubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping; + cubeUVRenderTarget.texture.name = 'PMREM.cubeUv'; + cubeUVRenderTarget.scissorTest = true; + return cubeUVRenderTarget; + +} + +function _setViewport( target, x, y, width, height ) { + + target.viewport.set( x, y, width, height ); + target.scissor.set( x, y, width, height ); + +} + +function _getBlurShader( lodMax, width, height ) { + + const weights = new Float32Array( MAX_SAMPLES$1 ); + const poleAxis = new Vector3( 0, 1, 0 ); + const shaderMaterial = new ShaderMaterial( { + + name: 'SphericalGaussianBlur', + + defines: { + 'n': MAX_SAMPLES$1, + 'CUBEUV_TEXEL_WIDTH': 1.0 / width, + 'CUBEUV_TEXEL_HEIGHT': 1.0 / height, + 'CUBEUV_MAX_MIP': `${lodMax}.0`, + }, + + uniforms: { + 'envMap': { value: null }, + 'samples': { value: 1 }, + 'weights': { value: weights }, + 'latitudinal': { value: false }, + 'dTheta': { value: 0 }, + 'mipInt': { value: 0 }, + 'poleAxis': { value: poleAxis } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform int samples; + uniform float weights[ n ]; + uniform bool latitudinal; + uniform float dTheta; + uniform float mipInt; + uniform vec3 poleAxis; + + #define ENVMAP_TYPE_CUBE_UV + #include + + vec3 getSample( float theta, vec3 axis ) { + + float cosTheta = cos( theta ); + // Rodrigues' axis-angle rotation + vec3 sampleDirection = vOutputDirection * cosTheta + + cross( axis, vOutputDirection ) * sin( theta ) + + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); + + return bilinearCubeUV( envMap, sampleDirection, mipInt ); + + } + + void main() { + + vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); + + if ( all( equal( axis, vec3( 0.0 ) ) ) ) { + + axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); + + } + + axis = normalize( axis ); + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); + + for ( int i = 1; i < n; i++ ) { + + if ( i >= samples ) { + + break; + + } + + float theta = dTheta * float( i ); + gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); + gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); + + } + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + + return shaderMaterial; + +} + +function _getEquirectMaterial() { + + return new ShaderMaterial( { + + name: 'EquirectangularToCubeUV', + + uniforms: { + 'envMap': { value: null } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + + #include + + void main() { + + vec3 outputDirection = normalize( vOutputDirection ); + vec2 uv = equirectUv( outputDirection ); + + gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + +} + +function _getCubemapMaterial() { + + return new ShaderMaterial( { + + name: 'CubemapToCubeUV', + + uniforms: { + 'envMap': { value: null }, + 'flipEnvMap': { value: -1 } + }, + + vertexShader: _getCommonVertexShader(), + + fragmentShader: /* glsl */` + + precision mediump float; + precision mediump int; + + uniform float flipEnvMap; + + varying vec3 vOutputDirection; + + uniform samplerCube envMap; + + void main() { + + gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); + + } + `, + + blending: NoBlending, + depthTest: false, + depthWrite: false + + } ); + +} + +function _getCommonVertexShader() { + + return /* glsl */` + + precision mediump float; + precision mediump int; + + attribute float faceIndex; + + varying vec3 vOutputDirection; + + // RH coordinate system; PMREM face-indexing convention + vec3 getDirection( vec2 uv, float face ) { + + uv = 2.0 * uv - 1.0; + + vec3 direction = vec3( uv, 1.0 ); + + if ( face == 0.0 ) { + + direction = direction.zyx; // ( 1, v, u ) pos x + + } else if ( face == 1.0 ) { + + direction = direction.xzy; + direction.xz *= -1.0; // ( -u, 1, -v ) pos y + + } else if ( face == 2.0 ) { + + direction.x *= -1.0; // ( -u, v, 1 ) pos z + + } else if ( face == 3.0 ) { + + direction = direction.zyx; + direction.xz *= -1.0; // ( -1, v, -u ) neg x + + } else if ( face == 4.0 ) { + + direction = direction.xzy; + direction.xy *= -1.0; // ( -u, -1, v ) neg y + + } else if ( face == 5.0 ) { + + direction.z *= -1.0; // ( u, v, -1 ) neg z + + } + + return direction; + + } + + void main() { + + vOutputDirection = getDirection( uv, faceIndex ); + gl_Position = vec4( position, 1.0 ); + + } + `; + +} + +function WebGLCubeUVMaps( renderer ) { + + let cubeUVmaps = new WeakMap(); + + let pmremGenerator = null; + + function get( texture ) { + + if ( texture && texture.isTexture ) { + + const mapping = texture.mapping; + + const isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ); + const isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping ); + + // equirect/cube map to cubeUV conversion + + if ( isEquirectMap || isCubeMap ) { + + let renderTarget = cubeUVmaps.get( texture ); + + const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0; + + if ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) { + + if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer ); + + renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget ); + renderTarget.texture.pmremVersion = texture.pmremVersion; + + cubeUVmaps.set( texture, renderTarget ); + + return renderTarget.texture; + + } else { + + if ( renderTarget !== undefined ) { + + return renderTarget.texture; + + } else { + + const image = texture.image; + + if ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) { + + if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer ); + + renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture ); + renderTarget.texture.pmremVersion = texture.pmremVersion; + + cubeUVmaps.set( texture, renderTarget ); + + texture.addEventListener( 'dispose', onTextureDispose ); + + return renderTarget.texture; + + } else { + + // image not yet ready. try the conversion next frame + + return null; + + } + + } + + } + + } + + } + + return texture; + + } + + function isCubeTextureComplete( image ) { + + let count = 0; + const length = 6; + + for ( let i = 0; i < length; i ++ ) { + + if ( image[ i ] !== undefined ) count ++; + + } + + return count === length; + + + } + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + const cubemapUV = cubeUVmaps.get( texture ); + + if ( cubemapUV !== undefined ) { + + cubeUVmaps.delete( texture ); + cubemapUV.dispose(); + + } + + } + + function dispose() { + + cubeUVmaps = new WeakMap(); + + if ( pmremGenerator !== null ) { + + pmremGenerator.dispose(); + pmremGenerator = null; + + } + + } + + return { + get: get, + dispose: dispose + }; + +} + +function WebGLExtensions( gl ) { + + const extensions = {}; + + function getExtension( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + let extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + return { + + has: function ( name ) { + + return getExtension( name ) !== null; + + }, + + init: function () { + + getExtension( 'EXT_color_buffer_float' ); + getExtension( 'WEBGL_clip_cull_distance' ); + getExtension( 'OES_texture_float_linear' ); + getExtension( 'EXT_color_buffer_half_float' ); + getExtension( 'WEBGL_multisampled_render_to_texture' ); + getExtension( 'WEBGL_render_shared_exponent' ); + + }, + + get: function ( name ) { + + const extension = getExtension( name ); + + if ( extension === null ) { + + warnOnce( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + return extension; + + } + + }; + +} + +function WebGLGeometries( gl, attributes, info, bindingStates ) { + + const geometries = {}; + const wireframeAttributes = new WeakMap(); + + function onGeometryDispose( event ) { + + const geometry = event.target; + + if ( geometry.index !== null ) { + + attributes.remove( geometry.index ); + + } + + for ( const name in geometry.attributes ) { + + attributes.remove( geometry.attributes[ name ] ); + + } + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + const attribute = wireframeAttributes.get( geometry ); + + if ( attribute ) { + + attributes.remove( attribute ); + wireframeAttributes.delete( geometry ); + + } + + bindingStates.releaseStatesOfGeometry( geometry ); + + if ( geometry.isInstancedBufferGeometry === true ) { + + delete geometry._maxInstanceCount; + + } + + // + + info.memory.geometries --; + + } + + function get( object, geometry ) { + + if ( geometries[ geometry.id ] === true ) return geometry; + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + geometries[ geometry.id ] = true; + + info.memory.geometries ++; + + return geometry; + + } + + function update( geometry ) { + + const geometryAttributes = geometry.attributes; + + // Updating index buffer in VAO now. See WebGLBindingStates. + + for ( const name in geometryAttributes ) { + + attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); + + } + + } + + function updateWireframeAttribute( geometry ) { + + const indices = []; + + const geometryIndex = geometry.index; + const geometryPosition = geometry.attributes.position; + let version = 0; + + if ( geometryIndex !== null ) { + + const array = geometryIndex.array; + version = geometryIndex.version; + + for ( let i = 0, l = array.length; i < l; i += 3 ) { + + const a = array[ i + 0 ]; + const b = array[ i + 1 ]; + const c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else if ( geometryPosition !== undefined ) { + + const array = geometryPosition.array; + version = geometryPosition.version; + + for ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + const a = i + 0; + const b = i + 1; + const c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + return; + + } + + const attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 ); + attribute.version = version; + + // Updating index buffer in VAO now. See WebGLBindingStates + + // + + const previousAttribute = wireframeAttributes.get( geometry ); + + if ( previousAttribute ) attributes.remove( previousAttribute ); + + // + + wireframeAttributes.set( geometry, attribute ); + + } + + function getWireframeAttribute( geometry ) { + + const currentAttribute = wireframeAttributes.get( geometry ); + + if ( currentAttribute ) { + + const geometryIndex = geometry.index; + + if ( geometryIndex !== null ) { + + // if the attribute is obsolete, create a new one + + if ( currentAttribute.version < geometryIndex.version ) { + + updateWireframeAttribute( geometry ); + + } + + } + + } else { + + updateWireframeAttribute( geometry ); + + } + + return wireframeAttributes.get( geometry ); + + } + + return { + + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + + }; + +} + +function WebGLIndexedBufferRenderer( gl, extensions, info ) { + + let mode; + + function setMode( value ) { + + mode = value; + + } + + let type, bytesPerElement; + + function setIndex( value ) { + + type = value.type; + bytesPerElement = value.bytesPerElement; + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * bytesPerElement ); + + info.update( count, mode, 1 ); + + } + + function renderInstances( start, count, primcount ) { + + if ( primcount === 0 ) return; + + gl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount ); + + info.update( count, mode, primcount ); + + } + + function renderMultiDraw( starts, counts, drawCount ) { + + if ( drawCount === 0 ) return; + + const extension = extensions.get( 'WEBGL_multi_draw' ); + extension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount ); + + let elementCount = 0; + for ( let i = 0; i < drawCount; i ++ ) { + + elementCount += counts[ i ]; + + } + + info.update( elementCount, mode, 1 ); + + + } + + function renderMultiDrawInstances( starts, counts, drawCount, primcount ) { + + if ( drawCount === 0 ) return; + + const extension = extensions.get( 'WEBGL_multi_draw' ); + + if ( extension === null ) { + + for ( let i = 0; i < starts.length; i ++ ) { + + renderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] ); + + } + + } else { + + extension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount ); + + let elementCount = 0; + for ( let i = 0; i < drawCount; i ++ ) { + + elementCount += counts[ i ] * primcount[ i ]; + + } + + info.update( elementCount, mode, 1 ); + + } + + } + + // + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + this.renderMultiDraw = renderMultiDraw; + this.renderMultiDrawInstances = renderMultiDrawInstances; + +} + +function WebGLInfo( gl ) { + + const memory = { + geometries: 0, + textures: 0 + }; + + const render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + + function update( count, mode, instanceCount ) { + + render.calls ++; + + switch ( mode ) { + + case gl.TRIANGLES: + render.triangles += instanceCount * ( count / 3 ); + break; + + case gl.LINES: + render.lines += instanceCount * ( count / 2 ); + break; + + case gl.LINE_STRIP: + render.lines += instanceCount * ( count - 1 ); + break; + + case gl.LINE_LOOP: + render.lines += instanceCount * count; + break; + + case gl.POINTS: + render.points += instanceCount * count; + break; + + default: + console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode ); + break; + + } + + } + + function reset() { + + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + + } + + return { + memory: memory, + render: render, + programs: null, + autoReset: true, + reset: reset, + update: update + }; + +} + +function WebGLMorphtargets( gl, capabilities, textures ) { + + const morphTextures = new WeakMap(); + const morph = new Vector4(); + + function update( object, geometry, program ) { + + const objectInfluences = object.morphTargetInfluences; + + // the following encodes morph targets into an array of data textures. Each layer represents a single morph target. + + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0; + + let entry = morphTextures.get( geometry ); + + if ( entry === undefined || entry.count !== morphTargetsCount ) { + + if ( entry !== undefined ) entry.texture.dispose(); + + const hasMorphPosition = geometry.morphAttributes.position !== undefined; + const hasMorphNormals = geometry.morphAttributes.normal !== undefined; + const hasMorphColors = geometry.morphAttributes.color !== undefined; + + const morphTargets = geometry.morphAttributes.position || []; + const morphNormals = geometry.morphAttributes.normal || []; + const morphColors = geometry.morphAttributes.color || []; + + let vertexDataCount = 0; + + if ( hasMorphPosition === true ) vertexDataCount = 1; + if ( hasMorphNormals === true ) vertexDataCount = 2; + if ( hasMorphColors === true ) vertexDataCount = 3; + + let width = geometry.attributes.position.count * vertexDataCount; + let height = 1; + + if ( width > capabilities.maxTextureSize ) { + + height = Math.ceil( width / capabilities.maxTextureSize ); + width = capabilities.maxTextureSize; + + } + + const buffer = new Float32Array( width * height * 4 * morphTargetsCount ); + + const texture = new DataArrayTexture( buffer, width, height, morphTargetsCount ); + texture.type = FloatType; + texture.needsUpdate = true; + + // fill buffer + + const vertexDataStride = vertexDataCount * 4; + + for ( let i = 0; i < morphTargetsCount; i ++ ) { + + const morphTarget = morphTargets[ i ]; + const morphNormal = morphNormals[ i ]; + const morphColor = morphColors[ i ]; + + const offset = width * height * 4 * i; + + for ( let j = 0; j < morphTarget.count; j ++ ) { + + const stride = j * vertexDataStride; + + if ( hasMorphPosition === true ) { + + morph.fromBufferAttribute( morphTarget, j ); + + buffer[ offset + stride + 0 ] = morph.x; + buffer[ offset + stride + 1 ] = morph.y; + buffer[ offset + stride + 2 ] = morph.z; + buffer[ offset + stride + 3 ] = 0; + + } + + if ( hasMorphNormals === true ) { + + morph.fromBufferAttribute( morphNormal, j ); + + buffer[ offset + stride + 4 ] = morph.x; + buffer[ offset + stride + 5 ] = morph.y; + buffer[ offset + stride + 6 ] = morph.z; + buffer[ offset + stride + 7 ] = 0; + + } + + if ( hasMorphColors === true ) { + + morph.fromBufferAttribute( morphColor, j ); + + buffer[ offset + stride + 8 ] = morph.x; + buffer[ offset + stride + 9 ] = morph.y; + buffer[ offset + stride + 10 ] = morph.z; + buffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1; + + } + + } + + } + + entry = { + count: morphTargetsCount, + texture: texture, + size: new Vector2( width, height ) + }; + + morphTextures.set( geometry, entry ); + + function disposeTexture() { + + texture.dispose(); + + morphTextures.delete( geometry ); + + geometry.removeEventListener( 'dispose', disposeTexture ); + + } + + geometry.addEventListener( 'dispose', disposeTexture ); + + } + + // + if ( object.isInstancedMesh === true && object.morphTexture !== null ) { + + program.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures ); + + } else { + + let morphInfluencesSum = 0; + + for ( let i = 0; i < objectInfluences.length; i ++ ) { + + morphInfluencesSum += objectInfluences[ i ]; + + } + + const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + + + program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence ); + program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences ); + + } + + program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures ); + program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size ); + + } + + return { + + update: update + + }; + +} + +function WebGLObjects( gl, geometries, attributes, info ) { + + let updateMap = new WeakMap(); + + function update( object ) { + + const frame = info.render.frame; + + const geometry = object.geometry; + const buffergeometry = geometries.get( object, geometry ); + + // Update once per frame + + if ( updateMap.get( buffergeometry ) !== frame ) { + + geometries.update( buffergeometry ); + + updateMap.set( buffergeometry, frame ); + + } + + if ( object.isInstancedMesh ) { + + if ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) { + + object.addEventListener( 'dispose', onInstancedMeshDispose ); + + } + + if ( updateMap.get( object ) !== frame ) { + + attributes.update( object.instanceMatrix, gl.ARRAY_BUFFER ); + + if ( object.instanceColor !== null ) { + + attributes.update( object.instanceColor, gl.ARRAY_BUFFER ); + + } + + updateMap.set( object, frame ); + + } + + } + + if ( object.isSkinnedMesh ) { + + const skeleton = object.skeleton; + + if ( updateMap.get( skeleton ) !== frame ) { + + skeleton.update(); + + updateMap.set( skeleton, frame ); + + } + + } + + return buffergeometry; + + } + + function dispose() { + + updateMap = new WeakMap(); + + } + + function onInstancedMeshDispose( event ) { + + const instancedMesh = event.target; + + instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose ); + + attributes.remove( instancedMesh.instanceMatrix ); + + if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor ); + + } + + return { + + update: update, + dispose: dispose + + }; + +} + +/** + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [textures] ) + * + * uploads a uniform value(s) + * the 'textures' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (textures factorizations): + * + * .upload( gl, seq, values, textures ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (textures factorizations): + * + * .setValue( gl, name, value, textures ) + * + * sets uniform with name 'name' to 'value' + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + +const emptyTexture = /*@__PURE__*/ new Texture$1(); + +const emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 ); + +const emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture(); +const empty3dTexture = /*@__PURE__*/ new Data3DTexture(); +const emptyCubeTexture = /*@__PURE__*/ new CubeTexture(); + +// --- Utilities --- + +// Array Caches (provide typed arrays for temporary by size) + +const arrayCacheF32 = []; +const arrayCacheI32 = []; + +// Float32Array caches used for uploading Matrix uniforms + +const mat4array = new Float32Array( 16 ); +const mat3array = new Float32Array( 9 ); +const mat2array = new Float32Array( 4 ); + +// Flattening for arrays of vectors and matrices + +function flatten( array, nBlocks, blockSize ) { + + const firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + const n = nBlocks * blockSize; + let r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( let i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + +} + +function arraysEqual( a, b ) { + + if ( a.length !== b.length ) return false; + + for ( let i = 0, l = a.length; i < l; i ++ ) { + + if ( a[ i ] !== b[ i ] ) return false; + + } + + return true; + +} + +function copyArray( a, b ) { + + for ( let i = 0, l = b.length; i < l; i ++ ) { + + a[ i ] = b[ i ]; + + } + +} + +// Texture unit allocation + +function allocTexUnits( textures, n ) { + + let r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( let i = 0; i !== n; ++ i ) { + + r[ i ] = textures.allocateTextureUnit(); + + } + + return r; + +} + +// --- Setters --- + +// Note: Defining these methods externally, because they come in a bunch +// and this way their names minify. + +// Single scalar + +function setValueV1f( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1f( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single float vector (from flat array or THREE.VectorN) + +function setValueV2f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2f( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV3f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3f( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else if ( v.r !== undefined ) { + + if ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) { + + gl.uniform3f( this.addr, v.r, v.g, v.b ); + + cache[ 0 ] = v.r; + cache[ 1 ] = v.g; + cache[ 2 ] = v.b; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV4f( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4fv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +// Single matrix (from flat array or THREE.MatrixN) + +function setValueM2( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix2fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat2array.set( elements ); + + gl.uniformMatrix2fv( this.addr, false, mat2array ); + + copyArray( cache, elements ); + + } + +} + +function setValueM3( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix3fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat3array.set( elements ); + + gl.uniformMatrix3fv( this.addr, false, mat3array ); + + copyArray( cache, elements ); + + } + +} + +function setValueM4( gl, v ) { + + const cache = this.cache; + const elements = v.elements; + + if ( elements === undefined ) { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniformMatrix4fv( this.addr, false, v ); + + copyArray( cache, v ); + + } else { + + if ( arraysEqual( cache, elements ) ) return; + + mat4array.set( elements ); + + gl.uniformMatrix4fv( this.addr, false, mat4array ); + + copyArray( cache, elements ); + + } + +} + +// Single integer / boolean + +function setValueV1i( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1i( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single integer / boolean vector (from flat array or THREE.VectorN) + +function setValueV2i( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2i( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2iv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV3i( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3i( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3iv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV4i( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4i( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4iv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +// Single unsigned integer + +function setValueV1ui( gl, v ) { + + const cache = this.cache; + + if ( cache[ 0 ] === v ) return; + + gl.uniform1ui( this.addr, v ); + + cache[ 0 ] = v; + +} + +// Single unsigned integer vector (from flat array or THREE.VectorN) + +function setValueV2ui( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) { + + gl.uniform2ui( this.addr, v.x, v.y ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform2uiv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV3ui( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) { + + gl.uniform3ui( this.addr, v.x, v.y, v.z ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform3uiv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + +function setValueV4ui( gl, v ) { + + const cache = this.cache; + + if ( v.x !== undefined ) { + + if ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) { + + gl.uniform4ui( this.addr, v.x, v.y, v.z, v.w ); + + cache[ 0 ] = v.x; + cache[ 1 ] = v.y; + cache[ 2 ] = v.z; + cache[ 3 ] = v.w; + + } + + } else { + + if ( arraysEqual( cache, v ) ) return; + + gl.uniform4uiv( this.addr, v ); + + copyArray( cache, v ); + + } + +} + + +// Single texture (2D / Cube) + +function setValueT1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + let emptyTexture2D; + + if ( this.type === gl.SAMPLER_2D_SHADOW ) { + + emptyShadowTexture.compareFunction = LessEqualCompare; // #28670 + emptyTexture2D = emptyShadowTexture; + + } else { + + emptyTexture2D = emptyTexture; + + } + + textures.setTexture2D( v || emptyTexture2D, unit ); + +} + +function setValueT3D1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTexture3D( v || empty3dTexture, unit ); + +} + +function setValueT6( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTextureCube( v || emptyCubeTexture, unit ); + +} + +function setValueT2DArray1( gl, v, textures ) { + + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + + if ( cache[ 0 ] !== unit ) { + + gl.uniform1i( this.addr, unit ); + cache[ 0 ] = unit; + + } + + textures.setTexture2DArray( v || emptyArrayTexture, unit ); + +} + +// Helper to pick the right setter for the singular case + +function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValueV1f; // FLOAT + case 0x8b50: return setValueV2f; // _VEC2 + case 0x8b51: return setValueV3f; // _VEC3 + case 0x8b52: return setValueV4f; // _VEC4 + + case 0x8b5a: return setValueM2; // _MAT2 + case 0x8b5b: return setValueM3; // _MAT3 + case 0x8b5c: return setValueM4; // _MAT4 + + case 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValueV2i; // _VEC2 + case 0x8b54: case 0x8b58: return setValueV3i; // _VEC3 + case 0x8b55: case 0x8b59: return setValueV4i; // _VEC4 + + case 0x1405: return setValueV1ui; // UINT + case 0x8dc6: return setValueV2ui; // _VEC2 + case 0x8dc7: return setValueV3ui; // _VEC3 + case 0x8dc8: return setValueV4ui; // _VEC4 + + case 0x8b5e: // SAMPLER_2D + case 0x8d66: // SAMPLER_EXTERNAL_OES + case 0x8dca: // INT_SAMPLER_2D + case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D + case 0x8b62: // SAMPLER_2D_SHADOW + return setValueT1; + + case 0x8b5f: // SAMPLER_3D + case 0x8dcb: // INT_SAMPLER_3D + case 0x8dd3: // UNSIGNED_INT_SAMPLER_3D + return setValueT3D1; + + case 0x8b60: // SAMPLER_CUBE + case 0x8dcc: // INT_SAMPLER_CUBE + case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE + case 0x8dc5: // SAMPLER_CUBE_SHADOW + return setValueT6; + + case 0x8dc1: // SAMPLER_2D_ARRAY + case 0x8dcf: // INT_SAMPLER_2D_ARRAY + case 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY + case 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW + return setValueT2DArray1; + + } + +} + + +// Array of scalars + +function setValueV1fArray( gl, v ) { + + gl.uniform1fv( this.addr, v ); + +} + +// Array of vectors (from flat array or array of THREE.VectorN) + +function setValueV2fArray( gl, v ) { + + const data = flatten( v, this.size, 2 ); + + gl.uniform2fv( this.addr, data ); + +} + +function setValueV3fArray( gl, v ) { + + const data = flatten( v, this.size, 3 ); + + gl.uniform3fv( this.addr, data ); + +} + +function setValueV4fArray( gl, v ) { + + const data = flatten( v, this.size, 4 ); + + gl.uniform4fv( this.addr, data ); + +} + +// Array of matrices (from flat array or array of THREE.MatrixN) + +function setValueM2Array( gl, v ) { + + const data = flatten( v, this.size, 4 ); + + gl.uniformMatrix2fv( this.addr, false, data ); + +} + +function setValueM3Array( gl, v ) { + + const data = flatten( v, this.size, 9 ); + + gl.uniformMatrix3fv( this.addr, false, data ); + +} + +function setValueM4Array( gl, v ) { + + const data = flatten( v, this.size, 16 ); + + gl.uniformMatrix4fv( this.addr, false, data ); + +} + +// Array of integer / boolean + +function setValueV1iArray( gl, v ) { + + gl.uniform1iv( this.addr, v ); + +} + +// Array of integer / boolean vectors (from flat array) + +function setValueV2iArray( gl, v ) { + + gl.uniform2iv( this.addr, v ); + +} + +function setValueV3iArray( gl, v ) { + + gl.uniform3iv( this.addr, v ); + +} + +function setValueV4iArray( gl, v ) { + + gl.uniform4iv( this.addr, v ); + +} + +// Array of unsigned integer + +function setValueV1uiArray( gl, v ) { + + gl.uniform1uiv( this.addr, v ); + +} + +// Array of unsigned integer vectors (from flat array) + +function setValueV2uiArray( gl, v ) { + + gl.uniform2uiv( this.addr, v ); + +} + +function setValueV3uiArray( gl, v ) { + + gl.uniform3uiv( this.addr, v ); + +} + +function setValueV4uiArray( gl, v ) { + + gl.uniform4uiv( this.addr, v ); + +} + + +// Array of textures (2D / 3D / Cube / 2DArray) + +function setValueT1Array( gl, v, textures ) { + + const cache = this.cache; + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + if ( ! arraysEqual( cache, units ) ) { + + gl.uniform1iv( this.addr, units ); + + copyArray( cache, units ); + + } + + for ( let i = 0; i !== n; ++ i ) { + + textures.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + +} + +function setValueT3DArray( gl, v, textures ) { + + const cache = this.cache; + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + if ( ! arraysEqual( cache, units ) ) { + + gl.uniform1iv( this.addr, units ); + + copyArray( cache, units ); + + } + + for ( let i = 0; i !== n; ++ i ) { + + textures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] ); + + } + +} + +function setValueT6Array( gl, v, textures ) { + + const cache = this.cache; + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + if ( ! arraysEqual( cache, units ) ) { + + gl.uniform1iv( this.addr, units ); + + copyArray( cache, units ); + + } + + for ( let i = 0; i !== n; ++ i ) { + + textures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + +} + +function setValueT2DArrayArray( gl, v, textures ) { + + const cache = this.cache; + + const n = v.length; + + const units = allocTexUnits( textures, n ); + + if ( ! arraysEqual( cache, units ) ) { + + gl.uniform1iv( this.addr, units ); + + copyArray( cache, units ); + + } + + for ( let i = 0; i !== n; ++ i ) { + + textures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] ); + + } + +} + + +// Helper to pick the right setter for a pure (bottom-level) array + +function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValueV1fArray; // FLOAT + case 0x8b50: return setValueV2fArray; // _VEC2 + case 0x8b51: return setValueV3fArray; // _VEC3 + case 0x8b52: return setValueV4fArray; // _VEC4 + + case 0x8b5a: return setValueM2Array; // _MAT2 + case 0x8b5b: return setValueM3Array; // _MAT3 + case 0x8b5c: return setValueM4Array; // _MAT4 + + case 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL + case 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2 + case 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3 + case 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4 + + case 0x1405: return setValueV1uiArray; // UINT + case 0x8dc6: return setValueV2uiArray; // _VEC2 + case 0x8dc7: return setValueV3uiArray; // _VEC3 + case 0x8dc8: return setValueV4uiArray; // _VEC4 + + case 0x8b5e: // SAMPLER_2D + case 0x8d66: // SAMPLER_EXTERNAL_OES + case 0x8dca: // INT_SAMPLER_2D + case 0x8dd2: // UNSIGNED_INT_SAMPLER_2D + case 0x8b62: // SAMPLER_2D_SHADOW + return setValueT1Array; + + case 0x8b5f: // SAMPLER_3D + case 0x8dcb: // INT_SAMPLER_3D + case 0x8dd3: // UNSIGNED_INT_SAMPLER_3D + return setValueT3DArray; + + case 0x8b60: // SAMPLER_CUBE + case 0x8dcc: // INT_SAMPLER_CUBE + case 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE + case 0x8dc5: // SAMPLER_CUBE_SHADOW + return setValueT6Array; + + case 0x8dc1: // SAMPLER_2D_ARRAY + case 0x8dcf: // INT_SAMPLER_2D_ARRAY + case 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY + case 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW + return setValueT2DArrayArray; + + } + +} + +// --- Uniform Classes --- + +class SingleUniform { + + constructor( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.type = activeInfo.type; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + +} + +class PureArrayUniform { + + constructor( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.cache = []; + this.type = activeInfo.type; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + +} + +class StructuredUniform { + + constructor( id ) { + + this.id = id; + + this.seq = []; + this.map = {}; + + } + + setValue( gl, value, textures ) { + + const seq = this.seq; + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ]; + u.setValue( gl, value[ u.id ], textures ); + + } + + } + +} + +// --- Top-level --- + +// Parser - builds up the property tree from the path strings + +const RePathPart = /(\w+)(\])?(\[|\.)?/g; + +// extracts +// - the identifier (member name or array index) +// - followed by an optional right bracket (found when array index) +// - followed by an optional left bracket or dot (type of subscript) +// +// Note: These portions can be read in a non-overlapping fashion and +// allow straightforward parsing of the hierarchy that WebGL encodes +// in the uniform names. + +function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + +} + +function parseUniform( activeInfo, addr, container ) { + + const path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + while ( true ) { + + const match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex; + + let id = match[ 1 ]; + const idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { + + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + + // step into inner node / create it in case it doesn't exist + + const map = container.map; + let next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + +} + +// Root Container + +class WebGLUniforms { + + constructor( gl, program ) { + + this.seq = []; + this.map = {}; + + const n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( let i = 0; i < n; ++ i ) { + + const info = gl.getActiveUniform( program, i ), + addr = gl.getUniformLocation( program, info.name ); + + parseUniform( info, addr, this ); + + } + + } + + setValue( gl, name, value, textures ) { + + const u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, textures ); + + } + + setOptional( gl, object, name ) { + + const v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + } + + static upload( gl, seq, values, textures ) { + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + + // note: always updating when .needsUpdate is undefined + u.setValue( gl, v.value, textures ); + + } + + } + + } + + static seqWithValue( seq, values ) { + + const r = []; + + for ( let i = 0, n = seq.length; i !== n; ++ i ) { + + const u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + } + +} + +function WebGLShader( gl, type, string ) { + + const shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + return shader; + +} + +// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/ +const COMPLETION_STATUS_KHR = 0x91B1; + +let programIdCount = 0; + +function handleSource( string, errorLine ) { + + const lines = string.split( '\n' ); + const lines2 = []; + + const from = Math.max( errorLine - 6, 0 ); + const to = Math.min( errorLine + 6, lines.length ); + + for ( let i = from; i < to; i ++ ) { + + const line = i + 1; + lines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` ); + + } + + return lines2.join( '\n' ); + +} + +const _m0 = /*@__PURE__*/ new Matrix3(); + +function getEncodingComponents( colorSpace ) { + + ColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace ); + + const encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`; + + switch ( ColorManagement.getTransfer( colorSpace ) ) { + + case LinearTransfer: + return [ encodingMatrix, 'LinearTransferOETF' ]; + + case SRGBTransfer: + return [ encodingMatrix, 'sRGBTransferOETF' ]; + + default: + console.warn( 'THREE.WebGLProgram: Unsupported color space: ', colorSpace ); + return [ encodingMatrix, 'LinearTransferOETF' ]; + + } + +} + +function getShaderErrors( gl, shader, type ) { + + const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS ); + const errors = gl.getShaderInfoLog( shader ).trim(); + + if ( status && errors === '' ) return ''; + + const errorMatches = /ERROR: 0:(\d+)/.exec( errors ); + if ( errorMatches ) { + + // --enable-privileged-webgl-extension + // console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + const errorLine = parseInt( errorMatches[ 1 ] ); + return type.toUpperCase() + '\n\n' + errors + '\n\n' + handleSource( gl.getShaderSource( shader ), errorLine ); + + } else { + + return errors; + + } + +} + +function getTexelEncodingFunction( functionName, colorSpace ) { + + const components = getEncodingComponents( colorSpace ); + + return [ + + `vec4 ${functionName}( vec4 value ) {`, + + ` return ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`, + + '}', + + ].join( '\n' ); + +} + +function getToneMappingFunction( functionName, toneMapping ) { + + let toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = 'Linear'; + break; + + case ReinhardToneMapping: + toneMappingName = 'Reinhard'; + break; + + case CineonToneMapping: + toneMappingName = 'Cineon'; + break; + + case ACESFilmicToneMapping: + toneMappingName = 'ACESFilmic'; + break; + + case AgXToneMapping: + toneMappingName = 'AgX'; + break; + + case NeutralToneMapping: + toneMappingName = 'Neutral'; + break; + + case CustomToneMapping: + toneMappingName = 'Custom'; + break; + + default: + console.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping ); + toneMappingName = 'Linear'; + + } + + return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }'; + +} + +const _v0 = /*@__PURE__*/ new Vector3(); + +function getLuminanceFunction() { + + ColorManagement.getLuminanceCoefficients( _v0 ); + + const r = _v0.x.toFixed( 4 ); + const g = _v0.y.toFixed( 4 ); + const b = _v0.z.toFixed( 4 ); + + return [ + + 'float luminance( const in vec3 rgb ) {', + + ` const vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`, + + ' return dot( weights, rgb );', + + '}' + + ].join( '\n' ); + +} + +function generateVertexExtensions( parameters ) { + + const chunks = [ + parameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '', + parameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '', + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + +} + +function generateDefines( defines ) { + + const chunks = []; + + for ( const name in defines ) { + + const value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + +} + +function fetchAttributeLocations( gl, program ) { + + const attributes = {}; + + const n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( let i = 0; i < n; i ++ ) { + + const info = gl.getActiveAttrib( program, i ); + const name = info.name; + + let locationSize = 1; + if ( info.type === gl.FLOAT_MAT2 ) locationSize = 2; + if ( info.type === gl.FLOAT_MAT3 ) locationSize = 3; + if ( info.type === gl.FLOAT_MAT4 ) locationSize = 4; + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[ name ] = { + type: info.type, + location: gl.getAttribLocation( program, name ), + locationSize: locationSize + }; + + } + + return attributes; + +} + +function filterEmptyLine( string ) { + + return string !== ''; + +} + +function replaceLightNums( string, parameters ) { + + const numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps; + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps ) + .replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords ) + .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ) + .replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows ) + .replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps ) + .replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows ) + .replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows ); + +} + +function replaceClippingPlaneNums( string, parameters ) { + + return string + .replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes ) + .replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) ); + +} + +// Resolve Includes + +const includePattern = /^[ \t]*#include +<([\w\d./]+)>/gm; + +function resolveIncludes( string ) { + + return string.replace( includePattern, includeReplacer ); + +} + +const shaderChunkMap = new Map(); + +function includeReplacer( match, include ) { + + let string = ShaderChunk[ include ]; + + if ( string === undefined ) { + + const newInclude = shaderChunkMap.get( include ); + + if ( newInclude !== undefined ) { + + string = ShaderChunk[ newInclude ]; + console.warn( 'THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.', include, newInclude ); + + } else { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + } + + return resolveIncludes( string ); + +} + +// Unroll Loops + +const unrollLoopPattern = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; + +function unrollLoops( string ) { + + return string.replace( unrollLoopPattern, loopReplacer ); + +} + +function loopReplacer( match, start, end, snippet ) { + + let string = ''; + + for ( let i = parseInt( start ); i < parseInt( end ); i ++ ) { + + string += snippet + .replace( /\[\s*i\s*\]/g, '[ ' + i + ' ]' ) + .replace( /UNROLLED_LOOP_INDEX/g, i ); + + } + + return string; + +} + +// + +function generatePrecision( parameters ) { + + let precisionstring = `precision ${parameters.precision} float; + precision ${parameters.precision} int; + precision ${parameters.precision} sampler2D; + precision ${parameters.precision} samplerCube; + precision ${parameters.precision} sampler3D; + precision ${parameters.precision} sampler2DArray; + precision ${parameters.precision} sampler2DShadow; + precision ${parameters.precision} samplerCubeShadow; + precision ${parameters.precision} sampler2DArrayShadow; + precision ${parameters.precision} isampler2D; + precision ${parameters.precision} isampler3D; + precision ${parameters.precision} isamplerCube; + precision ${parameters.precision} isampler2DArray; + precision ${parameters.precision} usampler2D; + precision ${parameters.precision} usampler3D; + precision ${parameters.precision} usamplerCube; + precision ${parameters.precision} usampler2DArray; + `; + + if ( parameters.precision === 'highp' ) { + + precisionstring += '\n#define HIGH_PRECISION'; + + } else if ( parameters.precision === 'mediump' ) { + + precisionstring += '\n#define MEDIUM_PRECISION'; + + } else if ( parameters.precision === 'lowp' ) { + + precisionstring += '\n#define LOW_PRECISION'; + + } + + return precisionstring; + +} + +function generateShadowMapTypeDefine( parameters ) { + + let shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } else if ( parameters.shadowMapType === VSMShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM'; + + } + + return shadowMapTypeDefine; + +} + +function generateEnvMapTypeDefine( parameters ) { + + let envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + + if ( parameters.envMap ) { + + switch ( parameters.envMapMode ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + } + + } + + return envMapTypeDefine; + +} + +function generateEnvMapModeDefine( parameters ) { + + let envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + + if ( parameters.envMap ) { + + switch ( parameters.envMapMode ) { + + case CubeRefractionMapping: + + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + } + + return envMapModeDefine; + +} + +function generateEnvMapBlendingDefine( parameters ) { + + let envMapBlendingDefine = 'ENVMAP_BLENDING_NONE'; + + if ( parameters.envMap ) { + + switch ( parameters.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + return envMapBlendingDefine; + +} + +function generateCubeUVSize( parameters ) { + + const imageHeight = parameters.envMapCubeUVHeight; + + if ( imageHeight === null ) return null; + + const maxMip = Math.log2( imageHeight ) - 2; + + const texelHeight = 1.0 / imageHeight; + + const texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) ); + + return { texelWidth, texelHeight, maxMip }; + +} + +function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) { + + // TODO Send this event to Three.js DevTools + // console.log( 'WebGLProgram', cacheKey ); + + const gl = renderer.getContext(); + + const defines = parameters.defines; + + let vertexShader = parameters.vertexShader; + let fragmentShader = parameters.fragmentShader; + + const shadowMapTypeDefine = generateShadowMapTypeDefine( parameters ); + const envMapTypeDefine = generateEnvMapTypeDefine( parameters ); + const envMapModeDefine = generateEnvMapModeDefine( parameters ); + const envMapBlendingDefine = generateEnvMapBlendingDefine( parameters ); + const envMapCubeUVSize = generateCubeUVSize( parameters ); + + const customVertexExtensions = generateVertexExtensions( parameters ); + + const customDefines = generateDefines( defines ); + + const program = gl.createProgram(); + + let prefixVertex, prefixFragment; + let versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\n' : ''; + + if ( parameters.isRawShaderMaterial ) { + + prefixVertex = [ + + '#define SHADER_TYPE ' + parameters.shaderType, + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixVertex.length > 0 ) { + + prefixVertex += '\n'; + + } + + prefixFragment = [ + + '#define SHADER_TYPE ' + parameters.shaderType, + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines + + ].filter( filterEmptyLine ).join( '\n' ); + + if ( prefixFragment.length > 0 ) { + + prefixFragment += '\n'; + + } + + } else { + + prefixVertex = [ + + generatePrecision( parameters ), + + '#define SHADER_TYPE ' + parameters.shaderType, + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines, + + parameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '', + parameters.batching ? '#define USE_BATCHING' : '', + parameters.batchingColor ? '#define USE_BATCHING_COLOR' : '', + parameters.instancing ? '#define USE_INSTANCING' : '', + parameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '', + parameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '', + + parameters.useFog && parameters.fog ? '#define USE_FOG' : '', + parameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '', + parameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '', + parameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + + parameters.anisotropy ? '#define USE_ANISOTROPY' : '', + parameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '', + + parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', + parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', + parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', + + parameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '', + parameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '', + + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '', + parameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '', + + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.alphaHash ? '#define USE_ALPHAHASH' : '', + + parameters.transmission ? '#define USE_TRANSMISSION' : '', + parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', + parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '', + + parameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '', + parameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '', + + // + + parameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '', + parameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '', + parameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '', + parameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '', + parameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '', + parameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '', + parameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '', + parameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '', + + parameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '', + parameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '', + + parameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '', + + parameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '', + parameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '', + parameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '', + + parameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '', + parameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '', + + parameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '', + parameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '', + + parameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '', + parameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '', + parameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '', + + parameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '', + parameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '', + + // + + parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', + parameters.vertexUv1s ? '#define USE_UV1' : '', + parameters.vertexUv2s ? '#define USE_UV2' : '', + parameters.vertexUv3s ? '#define USE_UV3' : '', + + parameters.pointsUvs ? '#define USE_POINTS_UV' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + ( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '', + ( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '', + ( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.reverseDepthBuffer ? '#define USE_REVERSEDEPTHBUF' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + 'uniform bool isOrthographic;', + + '#ifdef USE_INSTANCING', + + ' attribute mat4 instanceMatrix;', + + '#endif', + + '#ifdef USE_INSTANCING_COLOR', + + ' attribute vec3 instanceColor;', + + '#endif', + + '#ifdef USE_INSTANCING_MORPH', + + ' uniform sampler2D morphTexture;', + + '#endif', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_UV1', + + ' attribute vec2 uv1;', + + '#endif', + + '#ifdef USE_UV2', + + ' attribute vec2 uv2;', + + '#endif', + + '#ifdef USE_UV3', + + ' attribute vec2 uv3;', + + '#endif', + + '#ifdef USE_TANGENT', + + ' attribute vec4 tangent;', + + '#endif', + + '#if defined( USE_COLOR_ALPHA )', + + ' attribute vec4 color;', + + '#elif defined( USE_COLOR )', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + generatePrecision( parameters ), + + '#define SHADER_TYPE ' + parameters.shaderType, + '#define SHADER_NAME ' + parameters.shaderName, + + customDefines, + + parameters.useFog && parameters.fog ? '#define USE_FOG' : '', + parameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '', + + parameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '', + parameters.map ? '#define USE_MAP' : '', + parameters.matcap ? '#define USE_MATCAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + envMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '', + envMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '', + envMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '', + parameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + + parameters.anisotropy ? '#define USE_ANISOTROPY' : '', + parameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '', + + parameters.clearcoat ? '#define USE_CLEARCOAT' : '', + parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', + parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', + parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', + + parameters.dispersion ? '#define USE_DISPERSION' : '', + + parameters.iridescence ? '#define USE_IRIDESCENCE' : '', + parameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '', + parameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '', + + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '', + parameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '', + + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.alphaTest ? '#define USE_ALPHATEST' : '', + parameters.alphaHash ? '#define USE_ALPHAHASH' : '', + + parameters.sheen ? '#define USE_SHEEN' : '', + parameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '', + parameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '', + + parameters.transmission ? '#define USE_TRANSMISSION' : '', + parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', + parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '', + + parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '', + parameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '', + parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', + parameters.vertexUv1s ? '#define USE_UV1' : '', + parameters.vertexUv2s ? '#define USE_UV2' : '', + parameters.vertexUv3s ? '#define USE_UV3' : '', + + parameters.pointsUvs ? '#define USE_POINTS_UV' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '', + + parameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '', + parameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.reverseDepthBuffer ? '#define USE_REVERSEDEPTHBUF' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + 'uniform bool isOrthographic;', + + ( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '', + + parameters.dithering ? '#define DITHERING' : '', + parameters.opaque ? '#define OPAQUE' : '', + + ShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below + getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ), + getLuminanceFunction(), + + parameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = resolveIncludes( vertexShader ); + vertexShader = replaceLightNums( vertexShader, parameters ); + vertexShader = replaceClippingPlaneNums( vertexShader, parameters ); + + fragmentShader = resolveIncludes( fragmentShader ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters ); + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + if ( parameters.isRawShaderMaterial !== true ) { + + // GLSL 3.0 conversion for built-in materials and ShaderMaterial + + versionString = '#version 300 es\n'; + + prefixVertex = [ + customVertexExtensions, + '#define attribute in', + '#define varying out', + '#define texture2D texture' + ].join( '\n' ) + '\n' + prefixVertex; + + prefixFragment = [ + '#define varying in', + ( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;', + ( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor', + '#define gl_FragDepthEXT gl_FragDepth', + '#define texture2D texture', + '#define textureCube texture', + '#define texture2DProj textureProj', + '#define texture2DLodEXT textureLod', + '#define texture2DProjLodEXT textureProjLod', + '#define textureCubeLodEXT textureLod', + '#define texture2DGradEXT textureGrad', + '#define texture2DProjGradEXT textureProjGrad', + '#define textureCubeGradEXT textureGrad' + ].join( '\n' ) + '\n' + prefixFragment; + + } + + const vertexGlsl = versionString + prefixVertex + vertexShader; + const fragmentGlsl = versionString + prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + const glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + const glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( parameters.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, parameters.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + function onFirstUse( self ) { + + // check for link errors + if ( renderer.debug.checkShaderErrors ) { + + const programLog = gl.getProgramInfoLog( program ).trim(); + const vertexLog = gl.getShaderInfoLog( glVertexShader ).trim(); + const fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim(); + + let runnable = true; + let haveDiagnostics = true; + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + if ( typeof renderer.debug.onShaderError === 'function' ) { + + renderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader ); + + } else { + + // default error reporting + + const vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' ); + const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' ); + + console.error( + 'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' + + 'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\n\n' + + 'Material Name: ' + self.name + '\n' + + 'Material Type: ' + self.type + '\n\n' + + 'Program Info Log: ' + programLog + '\n' + + vertexErrors + '\n' + + fragmentErrors + ); + + } + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + self.diagnostics = { + + runnable: runnable, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + } + + // Clean up + + // Crashes in iOS9 and iOS10. #18402 + // gl.detachShader( program, glVertexShader ); + // gl.detachShader( program, glFragmentShader ); + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + cachedUniforms = new WebGLUniforms( gl, program ); + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + // set up caching for uniform locations + + let cachedUniforms; + + this.getUniforms = function () { + + if ( cachedUniforms === undefined ) { + + // Populates cachedUniforms and cachedAttributes + onFirstUse( this ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + let cachedAttributes; + + this.getAttributes = function () { + + if ( cachedAttributes === undefined ) { + + // Populates cachedAttributes and cachedUniforms + onFirstUse( this ); + + } + + return cachedAttributes; + + }; + + // indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported, + // flag the program as ready immediately. It may cause a stall when it's first used. + + let programReady = ( parameters.rendererExtensionParallelShaderCompile === false ); + + this.isReady = function () { + + if ( programReady === false ) { + + programReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR ); + + } + + return programReady; + + }; + + // free resource + + this.destroy = function () { + + bindingStates.releaseStatesOfProgram( this ); + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // + + this.type = parameters.shaderType; + this.name = parameters.shaderName; + this.id = programIdCount ++; + this.cacheKey = cacheKey; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + +} + +let _id = 0; + +class WebGLShaderCache { + + constructor() { + + this.shaderCache = new Map(); + this.materialCache = new Map(); + + } + + update( material ) { + + const vertexShader = material.vertexShader; + const fragmentShader = material.fragmentShader; + + const vertexShaderStage = this._getShaderStage( vertexShader ); + const fragmentShaderStage = this._getShaderStage( fragmentShader ); + + const materialShaders = this._getShaderCacheForMaterial( material ); + + if ( materialShaders.has( vertexShaderStage ) === false ) { + + materialShaders.add( vertexShaderStage ); + vertexShaderStage.usedTimes ++; + + } + + if ( materialShaders.has( fragmentShaderStage ) === false ) { + + materialShaders.add( fragmentShaderStage ); + fragmentShaderStage.usedTimes ++; + + } + + return this; + + } + + remove( material ) { + + const materialShaders = this.materialCache.get( material ); + + for ( const shaderStage of materialShaders ) { + + shaderStage.usedTimes --; + + if ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code ); + + } + + this.materialCache.delete( material ); + + return this; + + } + + getVertexShaderID( material ) { + + return this._getShaderStage( material.vertexShader ).id; + + } + + getFragmentShaderID( material ) { + + return this._getShaderStage( material.fragmentShader ).id; + + } + + dispose() { + + this.shaderCache.clear(); + this.materialCache.clear(); + + } + + _getShaderCacheForMaterial( material ) { + + const cache = this.materialCache; + let set = cache.get( material ); + + if ( set === undefined ) { + + set = new Set(); + cache.set( material, set ); + + } + + return set; + + } + + _getShaderStage( code ) { + + const cache = this.shaderCache; + let stage = cache.get( code ); + + if ( stage === undefined ) { + + stage = new WebGLShaderStage( code ); + cache.set( code, stage ); + + } + + return stage; + + } + +} + +class WebGLShaderStage { + + constructor( code ) { + + this.id = _id ++; + + this.code = code; + this.usedTimes = 0; + + } + +} + +function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) { + + const _programLayers = new Layers(); + const _customShaders = new WebGLShaderCache(); + const _activeChannels = new Set(); + const programs = []; + + const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer; + const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures; + + let precision = capabilities.precision; + + const shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'toon', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + MeshMatcapMaterial: 'matcap', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow', + SpriteMaterial: 'sprite' + }; + + function getChannel( value ) { + + _activeChannels.add( value ); + + if ( value === 0 ) return 'uv'; + + return `uv${ value }`; + + } + + function getParameters( material, lights, shadows, scene, object ) { + + const fog = scene.fog; + const geometry = object.geometry; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + + const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null; + + const shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + // + + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0; + + let morphTextureStride = 0; + + if ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1; + if ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2; + if ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3; + + // + + let vertexShader, fragmentShader; + let customVertexShaderID, customFragmentShaderID; + + if ( shaderID ) { + + const shader = ShaderLib[ shaderID ]; + + vertexShader = shader.vertexShader; + fragmentShader = shader.fragmentShader; + + } else { + + vertexShader = material.vertexShader; + fragmentShader = material.fragmentShader; + + _customShaders.update( material ); + + customVertexShaderID = _customShaders.getVertexShaderID( material ); + customFragmentShaderID = _customShaders.getFragmentShaderID( material ); + + } + + const currentRenderTarget = renderer.getRenderTarget(); + const reverseDepthBuffer = renderer.state.buffers.depth.getReversed(); + + const IS_INSTANCEDMESH = object.isInstancedMesh === true; + const IS_BATCHEDMESH = object.isBatchedMesh === true; + + const HAS_MAP = !! material.map; + const HAS_MATCAP = !! material.matcap; + const HAS_ENVMAP = !! envMap; + const HAS_AOMAP = !! material.aoMap; + const HAS_LIGHTMAP = !! material.lightMap; + const HAS_BUMPMAP = !! material.bumpMap; + const HAS_NORMALMAP = !! material.normalMap; + const HAS_DISPLACEMENTMAP = !! material.displacementMap; + const HAS_EMISSIVEMAP = !! material.emissiveMap; + + const HAS_METALNESSMAP = !! material.metalnessMap; + const HAS_ROUGHNESSMAP = !! material.roughnessMap; + + const HAS_ANISOTROPY = material.anisotropy > 0; + const HAS_CLEARCOAT = material.clearcoat > 0; + const HAS_DISPERSION = material.dispersion > 0; + const HAS_IRIDESCENCE = material.iridescence > 0; + const HAS_SHEEN = material.sheen > 0; + const HAS_TRANSMISSION = material.transmission > 0; + + const HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap; + + const HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap; + const HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap; + const HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap; + + const HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap; + const HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap; + + const HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap; + const HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap; + + const HAS_SPECULARMAP = !! material.specularMap; + const HAS_SPECULAR_COLORMAP = !! material.specularColorMap; + const HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap; + + const HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap; + const HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap; + + const HAS_GRADIENTMAP = !! material.gradientMap; + + const HAS_ALPHAMAP = !! material.alphaMap; + + const HAS_ALPHATEST = material.alphaTest > 0; + + const HAS_ALPHAHASH = !! material.alphaHash; + + const HAS_EXTENSIONS = !! material.extensions; + + let toneMapping = NoToneMapping; + + if ( material.toneMapped ) { + + if ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) { + + toneMapping = renderer.toneMapping; + + } + + } + + const parameters = { + + shaderID: shaderID, + shaderType: material.type, + shaderName: material.name, + + vertexShader: vertexShader, + fragmentShader: fragmentShader, + defines: material.defines, + + customVertexShaderID: customVertexShaderID, + customFragmentShaderID: customFragmentShaderID, + + isRawShaderMaterial: material.isRawShaderMaterial === true, + glslVersion: material.glslVersion, + + precision: precision, + + batching: IS_BATCHEDMESH, + batchingColor: IS_BATCHEDMESH && object._colorsTexture !== null, + instancing: IS_INSTANCEDMESH, + instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null, + instancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null, + + supportsVertexTextures: SUPPORTS_VERTEX_TEXTURES, + outputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ), + alphaToCoverage: !! material.alphaToCoverage, + + map: HAS_MAP, + matcap: HAS_MATCAP, + envMap: HAS_ENVMAP, + envMapMode: HAS_ENVMAP && envMap.mapping, + envMapCubeUVHeight: envMapCubeUVHeight, + aoMap: HAS_AOMAP, + lightMap: HAS_LIGHTMAP, + bumpMap: HAS_BUMPMAP, + normalMap: HAS_NORMALMAP, + displacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP, + emissiveMap: HAS_EMISSIVEMAP, + + normalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap, + normalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap, + + metalnessMap: HAS_METALNESSMAP, + roughnessMap: HAS_ROUGHNESSMAP, + + anisotropy: HAS_ANISOTROPY, + anisotropyMap: HAS_ANISOTROPYMAP, + + clearcoat: HAS_CLEARCOAT, + clearcoatMap: HAS_CLEARCOATMAP, + clearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP, + clearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP, + + dispersion: HAS_DISPERSION, + + iridescence: HAS_IRIDESCENCE, + iridescenceMap: HAS_IRIDESCENCEMAP, + iridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP, + + sheen: HAS_SHEEN, + sheenColorMap: HAS_SHEEN_COLORMAP, + sheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP, + + specularMap: HAS_SPECULARMAP, + specularColorMap: HAS_SPECULAR_COLORMAP, + specularIntensityMap: HAS_SPECULAR_INTENSITYMAP, + + transmission: HAS_TRANSMISSION, + transmissionMap: HAS_TRANSMISSIONMAP, + thicknessMap: HAS_THICKNESSMAP, + + gradientMap: HAS_GRADIENTMAP, + + opaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false, + + alphaMap: HAS_ALPHAMAP, + alphaTest: HAS_ALPHATEST, + alphaHash: HAS_ALPHAHASH, + + combine: material.combine, + + // + + mapUv: HAS_MAP && getChannel( material.map.channel ), + aoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ), + lightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ), + bumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ), + normalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ), + displacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ), + emissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ), + + metalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ), + roughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ), + + anisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ), + + clearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ), + clearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ), + clearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ), + + iridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ), + iridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ), + + sheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ), + sheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ), + + specularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ), + specularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ), + specularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ), + + transmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ), + thicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ), + + alphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ), + + // + + vertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ), + vertexColors: material.vertexColors, + vertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4, + + pointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ), + + fog: !! fog, + useFog: material.fog === true, + fogExp2: ( !! fog && fog.isFogExp2 ), + + flatShading: material.flatShading === true, + + sizeAttenuation: material.sizeAttenuation === true, + logarithmicDepthBuffer: logarithmicDepthBuffer, + reverseDepthBuffer: reverseDepthBuffer, + + skinning: object.isSkinnedMesh === true, + + morphTargets: geometry.morphAttributes.position !== undefined, + morphNormals: geometry.morphAttributes.normal !== undefined, + morphColors: geometry.morphAttributes.color !== undefined, + morphTargetsCount: morphTargetsCount, + morphTextureStride: morphTextureStride, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numSpotLightMaps: lights.spotLightMap.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numDirLightShadows: lights.directionalShadowMap.length, + numPointLightShadows: lights.pointShadowMap.length, + numSpotLightShadows: lights.spotShadowMap.length, + numSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps, + + numLightProbes: lights.numLightProbes, + + numClippingPlanes: clipping.numPlanes, + numClipIntersection: clipping.numIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: toneMapping, + + decodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ), + decodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ), + + premultipliedAlpha: material.premultipliedAlpha, + + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + useDepthPacking: material.depthPacking >= 0, + depthPacking: material.depthPacking || 0, + + index0AttributeName: material.index0AttributeName, + + extensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ), + extensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ), + + rendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ), + + customProgramCacheKey: material.customProgramCacheKey() + + }; + + // the usage of getChannel() determines the active texture channels for this shader + + parameters.vertexUv1s = _activeChannels.has( 1 ); + parameters.vertexUv2s = _activeChannels.has( 2 ); + parameters.vertexUv3s = _activeChannels.has( 3 ); + + _activeChannels.clear(); + + return parameters; + + } + + function getProgramCacheKey( parameters ) { + + const array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( parameters.customVertexShaderID ); + array.push( parameters.customFragmentShaderID ); + + } + + if ( parameters.defines !== undefined ) { + + for ( const name in parameters.defines ) { + + array.push( name ); + array.push( parameters.defines[ name ] ); + + } + + } + + if ( parameters.isRawShaderMaterial === false ) { + + getProgramCacheKeyParameters( array, parameters ); + getProgramCacheKeyBooleans( array, parameters ); + array.push( renderer.outputColorSpace ); + + } + + array.push( parameters.customProgramCacheKey ); + + return array.join(); + + } + + function getProgramCacheKeyParameters( array, parameters ) { + + array.push( parameters.precision ); + array.push( parameters.outputColorSpace ); + array.push( parameters.envMapMode ); + array.push( parameters.envMapCubeUVHeight ); + array.push( parameters.mapUv ); + array.push( parameters.alphaMapUv ); + array.push( parameters.lightMapUv ); + array.push( parameters.aoMapUv ); + array.push( parameters.bumpMapUv ); + array.push( parameters.normalMapUv ); + array.push( parameters.displacementMapUv ); + array.push( parameters.emissiveMapUv ); + array.push( parameters.metalnessMapUv ); + array.push( parameters.roughnessMapUv ); + array.push( parameters.anisotropyMapUv ); + array.push( parameters.clearcoatMapUv ); + array.push( parameters.clearcoatNormalMapUv ); + array.push( parameters.clearcoatRoughnessMapUv ); + array.push( parameters.iridescenceMapUv ); + array.push( parameters.iridescenceThicknessMapUv ); + array.push( parameters.sheenColorMapUv ); + array.push( parameters.sheenRoughnessMapUv ); + array.push( parameters.specularMapUv ); + array.push( parameters.specularColorMapUv ); + array.push( parameters.specularIntensityMapUv ); + array.push( parameters.transmissionMapUv ); + array.push( parameters.thicknessMapUv ); + array.push( parameters.combine ); + array.push( parameters.fogExp2 ); + array.push( parameters.sizeAttenuation ); + array.push( parameters.morphTargetsCount ); + array.push( parameters.morphAttributeCount ); + array.push( parameters.numDirLights ); + array.push( parameters.numPointLights ); + array.push( parameters.numSpotLights ); + array.push( parameters.numSpotLightMaps ); + array.push( parameters.numHemiLights ); + array.push( parameters.numRectAreaLights ); + array.push( parameters.numDirLightShadows ); + array.push( parameters.numPointLightShadows ); + array.push( parameters.numSpotLightShadows ); + array.push( parameters.numSpotLightShadowsWithMaps ); + array.push( parameters.numLightProbes ); + array.push( parameters.shadowMapType ); + array.push( parameters.toneMapping ); + array.push( parameters.numClippingPlanes ); + array.push( parameters.numClipIntersection ); + array.push( parameters.depthPacking ); + + } + + function getProgramCacheKeyBooleans( array, parameters ) { + + _programLayers.disableAll(); + + if ( parameters.supportsVertexTextures ) + _programLayers.enable( 0 ); + if ( parameters.instancing ) + _programLayers.enable( 1 ); + if ( parameters.instancingColor ) + _programLayers.enable( 2 ); + if ( parameters.instancingMorph ) + _programLayers.enable( 3 ); + if ( parameters.matcap ) + _programLayers.enable( 4 ); + if ( parameters.envMap ) + _programLayers.enable( 5 ); + if ( parameters.normalMapObjectSpace ) + _programLayers.enable( 6 ); + if ( parameters.normalMapTangentSpace ) + _programLayers.enable( 7 ); + if ( parameters.clearcoat ) + _programLayers.enable( 8 ); + if ( parameters.iridescence ) + _programLayers.enable( 9 ); + if ( parameters.alphaTest ) + _programLayers.enable( 10 ); + if ( parameters.vertexColors ) + _programLayers.enable( 11 ); + if ( parameters.vertexAlphas ) + _programLayers.enable( 12 ); + if ( parameters.vertexUv1s ) + _programLayers.enable( 13 ); + if ( parameters.vertexUv2s ) + _programLayers.enable( 14 ); + if ( parameters.vertexUv3s ) + _programLayers.enable( 15 ); + if ( parameters.vertexTangents ) + _programLayers.enable( 16 ); + if ( parameters.anisotropy ) + _programLayers.enable( 17 ); + if ( parameters.alphaHash ) + _programLayers.enable( 18 ); + if ( parameters.batching ) + _programLayers.enable( 19 ); + if ( parameters.dispersion ) + _programLayers.enable( 20 ); + if ( parameters.batchingColor ) + _programLayers.enable( 21 ); + + array.push( _programLayers.mask ); + _programLayers.disableAll(); + + if ( parameters.fog ) + _programLayers.enable( 0 ); + if ( parameters.useFog ) + _programLayers.enable( 1 ); + if ( parameters.flatShading ) + _programLayers.enable( 2 ); + if ( parameters.logarithmicDepthBuffer ) + _programLayers.enable( 3 ); + if ( parameters.reverseDepthBuffer ) + _programLayers.enable( 4 ); + if ( parameters.skinning ) + _programLayers.enable( 5 ); + if ( parameters.morphTargets ) + _programLayers.enable( 6 ); + if ( parameters.morphNormals ) + _programLayers.enable( 7 ); + if ( parameters.morphColors ) + _programLayers.enable( 8 ); + if ( parameters.premultipliedAlpha ) + _programLayers.enable( 9 ); + if ( parameters.shadowMapEnabled ) + _programLayers.enable( 10 ); + if ( parameters.doubleSided ) + _programLayers.enable( 11 ); + if ( parameters.flipSided ) + _programLayers.enable( 12 ); + if ( parameters.useDepthPacking ) + _programLayers.enable( 13 ); + if ( parameters.dithering ) + _programLayers.enable( 14 ); + if ( parameters.transmission ) + _programLayers.enable( 15 ); + if ( parameters.sheen ) + _programLayers.enable( 16 ); + if ( parameters.opaque ) + _programLayers.enable( 17 ); + if ( parameters.pointsUvs ) + _programLayers.enable( 18 ); + if ( parameters.decodeVideoTexture ) + _programLayers.enable( 19 ); + if ( parameters.decodeVideoTextureEmissive ) + _programLayers.enable( 20 ); + if ( parameters.alphaToCoverage ) + _programLayers.enable( 21 ); + + array.push( _programLayers.mask ); + + } + + function getUniforms( material ) { + + const shaderID = shaderIDs[ material.type ]; + let uniforms; + + if ( shaderID ) { + + const shader = ShaderLib[ shaderID ]; + uniforms = UniformsUtils.clone( shader.uniforms ); + + } else { + + uniforms = material.uniforms; + + } + + return uniforms; + + } + + function acquireProgram( parameters, cacheKey ) { + + let program; + + // Check if code has been already compiled + for ( let p = 0, pl = programs.length; p < pl; p ++ ) { + + const preexistingProgram = programs[ p ]; + + if ( preexistingProgram.cacheKey === cacheKey ) { + + program = preexistingProgram; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, cacheKey, parameters, bindingStates ); + programs.push( program ); + + } + + return program; + + } + + function releaseProgram( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + const i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + } + + function releaseShaderCache( material ) { + + _customShaders.remove( material ); + + } + + function dispose() { + + _customShaders.dispose(); + + } + + return { + getParameters: getParameters, + getProgramCacheKey: getProgramCacheKey, + getUniforms: getUniforms, + acquireProgram: acquireProgram, + releaseProgram: releaseProgram, + releaseShaderCache: releaseShaderCache, + // Exposed for resource monitoring & error feedback via renderer.info: + programs: programs, + dispose: dispose + }; + +} + +function WebGLProperties() { + + let properties = new WeakMap(); + + function has( object ) { + + return properties.has( object ); + + } + + function get( object ) { + + let map = properties.get( object ); + + if ( map === undefined ) { + + map = {}; + properties.set( object, map ); + + } + + return map; + + } + + function remove( object ) { + + properties.delete( object ); + + } + + function update( object, key, value ) { + + properties.get( object )[ key ] = value; + + } + + function dispose() { + + properties = new WeakMap(); + + } + + return { + has: has, + get: get, + remove: remove, + update: update, + dispose: dispose + }; + +} + +function painterSortStable( a, b ) { + + if ( a.groupOrder !== b.groupOrder ) { + + return a.groupOrder - b.groupOrder; + + } else if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + +} + +function reversePainterSortStable( a, b ) { + + if ( a.groupOrder !== b.groupOrder ) { + + return a.groupOrder - b.groupOrder; + + } else if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + +} + + +function WebGLRenderList() { + + const renderItems = []; + let renderItemsIndex = 0; + + const opaque = []; + const transmissive = []; + const transparent = []; + + function init() { + + renderItemsIndex = 0; + + opaque.length = 0; + transmissive.length = 0; + transparent.length = 0; + + } + + function getNextRenderItem( object, geometry, material, groupOrder, z, group ) { + + let renderItem = renderItems[ renderItemsIndex ]; + + if ( renderItem === undefined ) { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + groupOrder: groupOrder, + renderOrder: object.renderOrder, + z: z, + group: group + }; + + renderItems[ renderItemsIndex ] = renderItem; + + } else { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.groupOrder = groupOrder; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + + } + + renderItemsIndex ++; + + return renderItem; + + } + + function push( object, geometry, material, groupOrder, z, group ) { + + const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); + + if ( material.transmission > 0.0 ) { + + transmissive.push( renderItem ); + + } else if ( material.transparent === true ) { + + transparent.push( renderItem ); + + } else { + + opaque.push( renderItem ); + + } + + } + + function unshift( object, geometry, material, groupOrder, z, group ) { + + const renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); + + if ( material.transmission > 0.0 ) { + + transmissive.unshift( renderItem ); + + } else if ( material.transparent === true ) { + + transparent.unshift( renderItem ); + + } else { + + opaque.unshift( renderItem ); + + } + + } + + function sort( customOpaqueSort, customTransparentSort ) { + + if ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable ); + if ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable ); + if ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable ); + + } + + function finish() { + + // Clear references from inactive renderItems in the list + + for ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) { + + const renderItem = renderItems[ i ]; + + if ( renderItem.id === null ) break; + + renderItem.id = null; + renderItem.object = null; + renderItem.geometry = null; + renderItem.material = null; + renderItem.group = null; + + } + + } + + return { + + opaque: opaque, + transmissive: transmissive, + transparent: transparent, + + init: init, + push: push, + unshift: unshift, + finish: finish, + + sort: sort + }; + +} + +function WebGLRenderLists() { + + let lists = new WeakMap(); + + function get( scene, renderCallDepth ) { + + const listArray = lists.get( scene ); + let list; + + if ( listArray === undefined ) { + + list = new WebGLRenderList(); + lists.set( scene, [ list ] ); + + } else { + + if ( renderCallDepth >= listArray.length ) { + + list = new WebGLRenderList(); + listArray.push( list ); + + } else { + + list = listArray[ renderCallDepth ]; + + } + + } + + return list; + + } + + function dispose() { + + lists = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + +} + +function UniformsCache() { + + const lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + let uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0 + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0 + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + +} + +function ShadowUniformsCache() { + + const lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + let uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + shadowIntensity: 1, + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + shadowIntensity: 1, + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + shadowIntensity: 1, + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + }; + break; + + // TODO (abelnation): set RectAreaLight shadow uniforms + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + +} + + + +let nextVersion = 0; + +function shadowCastingAndTexturingLightsFirst( lightA, lightB ) { + + return ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 ); + +} + +function WebGLLights( extensions ) { + + const cache = new UniformsCache(); + + const shadowCache = ShadowUniformsCache(); + + const state = { + + version: 0, + + hash: { + directionalLength: -1, + pointLength: -1, + spotLength: -1, + rectAreaLength: -1, + hemiLength: -1, + + numDirectionalShadows: -1, + numPointShadows: -1, + numSpotShadows: -1, + numSpotMaps: -1, + + numLightProbes: -1 + }, + + ambient: [ 0, 0, 0 ], + probe: [], + directional: [], + directionalShadow: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotLightMap: [], + spotShadow: [], + spotShadowMap: [], + spotLightMatrix: [], + rectArea: [], + rectAreaLTC1: null, + rectAreaLTC2: null, + point: [], + pointShadow: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + numSpotLightShadowsWithMaps: 0, + numLightProbes: 0 + + }; + + for ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() ); + + const vector3 = new Vector3(); + const matrix4 = new Matrix4(); + const matrix42 = new Matrix4(); + + function setup( lights ) { + + let r = 0, g = 0, b = 0; + + for ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 ); + + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + + let numDirectionalShadows = 0; + let numPointShadows = 0; + let numSpotShadows = 0; + let numSpotMaps = 0; + let numSpotShadowsWithMaps = 0; + + let numLightProbes = 0; + + // ordering : [shadow casting + map texturing, map texturing, shadow casting, none ] + lights.sort( shadowCastingAndTexturingLightsFirst ); + + for ( let i = 0, l = lights.length; i < l; i ++ ) { + + const light = lights[ i ]; + + const color = light.color; + const intensity = light.intensity; + const distance = light.distance; + + const shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isLightProbe ) { + + for ( let j = 0; j < 9; j ++ ) { + + state.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity ); + + } + + numLightProbes ++; + + } else if ( light.isDirectionalLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowIntensity = shadow.intensity; + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + + state.directionalShadow[ directionalLength ] = shadowUniforms; + state.directionalShadowMap[ directionalLength ] = shadowMap; + state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + + numDirectionalShadows ++; + + } + + state.directional[ directionalLength ] = uniforms; + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + const uniforms = cache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = light.decay; + + state.spot[ spotLength ] = uniforms; + + const shadow = light.shadow; + + if ( light.map ) { + + state.spotLightMap[ numSpotMaps ] = light.map; + numSpotMaps ++; + + // make sure the lightMatrix is up to date + // TODO : do it if required only + shadow.updateMatrices( light ); + + if ( light.castShadow ) numSpotShadowsWithMaps ++; + + } + + state.spotLightMatrix[ spotLength ] = shadow.matrix; + + if ( light.castShadow ) { + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowIntensity = shadow.intensity; + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + + state.spotShadow[ spotLength ] = shadowUniforms; + state.spotShadowMap[ spotLength ] = shadowMap; + + numSpotShadows ++; + + } + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + state.rectArea[ rectAreaLength ] = uniforms; + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + const uniforms = cache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + + if ( light.castShadow ) { + + const shadow = light.shadow; + + const shadowUniforms = shadowCache.get( light ); + + shadowUniforms.shadowIntensity = shadow.intensity; + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + shadowUniforms.shadowCameraNear = shadow.camera.near; + shadowUniforms.shadowCameraFar = shadow.camera.far; + + state.pointShadow[ pointLength ] = shadowUniforms; + state.pointShadowMap[ pointLength ] = shadowMap; + state.pointShadowMatrix[ pointLength ] = light.shadow.matrix; + + numPointShadows ++; + + } + + state.point[ pointLength ] = uniforms; + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + const uniforms = cache.get( light ); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + state.hemi[ hemiLength ] = uniforms; + + hemiLength ++; + + } + + } + + if ( rectAreaLength > 0 ) { + + if ( extensions.has( 'OES_texture_float_linear' ) === true ) { + + state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; + state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; + + } else { + + state.rectAreaLTC1 = UniformsLib.LTC_HALF_1; + state.rectAreaLTC2 = UniformsLib.LTC_HALF_2; + + } + + } + + state.ambient[ 0 ] = r; + state.ambient[ 1 ] = g; + state.ambient[ 2 ] = b; + + const hash = state.hash; + + if ( hash.directionalLength !== directionalLength || + hash.pointLength !== pointLength || + hash.spotLength !== spotLength || + hash.rectAreaLength !== rectAreaLength || + hash.hemiLength !== hemiLength || + hash.numDirectionalShadows !== numDirectionalShadows || + hash.numPointShadows !== numPointShadows || + hash.numSpotShadows !== numSpotShadows || + hash.numSpotMaps !== numSpotMaps || + hash.numLightProbes !== numLightProbes ) { + + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + + state.directionalShadow.length = numDirectionalShadows; + state.directionalShadowMap.length = numDirectionalShadows; + state.pointShadow.length = numPointShadows; + state.pointShadowMap.length = numPointShadows; + state.spotShadow.length = numSpotShadows; + state.spotShadowMap.length = numSpotShadows; + state.directionalShadowMatrix.length = numDirectionalShadows; + state.pointShadowMatrix.length = numPointShadows; + state.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps; + state.spotLightMap.length = numSpotMaps; + state.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps; + state.numLightProbes = numLightProbes; + + hash.directionalLength = directionalLength; + hash.pointLength = pointLength; + hash.spotLength = spotLength; + hash.rectAreaLength = rectAreaLength; + hash.hemiLength = hemiLength; + + hash.numDirectionalShadows = numDirectionalShadows; + hash.numPointShadows = numPointShadows; + hash.numSpotShadows = numSpotShadows; + hash.numSpotMaps = numSpotMaps; + + hash.numLightProbes = numLightProbes; + + state.version = nextVersion ++; + + } + + } + + function setupView( lights, camera ) { + + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + + const viewMatrix = camera.matrixWorldInverse; + + for ( let i = 0, l = lights.length; i < l; i ++ ) { + + const light = lights[ i ]; + + if ( light.isDirectionalLight ) { + + const uniforms = state.directional[ directionalLength ]; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + directionalLength ++; + + } else if ( light.isSpotLight ) { + + const uniforms = state.spot[ spotLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + spotLength ++; + + } else if ( light.isRectAreaLight ) { + + const uniforms = state.rectArea[ rectAreaLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + // extract local rotation of light to derive width/height half vectors + matrix42.identity(); + matrix4.copy( light.matrixWorld ); + matrix4.premultiply( viewMatrix ); + matrix42.extractRotation( matrix4 ); + + uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); + uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); + + uniforms.halfWidth.applyMatrix4( matrix42 ); + uniforms.halfHeight.applyMatrix4( matrix42 ); + + rectAreaLength ++; + + } else if ( light.isPointLight ) { + + const uniforms = state.point[ pointLength ]; + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + pointLength ++; + + } else if ( light.isHemisphereLight ) { + + const uniforms = state.hemi[ hemiLength ]; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + + hemiLength ++; + + } + + } + + } + + return { + setup: setup, + setupView: setupView, + state: state + }; + +} + +function WebGLRenderState( extensions ) { + + const lights = new WebGLLights( extensions ); + + const lightsArray = []; + const shadowsArray = []; + + function init( camera ) { + + state.camera = camera; + + lightsArray.length = 0; + shadowsArray.length = 0; + + } + + function pushLight( light ) { + + lightsArray.push( light ); + + } + + function pushShadow( shadowLight ) { + + shadowsArray.push( shadowLight ); + + } + + function setupLights() { + + lights.setup( lightsArray ); + + } + + function setupLightsView( camera ) { + + lights.setupView( lightsArray, camera ); + + } + + const state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + + camera: null, + + lights: lights, + + transmissionRenderTarget: {} + }; + + return { + init: init, + state: state, + setupLights: setupLights, + setupLightsView: setupLightsView, + + pushLight: pushLight, + pushShadow: pushShadow + }; + +} + +function WebGLRenderStates( extensions ) { + + let renderStates = new WeakMap(); + + function get( scene, renderCallDepth = 0 ) { + + const renderStateArray = renderStates.get( scene ); + let renderState; + + if ( renderStateArray === undefined ) { + + renderState = new WebGLRenderState( extensions ); + renderStates.set( scene, [ renderState ] ); + + } else { + + if ( renderCallDepth >= renderStateArray.length ) { + + renderState = new WebGLRenderState( extensions ); + renderStateArray.push( renderState ); + + } else { + + renderState = renderStateArray[ renderCallDepth ]; + + } + + } + + return renderState; + + } + + function dispose() { + + renderStates = new WeakMap(); + + } + + return { + get: get, + dispose: dispose + }; + +} + +const vertex = "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}"; + +const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"; + +function WebGLShadowMap( renderer, objects, capabilities ) { + + let _frustum = new Frustum(); + + const _shadowMapSize = new Vector2(), + _viewportSize = new Vector2(), + + _viewport = new Vector4(), + + _depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ), + _distanceMaterial = new MeshDistanceMaterial(), + + _materialCache = {}, + + _maxTextureSize = capabilities.maxTextureSize; + + const shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide }; + + const shadowMaterialVertical = new ShaderMaterial( { + defines: { + VSM_SAMPLES: 8 + }, + uniforms: { + shadow_pass: { value: null }, + resolution: { value: new Vector2() }, + radius: { value: 4.0 } + }, + + vertexShader: vertex, + fragmentShader: fragment + + } ); + + const shadowMaterialHorizontal = shadowMaterialVertical.clone(); + shadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1; + + const fullScreenTri = new BufferGeometry(); + fullScreenTri.setAttribute( + 'position', + new BufferAttribute( + new Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ), + 3 + ) + ); + + const fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical ); + + const scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + let _previousType = this.type; + + this.render = function ( lights, scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( lights.length === 0 ) return; + + const currentRenderTarget = renderer.getRenderTarget(); + const activeCubeFace = renderer.getActiveCubeFace(); + const activeMipmapLevel = renderer.getActiveMipmapLevel(); + + const _state = renderer.state; + + // Set GL state for depth map. + _state.setBlending( NoBlending ); + _state.buffers.color.setClear( 1, 1, 1, 1 ); + _state.buffers.depth.setTest( true ); + _state.setScissorTest( false ); + + // check for shadow map type changes + + const toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap ); + const fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap ); + + // render depth map + + for ( let i = 0, il = lights.length; i < il; i ++ ) { + + const light = lights[ i ]; + const shadow = light.shadow; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + if ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue; + + _shadowMapSize.copy( shadow.mapSize ); + + const shadowFrameExtents = shadow.getFrameExtents(); + + _shadowMapSize.multiply( shadowFrameExtents ); + + _viewportSize.copy( shadow.mapSize ); + + if ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) { + + if ( _shadowMapSize.x > _maxTextureSize ) { + + _viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x ); + _shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x; + shadow.mapSize.x = _viewportSize.x; + + } + + if ( _shadowMapSize.y > _maxTextureSize ) { + + _viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y ); + _shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y; + shadow.mapSize.y = _viewportSize.y; + + } + + } + + if ( shadow.map === null || toVSM === true || fromVSM === true ) { + + const pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {}; + + if ( shadow.map !== null ) { + + shadow.map.dispose(); + + } + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + shadow.map.texture.name = light.name + '.shadowMap'; + + shadow.camera.updateProjectionMatrix(); + + } + + renderer.setRenderTarget( shadow.map ); + renderer.clear(); + + const viewportCount = shadow.getViewportCount(); + + for ( let vp = 0; vp < viewportCount; vp ++ ) { + + const viewport = shadow.getViewport( vp ); + + _viewport.set( + _viewportSize.x * viewport.x, + _viewportSize.y * viewport.y, + _viewportSize.x * viewport.z, + _viewportSize.y * viewport.w + ); + + _state.viewport( _viewport ); + + shadow.updateMatrices( light, vp ); + + _frustum = shadow.getFrustum(); + + renderObject( scene, camera, shadow.camera, light, this.type ); + + } + + // do blur pass for VSM + + if ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) { + + VSMPass( shadow, camera ); + + } + + shadow.needsUpdate = false; + + } + + _previousType = this.type; + + scope.needsUpdate = false; + + renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel ); + + }; + + function VSMPass( shadow, camera ) { + + const geometry = objects.update( fullScreenMesh ); + + if ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) { + + shadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples; + shadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples; + + shadowMaterialVertical.needsUpdate = true; + shadowMaterialHorizontal.needsUpdate = true; + + } + + if ( shadow.mapPass === null ) { + + shadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y ); + + } + + // vertical pass + + shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture; + shadowMaterialVertical.uniforms.resolution.value = shadow.mapSize; + shadowMaterialVertical.uniforms.radius.value = shadow.radius; + renderer.setRenderTarget( shadow.mapPass ); + renderer.clear(); + renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null ); + + // horizontal pass + + shadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture; + shadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize; + shadowMaterialHorizontal.uniforms.radius.value = shadow.radius; + renderer.setRenderTarget( shadow.map ); + renderer.clear(); + renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null ); + + } + + function getDepthMaterial( object, material, light, type ) { + + let result = null; + + const customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial; + + if ( customMaterial !== undefined ) { + + result = customMaterial; + + } else { + + result = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial; + + if ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) || + ( material.displacementMap && material.displacementScale !== 0 ) || + ( material.alphaMap && material.alphaTest > 0 ) || + ( material.map && material.alphaTest > 0 ) ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + const keyA = result.uuid, keyB = material.uuid; + + let materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + let cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + material.addEventListener( 'dispose', onMaterialDispose ); + + } + + result = cachedMaterial; + + } + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + if ( type === VSMShadowMap ) { + + result.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side; + + } else { + + result.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ]; + + } + + result.alphaMap = material.alphaMap; + result.alphaTest = material.alphaTest; + result.map = material.map; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + + result.displacementMap = material.displacementMap; + result.displacementScale = material.displacementScale; + result.displacementBias = material.displacementBias; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) { + + const materialProperties = renderer.properties.get( result ); + materialProperties.light = light; + + } + + return result; + + } + + function renderObject( object, camera, shadowCamera, light, type ) { + + if ( object.visible === false ) return; + + const visible = object.layers.test( camera.layers ); + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + + const geometry = objects.update( object ); + const material = object.material; + + if ( Array.isArray( material ) ) { + + const groups = geometry.groups; + + for ( let k = 0, kl = groups.length; k < kl; k ++ ) { + + const group = groups[ k ]; + const groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + const depthMaterial = getDepthMaterial( object, groupMaterial, light, type ); + + object.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group ); + + renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + object.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group ); + + } + + } + + } else if ( material.visible ) { + + const depthMaterial = getDepthMaterial( object, material, light, type ); + + object.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null ); + + renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + object.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null ); + + } + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + renderObject( children[ i ], camera, shadowCamera, light, type ); + + } + + } + + function onMaterialDispose( event ) { + + const material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + // make sure to remove the unique distance/depth materials used for shadow map rendering + + for ( const id in _materialCache ) { + + const cache = _materialCache[ id ]; + + const uuid = event.target.uuid; + + if ( uuid in cache ) { + + const shadowMaterial = cache[ uuid ]; + shadowMaterial.dispose(); + delete cache[ uuid ]; + + } + + } + + } + +} + +const reversedFuncs = { + [ NeverDepth ]: AlwaysDepth, + [ LessDepth ]: GreaterDepth, + [ EqualDepth ]: NotEqualDepth, + [ LessEqualDepth ]: GreaterEqualDepth, + + [ AlwaysDepth ]: NeverDepth, + [ GreaterDepth ]: LessDepth, + [ NotEqualDepth ]: EqualDepth, + [ GreaterEqualDepth ]: LessEqualDepth, +}; + +function WebGLState( gl, extensions ) { + + function ColorBuffer() { + + let locked = false; + + const color = new Vector4(); + let currentColorMask = null; + const currentColorClear = new Vector4( 0, 0, 0, 0 ); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a, premultipliedAlpha ) { + + if ( premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( -1, 0, 0, 0 ); // set to invalid state + + } + + }; + + } + + function DepthBuffer() { + + let locked = false; + let reversed = false; + + let currentDepthMask = null; + let currentDepthFunc = null; + let currentDepthClear = null; + + return { + + setReversed: function ( value ) { + + if ( reversed !== value ) { + + const ext = extensions.get( 'EXT_clip_control' ); + + if ( reversed ) { + + ext.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT ); + + } else { + + ext.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT ); + + } + + const oldDepth = currentDepthClear; + currentDepthClear = null; + this.setClear( oldDepth ); + + } + + reversed = value; + + }, + + getReversed: function () { + + return reversed; + + }, + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( reversed ) depthFunc = reversedFuncs[ depthFunc ]; + + if ( currentDepthFunc !== depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + if ( reversed ) { + + depth = 1 - depth; + + } + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + reversed = false; + + } + + }; + + } + + function StencilBuffer() { + + let locked = false; + + let currentStencilMask = null; + let currentStencilFunc = null; + let currentStencilRef = null; + let currentStencilFuncMask = null; + let currentStencilFail = null; + let currentStencilZFail = null; + let currentStencilZPass = null; + let currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( ! locked ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + const colorBuffer = new ColorBuffer(); + const depthBuffer = new DepthBuffer(); + const stencilBuffer = new StencilBuffer(); + + const uboBindings = new WeakMap(); + const uboProgramMap = new WeakMap(); + + let enabledCapabilities = {}; + + let currentBoundFramebuffers = {}; + let currentDrawbuffers = new WeakMap(); + let defaultDrawbuffers = []; + + let currentProgram = null; + + let currentBlendingEnabled = false; + let currentBlending = null; + let currentBlendEquation = null; + let currentBlendSrc = null; + let currentBlendDst = null; + let currentBlendEquationAlpha = null; + let currentBlendSrcAlpha = null; + let currentBlendDstAlpha = null; + let currentBlendColor = new Color( 0, 0, 0 ); + let currentBlendAlpha = 0; + let currentPremultipledAlpha = false; + + let currentFlipSided = null; + let currentCullFace = null; + + let currentLineWidth = null; + + let currentPolygonOffsetFactor = null; + let currentPolygonOffsetUnits = null; + + const maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ); + + let lineWidthAvailable = false; + let version = 0; + const glVersion = gl.getParameter( gl.VERSION ); + + if ( glVersion.indexOf( 'WebGL' ) !== -1 ) { + + version = parseFloat( /^WebGL (\d)/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 1.0 ); + + } else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) { + + version = parseFloat( /^OpenGL ES (\d)/.exec( glVersion )[ 1 ] ); + lineWidthAvailable = ( version >= 2.0 ); + + } + + let currentTextureSlot = null; + let currentBoundTextures = {}; + + const scissorParam = gl.getParameter( gl.SCISSOR_BOX ); + const viewportParam = gl.getParameter( gl.VIEWPORT ); + + const currentScissor = new Vector4().fromArray( scissorParam ); + const currentViewport = new Vector4().fromArray( viewportParam ); + + function createTexture( type, target, count, dimensions ) { + + const data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + const texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( let i = 0; i < count; i ++ ) { + + if ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) { + + gl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } else { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + } + + return texture; + + } + + const emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + emptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 ); + emptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 ); + + // init + + colorBuffer.setClear( 0, 0, 0, 1 ); + depthBuffer.setClear( 1 ); + stencilBuffer.setClear( 0 ); + + enable( gl.DEPTH_TEST ); + depthBuffer.setFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + setBlending( NoBlending ); + + // + + function enable( id ) { + + if ( enabledCapabilities[ id ] !== true ) { + + gl.enable( id ); + enabledCapabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( enabledCapabilities[ id ] !== false ) { + + gl.disable( id ); + enabledCapabilities[ id ] = false; + + } + + } + + function bindFramebuffer( target, framebuffer ) { + + if ( currentBoundFramebuffers[ target ] !== framebuffer ) { + + gl.bindFramebuffer( target, framebuffer ); + + currentBoundFramebuffers[ target ] = framebuffer; + + // gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER + + if ( target === gl.DRAW_FRAMEBUFFER ) { + + currentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer; + + } + + if ( target === gl.FRAMEBUFFER ) { + + currentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer; + + } + + return true; + + } + + return false; + + } + + function drawBuffers( renderTarget, framebuffer ) { + + let drawBuffers = defaultDrawbuffers; + + let needsUpdate = false; + + if ( renderTarget ) { + + drawBuffers = currentDrawbuffers.get( framebuffer ); + + if ( drawBuffers === undefined ) { + + drawBuffers = []; + currentDrawbuffers.set( framebuffer, drawBuffers ); + + } + + const textures = renderTarget.textures; + + if ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) { + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + drawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i; + + } + + drawBuffers.length = textures.length; + + needsUpdate = true; + + } + + } else { + + if ( drawBuffers[ 0 ] !== gl.BACK ) { + + drawBuffers[ 0 ] = gl.BACK; + + needsUpdate = true; + + } + + } + + if ( needsUpdate ) { + + gl.drawBuffers( drawBuffers ); + + } + + } + + function useProgram( program ) { + + if ( currentProgram !== program ) { + + gl.useProgram( program ); + + currentProgram = program; + + return true; + + } + + return false; + + } + + const equationToGL = { + [ AddEquation ]: gl.FUNC_ADD, + [ SubtractEquation ]: gl.FUNC_SUBTRACT, + [ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT + }; + + equationToGL[ MinEquation ] = gl.MIN; + equationToGL[ MaxEquation ] = gl.MAX; + + const factorToGL = { + [ ZeroFactor ]: gl.ZERO, + [ OneFactor ]: gl.ONE, + [ SrcColorFactor ]: gl.SRC_COLOR, + [ SrcAlphaFactor ]: gl.SRC_ALPHA, + [ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE, + [ DstColorFactor ]: gl.DST_COLOR, + [ DstAlphaFactor ]: gl.DST_ALPHA, + [ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR, + [ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA, + [ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR, + [ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA, + [ ConstantColorFactor ]: gl.CONSTANT_COLOR, + [ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR, + [ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA, + [ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA + }; + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) { + + if ( blending === NoBlending ) { + + if ( currentBlendingEnabled === true ) { + + disable( gl.BLEND ); + currentBlendingEnabled = false; + + } + + return; + + } + + if ( currentBlendingEnabled === false ) { + + enable( gl.BLEND ); + currentBlendingEnabled = true; + + } + + if ( blending !== CustomBlending ) { + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) { + + gl.blendEquation( gl.FUNC_ADD ); + + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; + + } + + if ( premultipliedAlpha ) { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case AdditiveBlending: + gl.blendFunc( gl.ONE, gl.ONE ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE ); + break; + + case MultiplyBlending: + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } else { + + switch ( blending ) { + + case NormalBlending: + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + break; + + case AdditiveBlending: + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + break; + + case SubtractiveBlending: + gl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE ); + break; + + case MultiplyBlending: + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + break; + + default: + console.error( 'THREE.WebGLState: Invalid blending: ', blending ); + break; + + } + + } + + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentBlendColor.set( 0, 0, 0 ); + currentBlendAlpha = 0; + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + return; + + } + + // custom blending + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + if ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) { + + gl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha ); + + currentBlendColor.copy( blendColor ); + currentBlendAlpha = blendAlpha; + + } + + currentBlending = blending; + currentPremultipledAlpha = false; + + } + + function setMaterial( material, frontFaceCW ) { + + material.side === DoubleSide + ? disable( gl.CULL_FACE ) + : enable( gl.CULL_FACE ); + + let flipSided = ( material.side === BackSide ); + if ( frontFaceCW ) flipSided = ! flipSided; + + setFlipSided( flipSided ); + + ( material.blending === NormalBlending && material.transparent === false ) + ? setBlending( NoBlending ) + : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha ); + + depthBuffer.setFunc( material.depthFunc ); + depthBuffer.setTest( material.depthTest ); + depthBuffer.setMask( material.depthWrite ); + colorBuffer.setMask( material.colorWrite ); + + const stencilWrite = material.stencilWrite; + stencilBuffer.setTest( stencilWrite ); + if ( stencilWrite ) { + + stencilBuffer.setMask( material.stencilWriteMask ); + stencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask ); + stencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass ); + + } + + setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + material.alphaToCoverage === true + ? enable( gl.SAMPLE_ALPHA_TO_COVERAGE ) + : disable( gl.SAMPLE_ALPHA_TO_COVERAGE ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + if ( lineWidthAvailable ) gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function setScissorTest( scissorTest ) { + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture, webglSlot ) { + + if ( webglSlot === undefined ) { + + if ( currentTextureSlot === null ) { + + webglSlot = gl.TEXTURE0 + maxTextures - 1; + + } else { + + webglSlot = currentTextureSlot; + + } + + } + + let boundTexture = currentBoundTextures[ webglSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ webglSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function unbindTexture() { + + const boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture !== undefined && boundTexture.type !== undefined ) { + + gl.bindTexture( boundTexture.type, null ); + + boundTexture.type = undefined; + boundTexture.texture = undefined; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function compressedTexImage3D() { + + try { + + gl.compressedTexImage3D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texSubImage2D() { + + try { + + gl.texSubImage2D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texSubImage3D() { + + try { + + gl.texSubImage3D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function compressedTexSubImage2D() { + + try { + + gl.compressedTexSubImage2D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function compressedTexSubImage3D() { + + try { + + gl.compressedTexSubImage3D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texStorage2D() { + + try { + + gl.texStorage2D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texStorage3D() { + + try { + + gl.texStorage3D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + function texImage3D() { + + try { + + gl.texImage3D( ...arguments ); + + } catch ( error ) { + + console.error( 'THREE.WebGLState:', error ); + + } + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + function updateUBOMapping( uniformsGroup, program ) { + + let mapping = uboProgramMap.get( program ); + + if ( mapping === undefined ) { + + mapping = new WeakMap(); + + uboProgramMap.set( program, mapping ); + + } + + let blockIndex = mapping.get( uniformsGroup ); + + if ( blockIndex === undefined ) { + + blockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name ); + + mapping.set( uniformsGroup, blockIndex ); + + } + + } + + function uniformBlockBinding( uniformsGroup, program ) { + + const mapping = uboProgramMap.get( program ); + const blockIndex = mapping.get( uniformsGroup ); + + if ( uboBindings.get( program ) !== blockIndex ) { + + // bind shader specific block index to global block point + gl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex ); + + uboBindings.set( program, blockIndex ); + + } + + } + + // + + function reset() { + + // reset state + + gl.disable( gl.BLEND ); + gl.disable( gl.CULL_FACE ); + gl.disable( gl.DEPTH_TEST ); + gl.disable( gl.POLYGON_OFFSET_FILL ); + gl.disable( gl.SCISSOR_TEST ); + gl.disable( gl.STENCIL_TEST ); + gl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE ); + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ONE, gl.ZERO ); + gl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO ); + gl.blendColor( 0, 0, 0, 0 ); + + gl.colorMask( true, true, true, true ); + gl.clearColor( 0, 0, 0, 0 ); + + gl.depthMask( true ); + gl.depthFunc( gl.LESS ); + + depthBuffer.setReversed( false ); + + gl.clearDepth( 1 ); + + gl.stencilMask( 0xffffffff ); + gl.stencilFunc( gl.ALWAYS, 0, 0xffffffff ); + gl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP ); + gl.clearStencil( 0 ); + + gl.cullFace( gl.BACK ); + gl.frontFace( gl.CCW ); + + gl.polygonOffset( 0, 0 ); + + gl.activeTexture( gl.TEXTURE0 ); + + gl.bindFramebuffer( gl.FRAMEBUFFER, null ); + gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null ); + gl.bindFramebuffer( gl.READ_FRAMEBUFFER, null ); + + gl.useProgram( null ); + + gl.lineWidth( 1 ); + + gl.scissor( 0, 0, gl.canvas.width, gl.canvas.height ); + gl.viewport( 0, 0, gl.canvas.width, gl.canvas.height ); + + // reset internals + + enabledCapabilities = {}; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentBoundFramebuffers = {}; + currentDrawbuffers = new WeakMap(); + defaultDrawbuffers = []; + + currentProgram = null; + + currentBlendingEnabled = false; + currentBlending = null; + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentBlendColor = new Color( 0, 0, 0 ); + currentBlendAlpha = 0; + currentPremultipledAlpha = false; + + currentFlipSided = null; + currentCullFace = null; + + currentLineWidth = null; + + currentPolygonOffsetFactor = null; + currentPolygonOffsetUnits = null; + + currentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height ); + currentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height ); + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + enable: enable, + disable: disable, + + bindFramebuffer: bindFramebuffer, + drawBuffers: drawBuffers, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + unbindTexture: unbindTexture, + compressedTexImage2D: compressedTexImage2D, + compressedTexImage3D: compressedTexImage3D, + texImage2D: texImage2D, + texImage3D: texImage3D, + + updateUBOMapping: updateUBOMapping, + uniformBlockBinding: uniformBlockBinding, + + texStorage2D: texStorage2D, + texStorage3D: texStorage3D, + texSubImage2D: texSubImage2D, + texSubImage3D: texSubImage3D, + compressedTexSubImage2D: compressedTexSubImage2D, + compressedTexSubImage3D: compressedTexSubImage3D, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + +} + +function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { + + const multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null; + const supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent ); + + const _imageDimensions = new Vector2(); + const _videoTextures = new WeakMap(); + let _canvas; + + const _sources = new WeakMap(); // maps WebglTexture objects to instances of Source + + // cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas, + // also OffscreenCanvas.getContext("webgl"), but not OffscreenCanvas.getContext("2d")! + // Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d). + + let useOffscreenCanvas = false; + + try { + + useOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' + // eslint-disable-next-line compat/compat + && ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null; + + } catch ( err ) { + + // Ignore any errors + + } + + function createCanvas( width, height ) { + + // Use OffscreenCanvas when available. Specially needed in web workers + + return useOffscreenCanvas ? + // eslint-disable-next-line compat/compat + new OffscreenCanvas( width, height ) : createElementNS( 'canvas' ); + + } + + function resizeImage( image, needsNewCanvas, maxSize ) { + + let scale = 1; + + const dimensions = getDimensions( image ); + + // handle case if texture exceeds max size + + if ( dimensions.width > maxSize || dimensions.height > maxSize ) { + + scale = maxSize / Math.max( dimensions.width, dimensions.height ); + + } + + // only perform resize if necessary + + if ( scale < 1 ) { + + // only perform resize for certain image types + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) || + ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) { + + const width = Math.floor( scale * dimensions.width ); + const height = Math.floor( scale * dimensions.height ); + + if ( _canvas === undefined ) _canvas = createCanvas( width, height ); + + // cube textures can't reuse the same canvas + + const canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas; + + canvas.width = width; + canvas.height = height; + + const context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, width, height ); + + console.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' ); + + return canvas; + + } else { + + if ( 'data' in image ) { + + console.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' ); + + } + + return image; + + } + + } + + return image; + + } + + function textureNeedsGenerateMipmaps( texture ) { + + return texture.generateMipmaps; + + } + + function generateMipmap( target ) { + + _gl.generateMipmap( target ); + + } + + function getTargetType( texture ) { + + if ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP; + if ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D; + if ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY; + return _gl.TEXTURE_2D; + + } + + function getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) { + + if ( internalFormatName !== null ) { + + if ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ]; + + console.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \'' + internalFormatName + '\'' ); + + } + + let internalFormat = glFormat; + + if ( glFormat === _gl.RED ) { + + if ( glType === _gl.FLOAT ) internalFormat = _gl.R32F; + if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F; + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8; + + } + + if ( glFormat === _gl.RED_INTEGER ) { + + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI; + if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI; + if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI; + if ( glType === _gl.BYTE ) internalFormat = _gl.R8I; + if ( glType === _gl.SHORT ) internalFormat = _gl.R16I; + if ( glType === _gl.INT ) internalFormat = _gl.R32I; + + } + + if ( glFormat === _gl.RG ) { + + if ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F; + if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F; + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8; + + } + + if ( glFormat === _gl.RG_INTEGER ) { + + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI; + if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI; + if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI; + if ( glType === _gl.BYTE ) internalFormat = _gl.RG8I; + if ( glType === _gl.SHORT ) internalFormat = _gl.RG16I; + if ( glType === _gl.INT ) internalFormat = _gl.RG32I; + + } + + if ( glFormat === _gl.RGB_INTEGER ) { + + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI; + if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI; + if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI; + if ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I; + if ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I; + if ( glType === _gl.INT ) internalFormat = _gl.RGB32I; + + } + + if ( glFormat === _gl.RGBA_INTEGER ) { + + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI; + if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI; + if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI; + if ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I; + if ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I; + if ( glType === _gl.INT ) internalFormat = _gl.RGBA32I; + + } + + if ( glFormat === _gl.RGB ) { + + if ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5; + + } + + if ( glFormat === _gl.RGBA ) { + + const transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace ); + + if ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F; + if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F; + if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8; + if ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4; + if ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1; + + } + + if ( internalFormat === _gl.R16F || internalFormat === _gl.R32F || + internalFormat === _gl.RG16F || internalFormat === _gl.RG32F || + internalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) { + + extensions.get( 'EXT_color_buffer_float' ); + + } + + return internalFormat; + + } + + function getInternalDepthFormat( useStencil, depthType ) { + + let glInternalFormat; + if ( useStencil ) { + + if ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) { + + glInternalFormat = _gl.DEPTH24_STENCIL8; + + } else if ( depthType === FloatType ) { + + glInternalFormat = _gl.DEPTH32F_STENCIL8; + + } else if ( depthType === UnsignedShortType ) { + + glInternalFormat = _gl.DEPTH24_STENCIL8; + console.warn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' ); + + } + + } else { + + if ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) { + + glInternalFormat = _gl.DEPTH_COMPONENT24; + + } else if ( depthType === FloatType ) { + + glInternalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( depthType === UnsignedShortType ) { + + glInternalFormat = _gl.DEPTH_COMPONENT16; + + } + + } + + return glInternalFormat; + + } + + function getMipLevels( texture, image ) { + + if ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) { + + return Math.log2( Math.max( image.width, image.height ) ) + 1; + + } else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) { + + // user-defined mipmaps + + return texture.mipmaps.length; + + } else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) { + + return image.mipmaps.length; + + } else { + + // texture without mipmaps (only base level) + + return 1; + + } + + } + + // + + function onTextureDispose( event ) { + + const texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + if ( texture.isVideoTexture ) { + + _videoTextures.delete( texture ); + + } + + } + + function onRenderTargetDispose( event ) { + + const renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + } + + // + + function deallocateTexture( texture ) { + + const textureProperties = properties.get( texture ); + + if ( textureProperties.__webglInit === undefined ) return; + + // check if it's necessary to remove the WebGLTexture object + + const source = texture.source; + const webglTextures = _sources.get( source ); + + if ( webglTextures ) { + + const webglTexture = webglTextures[ textureProperties.__cacheKey ]; + webglTexture.usedTimes --; + + // the WebGLTexture object is not used anymore, remove it + + if ( webglTexture.usedTimes === 0 ) { + + deleteTexture( texture ); + + } + + // remove the weak map entry if no WebGLTexture uses the source anymore + + if ( Object.keys( webglTextures ).length === 0 ) { + + _sources.delete( source ); + + } + + } + + properties.remove( texture ); + + } + + function deleteTexture( texture ) { + + const textureProperties = properties.get( texture ); + _gl.deleteTexture( textureProperties.__webglTexture ); + + const source = texture.source; + const webglTextures = _sources.get( source ); + delete webglTextures[ textureProperties.__cacheKey ]; + + info.memory.textures --; + + } + + function deallocateRenderTarget( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + properties.remove( renderTarget.depthTexture ); + + } + + if ( renderTarget.isWebGLCubeRenderTarget ) { + + for ( let i = 0; i < 6; i ++ ) { + + if ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) { + + for ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] ); + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + + } + + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + if ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) { + + for ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] ); + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + + } + + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer ); + + if ( renderTargetProperties.__webglColorRenderbuffer ) { + + for ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) { + + if ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + } + + } + + if ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer ); + + } + + const textures = renderTarget.textures; + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const attachmentProperties = properties.get( textures[ i ] ); + + if ( attachmentProperties.__webglTexture ) { + + _gl.deleteTexture( attachmentProperties.__webglTexture ); + + info.memory.textures --; + + } + + properties.remove( textures[ i ] ); + + } + + properties.remove( renderTarget ); + + } + + // + + let textureUnits = 0; + + function resetTextureUnits() { + + textureUnits = 0; + + } + + function allocateTextureUnit() { + + const textureUnit = textureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + textureUnits += 1; + + return textureUnit; + + } + + function getTextureCacheKey( texture ) { + + const array = []; + + array.push( texture.wrapS ); + array.push( texture.wrapT ); + array.push( texture.wrapR || 0 ); + array.push( texture.magFilter ); + array.push( texture.minFilter ); + array.push( texture.anisotropy ); + array.push( texture.internalFormat ); + array.push( texture.format ); + array.push( texture.type ); + array.push( texture.generateMipmaps ); + array.push( texture.premultiplyAlpha ); + array.push( texture.flipY ); + array.push( texture.unpackAlignment ); + array.push( texture.colorSpace ); + + return array.join(); + + } + + // + + function setTexture2D( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.isVideoTexture ) updateVideoTexture( texture ); + + if ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) { + + const image = texture.image; + + if ( image === null ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + } + + function setTexture2DArray( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + } + + function setTexture3D( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + state.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + } + + function setTextureCube( texture, slot ) { + + const textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + uploadCubeTexture( textureProperties, texture, slot ); + return; + + } + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + } + + const wrappingToGL = { + [ RepeatWrapping ]: _gl.REPEAT, + [ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE, + [ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT + }; + + const filterToGL = { + [ NearestFilter ]: _gl.NEAREST, + [ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST, + [ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR, + + [ LinearFilter ]: _gl.LINEAR, + [ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST, + [ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR + }; + + const compareToGL = { + [ NeverCompare ]: _gl.NEVER, + [ AlwaysCompare ]: _gl.ALWAYS, + [ LessCompare ]: _gl.LESS, + [ LessEqualCompare ]: _gl.LEQUAL, + [ EqualCompare ]: _gl.EQUAL, + [ GreaterEqualCompare ]: _gl.GEQUAL, + [ GreaterCompare ]: _gl.GREATER, + [ NotEqualCompare ]: _gl.NOTEQUAL + }; + + function setTextureParameters( textureType, texture ) { + + if ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false && + ( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter || + texture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) { + + console.warn( 'THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] ); + + if ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] ); + + if ( texture.compareFunction ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE ); + _gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] ); + + } + + if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) { + + if ( texture.magFilter === NearestFilter ) return; + if ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return; + if ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + const extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function initTexture( textureProperties, texture ) { + + let forceUpload = false; + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + } + + // create Source <-> WebGLTextures mapping if necessary + + const source = texture.source; + let webglTextures = _sources.get( source ); + + if ( webglTextures === undefined ) { + + webglTextures = {}; + _sources.set( source, webglTextures ); + + } + + // check if there is already a WebGLTexture object for the given texture parameters + + const textureCacheKey = getTextureCacheKey( texture ); + + if ( textureCacheKey !== textureProperties.__cacheKey ) { + + // if not, create a new instance of WebGLTexture + + if ( webglTextures[ textureCacheKey ] === undefined ) { + + // create new entry + + webglTextures[ textureCacheKey ] = { + texture: _gl.createTexture(), + usedTimes: 0 + }; + + info.memory.textures ++; + + // when a new instance of WebGLTexture was created, a texture upload is required + // even if the image contents are identical + + forceUpload = true; + + } + + webglTextures[ textureCacheKey ].usedTimes ++; + + // every time the texture cache key changes, it's necessary to check if an instance of + // WebGLTexture can be deleted in order to avoid a memory leak. + + const webglTexture = webglTextures[ textureProperties.__cacheKey ]; + + if ( webglTexture !== undefined ) { + + webglTextures[ textureProperties.__cacheKey ].usedTimes --; + + if ( webglTexture.usedTimes === 0 ) { + + deleteTexture( texture ); + + } + + } + + // store references to cache key and WebGLTexture object + + textureProperties.__cacheKey = textureCacheKey; + textureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture; + + } + + return forceUpload; + + } + + function uploadTexture( textureProperties, texture, slot ) { + + let textureType = _gl.TEXTURE_2D; + + if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY; + if ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D; + + const forceUpload = initTexture( textureProperties, texture ); + const source = texture.source; + + state.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + const sourceProperties = properties.get( source ); + + if ( source.version !== sourceProperties.__version || forceUpload === true ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + + const workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace ); + const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace ); + const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion ); + + let image = resizeImage( texture.image, false, capabilities.maxTextureSize ); + image = verifyColorSpace( texture, image ); + + const glFormat = utils.convert( texture.format, texture.colorSpace ); + + const glType = utils.convert( texture.type ); + let glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture ); + + setTextureParameters( textureType, texture ); + + let mipmap; + const mipmaps = texture.mipmaps; + + const useTexStorage = ( texture.isVideoTexture !== true ); + const allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true ); + const dataReady = source.dataReady; + const levels = getMipLevels( texture, image ); + + if ( texture.isDepthTexture ) { + + glInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type ); + + // + + if ( allocateMemory ) { + + if ( useTexStorage ) { + + state.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height ); + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } + + } + + } else if ( texture.isDataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 ) { + + if ( useTexStorage && allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height ); + + } + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + texture.generateMipmaps = false; + + } else { + + if ( useTexStorage ) { + + if ( allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height ); + + } + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } + + } else if ( texture.isCompressedTexture ) { + + if ( texture.isCompressedArrayTexture ) { + + if ( useTexStorage && allocateMemory ) { + + state.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth ); + + } + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat ) { + + if ( glFormat !== null ) { + + if ( useTexStorage ) { + + if ( dataReady ) { + + if ( texture.layerUpdates.size > 0 ) { + + const layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type ); + + for ( const layerIndex of texture.layerUpdates ) { + + const layerData = mipmap.data.subarray( + layerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT, + ( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT + ); + state.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData ); + + } + + texture.clearLayerUpdates(); + + } else { + + state.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data ); + + } + + } + + } else { + + state.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 ); + + } + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data ); + + } + + } else { + + state.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } else { + + if ( useTexStorage && allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height ); + + } + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat ) { + + if ( glFormat !== null ) { + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data ); + + } + + } else { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ); + + } + + } else { + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + } else if ( texture.isDataArrayTexture ) { + + if ( useTexStorage ) { + + if ( allocateMemory ) { + + state.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth ); + + } + + if ( dataReady ) { + + if ( texture.layerUpdates.size > 0 ) { + + const layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type ); + + for ( const layerIndex of texture.layerUpdates ) { + + const layerData = image.data.subarray( + layerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT, + ( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT + ); + state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData ); + + } + + texture.clearLayerUpdates(); + + } else { + + state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data ); + + } + + } + + } else { + + state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + + } + + } else if ( texture.isData3DTexture ) { + + if ( useTexStorage ) { + + if ( allocateMemory ) { + + state.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth ); + + } + + if ( dataReady ) { + + state.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data ); + + } + + } else { + + state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data ); + + } + + } else if ( texture.isFramebufferTexture ) { + + if ( allocateMemory ) { + + if ( useTexStorage ) { + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height ); + + } else { + + let width = image.width, height = image.height; + + for ( let i = 0; i < levels; i ++ ) { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null ); + + width >>= 1; + height >>= 1; + + } + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 ) { + + if ( useTexStorage && allocateMemory ) { + + const dimensions = getDimensions( mipmaps[ 0 ] ); + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height ); + + } + + for ( let i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap ); + + } + + } + + texture.generateMipmaps = false; + + } else { + + if ( useTexStorage ) { + + if ( allocateMemory ) { + + const dimensions = getDimensions( image ); + + state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height ); + + } + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image ); + + } + + } + + } + + if ( textureNeedsGenerateMipmaps( texture ) ) { + + generateMipmap( textureType ); + + } + + sourceProperties.__version = source.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + textureProperties.__version = texture.version; + + } + + function uploadCubeTexture( textureProperties, texture, slot ) { + + if ( texture.image.length !== 6 ) return; + + const forceUpload = initTexture( textureProperties, texture ); + const source = texture.source; + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot ); + + const sourceProperties = properties.get( source ); + + if ( source.version !== sourceProperties.__version || forceUpload === true ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + + const workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace ); + const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace ); + const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion ); + + const isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ); + const isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); + + const cubeImage = []; + + for ( let i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + cubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] ); + + } + + const image = cubeImage[ 0 ], + glFormat = utils.convert( texture.format, texture.colorSpace ), + glType = utils.convert( texture.type ), + glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace ); + + const useTexStorage = ( texture.isVideoTexture !== true ); + const allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true ); + const dataReady = source.dataReady; + let levels = getMipLevels( texture, image ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture ); + + let mipmaps; + + if ( isCompressed ) { + + if ( useTexStorage && allocateMemory ) { + + state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height ); + + } + + for ( let i = 0; i < 6; i ++ ) { + + mipmaps = cubeImage[ i ].mipmaps; + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat ) { + + if ( glFormat !== null ) { + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data ); + + } + + } else { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } + + } else { + + console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ); + + } + + } else { + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + } else { + + mipmaps = texture.mipmaps; + + if ( useTexStorage && allocateMemory ) { + + // TODO: Uniformly handle mipmap definitions + // Normal textures and compressed cube textures define base level + mips with their mipmap array + // Uncompressed cube textures use their mipmap array only for mips (no base level) + + if ( mipmaps.length > 0 ) levels ++; + + const dimensions = getDimensions( cubeImage[ 0 ] ); + + state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height ); + + } + + for ( let i = 0; i < 6; i ++ ) { + + if ( isDataTexture ) { + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + const mipmapImage = mipmap.image[ i ].image; + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data ); + + } + + } + + } else { + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] ); + + } + + for ( let j = 0; j < mipmaps.length; j ++ ) { + + const mipmap = mipmaps[ j ]; + + if ( useTexStorage ) { + + if ( dataReady ) { + + state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] ); + + } + + } + + } + + } + + } + + if ( textureNeedsGenerateMipmaps( texture ) ) { + + // We assume images for cube map have the same size. + generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + sourceProperties.__version = source.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + textureProperties.__version = texture.version; + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) { + + const glFormat = utils.convert( texture.format, texture.colorSpace ); + const glType = utils.convert( texture.type ); + const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace ); + const renderTargetProperties = properties.get( renderTarget ); + const textureProperties = properties.get( texture ); + + textureProperties.__renderTarget = renderTarget; + + if ( ! renderTargetProperties.__hasExternalTextures ) { + + const width = Math.max( 1, renderTarget.width >> level ); + const height = Math.max( 1, renderTarget.height >> level ); + + if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) { + + state.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null ); + + } else { + + state.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null ); + + } + + } + + state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) ); + + } else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753 + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level ); + + } + + state.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer ) { + + // retrieve the depth attachment types + const depthTexture = renderTarget.depthTexture; + const depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null; + const glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType ); + const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + + // set up the attachment + const samples = getRenderTargetSamples( renderTarget ); + const isUseMultisampledRTT = useMultisampledRTT( renderTarget ); + if ( isUseMultisampledRTT ) { + + multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else if ( isMultisample ) { + + _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height ); + + } + + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + const textures = renderTarget.textures; + + for ( let i = 0; i < textures.length; i ++ ) { + + const texture = textures[ i ]; + + const glFormat = utils.convert( texture.format, texture.colorSpace ); + const glType = utils.convert( texture.type ); + const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace ); + const samples = getRenderTargetSamples( renderTarget ); + + if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) { + + _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + } else { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height ); + + } + + } + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + const isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget ); + if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' ); + + state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { + + throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); + + } + + const textureProperties = properties.get( renderTarget.depthTexture ); + textureProperties.__renderTarget = renderTarget; + + // upload an empty depth texture with framebuffer size + if ( ! textureProperties.__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + const webglDepthTexture = textureProperties.__webglTexture; + const samples = getRenderTargetSamples( renderTarget ); + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples ); + + } else { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + if ( useMultisampledRTT( renderTarget ) ) { + + multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples ); + + } else { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } + + } else { + + throw new Error( 'Unknown depthTexture format' ); + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + const isCube = ( renderTarget.isWebGLCubeRenderTarget === true ); + + // if the bound depth texture has changed + if ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) { + + // fire the dispose event to get rid of stored state associated with the previously bound depth buffer + const depthTexture = renderTarget.depthTexture; + if ( renderTargetProperties.__depthDisposeCallback ) { + + renderTargetProperties.__depthDisposeCallback(); + + } + + // set up dispose listeners to track when the currently attached buffer is implicitly unbound + if ( depthTexture ) { + + const disposeEvent = () => { + + delete renderTargetProperties.__boundDepthTexture; + delete renderTargetProperties.__depthDisposeCallback; + depthTexture.removeEventListener( 'dispose', disposeEvent ); + + }; + + depthTexture.addEventListener( 'dispose', disposeEvent ); + renderTargetProperties.__depthDisposeCallback = disposeEvent; + + } + + renderTargetProperties.__boundDepthTexture = depthTexture; + + } + + if ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) { + + if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' ); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( let i = 0; i < 6; i ++ ) { + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + + if ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) { + + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false ); + + } else { + + // attach buffer if it's been created already + const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ]; + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer ); + + } + + } + + } else { + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + + if ( renderTargetProperties.__webglDepthbuffer === undefined ) { + + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false ); + + } else { + + // attach buffer if it's been created already + const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderbuffer = renderTargetProperties.__webglDepthbuffer; + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer ); + + } + + } + + } + + state.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // rebind framebuffer with external textures + function rebindTextures( renderTarget, colorTexture, depthTexture ) { + + const renderTargetProperties = properties.get( renderTarget ); + + if ( colorTexture !== undefined ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 ); + + } + + if ( depthTexture !== undefined ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + const texture = renderTarget.texture; + + const renderTargetProperties = properties.get( renderTarget ); + const textureProperties = properties.get( texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + const textures = renderTarget.textures; + + const isCube = ( renderTarget.isWebGLCubeRenderTarget === true ); + const isMultipleRenderTargets = ( textures.length > 1 ); + + if ( ! isMultipleRenderTargets ) { + + if ( textureProperties.__webglTexture === undefined ) { + + textureProperties.__webglTexture = _gl.createTexture(); + + } + + textureProperties.__version = texture.version; + info.memory.textures ++; + + } + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( let i = 0; i < 6; i ++ ) { + + if ( texture.mipmaps && texture.mipmaps.length > 0 ) { + + renderTargetProperties.__webglFramebuffer[ i ] = []; + + for ( let level = 0; level < texture.mipmaps.length; level ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } + + } else { + + if ( texture.mipmaps && texture.mipmaps.length > 0 ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( let level = 0; level < texture.mipmaps.length; level ++ ) { + + renderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + if ( isMultipleRenderTargets ) { + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const attachmentProperties = properties.get( textures[ i ] ); + + if ( attachmentProperties.__webglTexture === undefined ) { + + attachmentProperties.__webglTexture = _gl.createTexture(); + + info.memory.textures ++; + + } + + } + + } + + if ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) { + + renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer(); + renderTargetProperties.__webglColorRenderbuffer = []; + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + + for ( let i = 0; i < textures.length; i ++ ) { + + const texture = textures[ i ]; + renderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer(); + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + const glFormat = utils.convert( texture.format, texture.colorSpace ); + const glType = utils.convert( texture.type ); + const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true ); + const samples = getRenderTargetSamples( renderTarget ); + _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height ); + + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + if ( renderTarget.depthBuffer ) { + + renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true ); + + } + + state.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture ); + + for ( let i = 0; i < 6; i ++ ) { + + if ( texture.mipmaps && texture.mipmaps.length > 0 ) { + + for ( let level = 0; level < texture.mipmaps.length; level ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level ); + + } + + } else { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 ); + + } + + } + + if ( textureNeedsGenerateMipmaps( texture ) ) { + + generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + state.unbindTexture(); + + } else if ( isMultipleRenderTargets ) { + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const attachment = textures[ i ]; + const attachmentProperties = properties.get( attachment ); + + state.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, attachment ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0 ); + + if ( textureNeedsGenerateMipmaps( attachment ) ) { + + generateMipmap( _gl.TEXTURE_2D ); + + } + + } + + state.unbindTexture(); + + } else { + + let glTextureType = _gl.TEXTURE_2D; + + if ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) { + + glTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY; + + } + + state.bindTexture( glTextureType, textureProperties.__webglTexture ); + setTextureParameters( glTextureType, texture ); + + if ( texture.mipmaps && texture.mipmaps.length > 0 ) { + + for ( let level = 0; level < texture.mipmaps.length; level ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level ); + + } + + } else { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 ); + + } + + if ( textureNeedsGenerateMipmaps( texture ) ) { + + generateMipmap( glTextureType ); + + } + + state.unbindTexture(); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + const textures = renderTarget.textures; + + for ( let i = 0, il = textures.length; i < il; i ++ ) { + + const texture = textures[ i ]; + + if ( textureNeedsGenerateMipmaps( texture ) ) { + + const targetType = getTargetType( renderTarget ); + const webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( targetType, webglTexture ); + generateMipmap( targetType ); + state.unbindTexture(); + + } + + } + + } + + const invalidationArrayRead = []; + const invalidationArrayDraw = []; + + function updateMultisampleRenderTarget( renderTarget ) { + + if ( renderTarget.samples > 0 ) { + + if ( useMultisampledRTT( renderTarget ) === false ) { + + const textures = renderTarget.textures; + const width = renderTarget.width; + const height = renderTarget.height; + let mask = _gl.COLOR_BUFFER_BIT; + const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderTargetProperties = properties.get( renderTarget ); + const isMultipleRenderTargets = ( textures.length > 1 ); + + // If MRT we need to remove FBO attachments + if ( isMultipleRenderTargets ) { + + for ( let i = 0; i < textures.length; i ++ ) { + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null ); + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 ); + + } + + } + + state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + + for ( let i = 0; i < textures.length; i ++ ) { + + if ( renderTarget.resolveDepthBuffer ) { + + if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT; + + // resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799) + + if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT; + + } + + if ( isMultipleRenderTargets ) { + + _gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + const webglTexture = properties.get( textures[ i ] ).__webglTexture; + _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 ); + + } + + _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST ); + + if ( supportsInvalidateFramebuffer === true ) { + + invalidationArrayRead.length = 0; + invalidationArrayDraw.length = 0; + + invalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i ); + + if ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) { + + invalidationArrayRead.push( depthStyle ); + invalidationArrayDraw.push( depthStyle ); + + _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw ); + + } + + _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead ); + + } + + } + + state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null ); + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null ); + + // If MRT since pre-blit we removed the FBO we need to reconstruct the attachments + if ( isMultipleRenderTargets ) { + + for ( let i = 0; i < textures.length; i ++ ) { + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] ); + + const webglTexture = properties.get( textures[ i ] ).__webglTexture; + + state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 ); + + } + + } + + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer ); + + } else { + + if ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) { + + const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + + _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] ); + + } + + } + + } + + } + + function getRenderTargetSamples( renderTarget ) { + + return Math.min( capabilities.maxSamples, renderTarget.samples ); + + } + + function useMultisampledRTT( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + + return renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false; + + } + + function updateVideoTexture( texture ) { + + const frame = info.render.frame; + + // Check the last frame we updated the VideoTexture + + if ( _videoTextures.get( texture ) !== frame ) { + + _videoTextures.set( texture, frame ); + texture.update(); + + } + + } + + function verifyColorSpace( texture, image ) { + + const colorSpace = texture.colorSpace; + const format = texture.format; + const type = texture.type; + + if ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image; + + if ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) { + + // sRGB + + if ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) { + + // in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format + + if ( format !== RGBAFormat || type !== UnsignedByteType ) { + + console.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' ); + + } + + } else { + + console.error( 'THREE.WebGLTextures: Unsupported texture color space:', colorSpace ); + + } + + } + + return image; + + } + + function getDimensions( image ) { + + if ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) { + + // if intrinsic data are not available, fallback to width/height + + _imageDimensions.width = image.naturalWidth || image.width; + _imageDimensions.height = image.naturalHeight || image.height; + + } else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) { + + _imageDimensions.width = image.displayWidth; + _imageDimensions.height = image.displayHeight; + + } else { + + _imageDimensions.width = image.width; + _imageDimensions.height = image.height; + + } + + return _imageDimensions; + + } + + // + + this.allocateTextureUnit = allocateTextureUnit; + this.resetTextureUnits = resetTextureUnits; + + this.setTexture2D = setTexture2D; + this.setTexture2DArray = setTexture2DArray; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.rebindTextures = rebindTextures; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + this.updateMultisampleRenderTarget = updateMultisampleRenderTarget; + this.setupDepthRenderbuffer = setupDepthRenderbuffer; + this.setupFrameBufferTexture = setupFrameBufferTexture; + this.useMultisampledRTT = useMultisampledRTT; + +} + +function WebGLUtils( gl, extensions ) { + + function convert( p, colorSpace = NoColorSpace ) { + + let extension; + + const transfer = ColorManagement.getTransfer( colorSpace ); + + if ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV; + + if ( p === ByteType ) return gl.BYTE; + if ( p === ShortType ) return gl.SHORT; + if ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT; + if ( p === IntType ) return gl.INT; + if ( p === UnsignedIntType ) return gl.UNSIGNED_INT; + if ( p === FloatType ) return gl.FLOAT; + if ( p === HalfFloatType ) return gl.HALF_FLOAT; + + if ( p === AlphaFormat ) return gl.ALPHA; + if ( p === RGBFormat ) return gl.RGB; + if ( p === RGBAFormat ) return gl.RGBA; + if ( p === LuminanceFormat ) return gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL; + + // WebGL2 formats. + + if ( p === RedFormat ) return gl.RED; + if ( p === RedIntegerFormat ) return gl.RED_INTEGER; + if ( p === RGFormat ) return gl.RG; + if ( p === RGIntegerFormat ) return gl.RG_INTEGER; + if ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER; + + // S3TC + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + if ( transfer === SRGBTransfer ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; + + } else { + + return null; + + } + + } else { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } else { + + return null; + + } + + } + + } + + // PVRTC + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } else { + + return null; + + } + + } + + // ETC + + if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc' ); + + if ( extension !== null ) { + + if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2; + if ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC; + + } else { + + return null; + + } + + } + + // ASTC + + if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_astc' ); + + if ( extension !== null ) { + + if ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR; + if ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR; + if ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR; + if ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR; + if ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR; + if ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR; + if ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR; + if ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR; + if ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR; + if ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR; + if ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR; + if ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR; + if ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR; + if ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR; + + } else { + + return null; + + } + + } + + // BPTC + + if ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) { + + extension = extensions.get( 'EXT_texture_compression_bptc' ); + + if ( extension !== null ) { + + if ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT; + if ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; + if ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; + + } else { + + return null; + + } + + } + + // RGTC + + if ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) { + + extension = extensions.get( 'EXT_texture_compression_rgtc' ); + + if ( extension !== null ) { + + if ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT; + if ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT; + if ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT; + if ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; + + } else { + + return null; + + } + + } + + // + + if ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8; + + // if "p" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats) + + return ( gl[ p ] !== undefined ) ? gl[ p ] : null; + + } + + return { convert: convert }; + +} + +const _occlusion_vertex = ` +void main() { + + gl_Position = vec4( position, 1.0 ); + +}`; + +const _occlusion_fragment = ` +uniform sampler2DArray depthColor; +uniform float depthWidth; +uniform float depthHeight; + +void main() { + + vec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight ); + + if ( coord.x >= 1.0 ) { + + gl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r; + + } else { + + gl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r; + + } + +}`; + +class WebXRDepthSensing { + + constructor() { + + this.texture = null; + this.mesh = null; + + this.depthNear = 0; + this.depthFar = 0; + + } + + init( renderer, depthData, renderState ) { + + if ( this.texture === null ) { + + const texture = new Texture$1(); + + const texProps = renderer.properties.get( texture ); + texProps.__webglTexture = depthData.texture; + + if ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) { + + this.depthNear = depthData.depthNear; + this.depthFar = depthData.depthFar; + + } + + this.texture = texture; + + } + + } + + getMesh( cameraXR ) { + + if ( this.texture !== null ) { + + if ( this.mesh === null ) { + + const viewport = cameraXR.cameras[ 0 ].viewport; + const material = new ShaderMaterial( { + vertexShader: _occlusion_vertex, + fragmentShader: _occlusion_fragment, + uniforms: { + depthColor: { value: this.texture }, + depthWidth: { value: viewport.z }, + depthHeight: { value: viewport.w } + } + } ); + + this.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material ); + + } + + } + + return this.mesh; + + } + + reset() { + + this.texture = null; + this.mesh = null; + + } + + getDepthTexture() { + + return this.texture; + + } + +} + +class WebXRManager extends EventDispatcher { + + constructor( renderer, gl ) { + + super(); + + const scope = this; + + let session = null; + + let framebufferScaleFactor = 1.0; + + let referenceSpace = null; + let referenceSpaceType = 'local-floor'; + // Set default foveation to maximum. + let foveation = 1.0; + let customReferenceSpace = null; + + let pose = null; + let glBinding = null; + let glProjLayer = null; + let glBaseLayer = null; + let xrFrame = null; + + const depthSensing = new WebXRDepthSensing(); + const attributes = gl.getContextAttributes(); + + let initialRenderTarget = null; + let newRenderTarget = null; + + const controllers = []; + const controllerInputSources = []; + + const currentSize = new Vector2(); + let currentPixelRatio = null; + + // + + const cameraL = new PerspectiveCamera(); + cameraL.viewport = new Vector4(); + + const cameraR = new PerspectiveCamera(); + cameraR.viewport = new Vector4(); + + const cameras = [ cameraL, cameraR ]; + + const cameraXR = new ArrayCamera(); + + let _currentDepthNear = null; + let _currentDepthFar = null; + + // + + this.cameraAutoUpdate = true; + this.enabled = false; + + this.isPresenting = false; + + this.getController = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getTargetRaySpace(); + + }; + + this.getControllerGrip = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getGripSpace(); + + }; + + this.getHand = function ( index ) { + + let controller = controllers[ index ]; + + if ( controller === undefined ) { + + controller = new WebXRController(); + controllers[ index ] = controller; + + } + + return controller.getHandSpace(); + + }; + + // + + function onSessionEvent( event ) { + + const controllerIndex = controllerInputSources.indexOf( event.inputSource ); + + if ( controllerIndex === -1 ) { + + return; + + } + + const controller = controllers[ controllerIndex ]; + + if ( controller !== undefined ) { + + controller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace ); + controller.dispatchEvent( { type: event.type, data: event.inputSource } ); + + } + + } + + function onSessionEnd() { + + session.removeEventListener( 'select', onSessionEvent ); + session.removeEventListener( 'selectstart', onSessionEvent ); + session.removeEventListener( 'selectend', onSessionEvent ); + session.removeEventListener( 'squeeze', onSessionEvent ); + session.removeEventListener( 'squeezestart', onSessionEvent ); + session.removeEventListener( 'squeezeend', onSessionEvent ); + session.removeEventListener( 'end', onSessionEnd ); + session.removeEventListener( 'inputsourceschange', onInputSourcesChange ); + + for ( let i = 0; i < controllers.length; i ++ ) { + + const inputSource = controllerInputSources[ i ]; + + if ( inputSource === null ) continue; + + controllerInputSources[ i ] = null; + + controllers[ i ].disconnect( inputSource ); + + } + + _currentDepthNear = null; + _currentDepthFar = null; + + depthSensing.reset(); + + // restore framebuffer/rendering state + + renderer.setRenderTarget( initialRenderTarget ); + + glBaseLayer = null; + glProjLayer = null; + glBinding = null; + session = null; + newRenderTarget = null; + + // + + animation.stop(); + + scope.isPresenting = false; + + renderer.setPixelRatio( currentPixelRatio ); + renderer.setSize( currentSize.width, currentSize.height, false ); + + scope.dispatchEvent( { type: 'sessionend' } ); + + } + + this.setFramebufferScaleFactor = function ( value ) { + + framebufferScaleFactor = value; + + if ( scope.isPresenting === true ) { + + console.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' ); + + } + + }; + + this.setReferenceSpaceType = function ( value ) { + + referenceSpaceType = value; + + if ( scope.isPresenting === true ) { + + console.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' ); + + } + + }; + + this.getReferenceSpace = function () { + + return customReferenceSpace || referenceSpace; + + }; + + this.setReferenceSpace = function ( space ) { + + customReferenceSpace = space; + + }; + + this.getBaseLayer = function () { + + return glProjLayer !== null ? glProjLayer : glBaseLayer; + + }; + + this.getBinding = function () { + + return glBinding; + + }; + + this.getFrame = function () { + + return xrFrame; + + }; + + this.getSession = function () { + + return session; + + }; + + this.setSession = async function ( value ) { + + session = value; + + if ( session !== null ) { + + initialRenderTarget = renderer.getRenderTarget(); + + session.addEventListener( 'select', onSessionEvent ); + session.addEventListener( 'selectstart', onSessionEvent ); + session.addEventListener( 'selectend', onSessionEvent ); + session.addEventListener( 'squeeze', onSessionEvent ); + session.addEventListener( 'squeezestart', onSessionEvent ); + session.addEventListener( 'squeezeend', onSessionEvent ); + session.addEventListener( 'end', onSessionEnd ); + session.addEventListener( 'inputsourceschange', onInputSourcesChange ); + + if ( attributes.xrCompatible !== true ) { + + await gl.makeXRCompatible(); + + } + + currentPixelRatio = renderer.getPixelRatio(); + renderer.getSize( currentSize ); + + // Check that the browser implements the necessary APIs to use an + // XRProjectionLayer rather than an XRWebGLLayer + const useLayers = typeof XRWebGLBinding !== 'undefined' && 'createProjectionLayer' in XRWebGLBinding.prototype; + + if ( ! useLayers ) { + + const layerInit = { + antialias: attributes.antialias, + alpha: true, + depth: attributes.depth, + stencil: attributes.stencil, + framebufferScaleFactor: framebufferScaleFactor + }; + + glBaseLayer = new XRWebGLLayer( session, gl, layerInit ); + + session.updateRenderState( { baseLayer: glBaseLayer } ); + + renderer.setPixelRatio( 1 ); + renderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false ); + + newRenderTarget = new WebGLRenderTarget( + glBaseLayer.framebufferWidth, + glBaseLayer.framebufferHeight, + { + format: RGBAFormat, + type: UnsignedByteType, + colorSpace: renderer.outputColorSpace, + stencilBuffer: attributes.stencil, + resolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ), + resolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false ) + + } + ); + + } else { + + let depthFormat = null; + let depthType = null; + let glDepthFormat = null; + + if ( attributes.depth ) { + + glDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24; + depthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat; + depthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType; + + } + + const projectionlayerInit = { + colorFormat: gl.RGBA8, + depthFormat: glDepthFormat, + scaleFactor: framebufferScaleFactor + }; + + glBinding = new XRWebGLBinding( session, gl ); + + glProjLayer = glBinding.createProjectionLayer( projectionlayerInit ); + + session.updateRenderState( { layers: [ glProjLayer ] } ); + + renderer.setPixelRatio( 1 ); + renderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false ); + + newRenderTarget = new WebGLRenderTarget( + glProjLayer.textureWidth, + glProjLayer.textureHeight, + { + format: RGBAFormat, + type: UnsignedByteType, + depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ), + stencilBuffer: attributes.stencil, + colorSpace: renderer.outputColorSpace, + samples: attributes.antialias ? 4 : 0, + resolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ), + resolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false ) + } ); + + } + + newRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278 + + this.setFoveation( foveation ); + + customReferenceSpace = null; + referenceSpace = await session.requestReferenceSpace( referenceSpaceType ); + + animation.setContext( session ); + animation.start(); + + scope.isPresenting = true; + + scope.dispatchEvent( { type: 'sessionstart' } ); + + } + + }; + + this.getEnvironmentBlendMode = function () { + + if ( session !== null ) { + + return session.environmentBlendMode; + + } + + }; + + this.getDepthTexture = function () { + + return depthSensing.getDepthTexture(); + + }; + + function onInputSourcesChange( event ) { + + // Notify disconnected + + for ( let i = 0; i < event.removed.length; i ++ ) { + + const inputSource = event.removed[ i ]; + const index = controllerInputSources.indexOf( inputSource ); + + if ( index >= 0 ) { + + controllerInputSources[ index ] = null; + controllers[ index ].disconnect( inputSource ); + + } + + } + + // Notify connected + + for ( let i = 0; i < event.added.length; i ++ ) { + + const inputSource = event.added[ i ]; + + let controllerIndex = controllerInputSources.indexOf( inputSource ); + + if ( controllerIndex === -1 ) { + + // Assign input source a controller that currently has no input source + + for ( let i = 0; i < controllers.length; i ++ ) { + + if ( i >= controllerInputSources.length ) { + + controllerInputSources.push( inputSource ); + controllerIndex = i; + break; + + } else if ( controllerInputSources[ i ] === null ) { + + controllerInputSources[ i ] = inputSource; + controllerIndex = i; + break; + + } + + } + + // If all controllers do currently receive input we ignore new ones + + if ( controllerIndex === -1 ) break; + + } + + const controller = controllers[ controllerIndex ]; + + if ( controller ) { + + controller.connect( inputSource ); + + } + + } + + } + + // + + const cameraLPos = new Vector3(); + const cameraRPos = new Vector3(); + + /** + * Assumes 2 cameras that are parallel and share an X-axis, and that + * the cameras' projection and world matrices have already been set. + * And that near and far planes are identical for both cameras. + * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765 + * + * @param {ArrayCamera} camera - The camera to update. + * @param {PerspectiveCamera} cameraL - The left camera. + * @param {PerspectiveCamera} cameraR - The right camera. + */ + function setProjectionFromUnion( camera, cameraL, cameraR ) { + + cameraLPos.setFromMatrixPosition( cameraL.matrixWorld ); + cameraRPos.setFromMatrixPosition( cameraR.matrixWorld ); + + const ipd = cameraLPos.distanceTo( cameraRPos ); + + const projL = cameraL.projectionMatrix.elements; + const projR = cameraR.projectionMatrix.elements; + + // VR systems will have identical far and near planes, and + // most likely identical top and bottom frustum extents. + // Use the left camera for these values. + const near = projL[ 14 ] / ( projL[ 10 ] - 1 ); + const far = projL[ 14 ] / ( projL[ 10 ] + 1 ); + const topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ]; + const bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ]; + + const leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ]; + const rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ]; + const left = near * leftFov; + const right = near * rightFov; + + // Calculate the new camera's position offset from the + // left camera. xOffset should be roughly half `ipd`. + const zOffset = ipd / ( - leftFov + rightFov ); + const xOffset = zOffset * - leftFov; + + // TODO: Better way to apply this offset? + cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale ); + camera.translateX( xOffset ); + camera.translateZ( zOffset ); + camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale ); + camera.matrixWorldInverse.copy( camera.matrixWorld ).invert(); + + // Check if the projection uses an infinite far plane. + if ( projL[ 10 ] === -1 ) { + + // Use the projection matrix from the left eye. + // The camera offset is sufficient to include the view volumes + // of both eyes (assuming symmetric projections). + camera.projectionMatrix.copy( cameraL.projectionMatrix ); + camera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse ); + + } else { + + // Find the union of the frustum values of the cameras and scale + // the values so that the near plane's position does not change in world space, + // although must now be relative to the new union camera. + const near2 = near + zOffset; + const far2 = far + zOffset; + const left2 = left - xOffset; + const right2 = right + ( ipd - xOffset ); + const top2 = topFov * far / far2 * near2; + const bottom2 = bottomFov * far / far2 * near2; + + camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 ); + camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert(); + + } + + } + + function updateCamera( camera, parent ) { + + if ( parent === null ) { + + camera.matrixWorld.copy( camera.matrix ); + + } else { + + camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix ); + + } + + camera.matrixWorldInverse.copy( camera.matrixWorld ).invert(); + + } + + this.updateCamera = function ( camera ) { + + if ( session === null ) return; + + let depthNear = camera.near; + let depthFar = camera.far; + + if ( depthSensing.texture !== null ) { + + if ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear; + if ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar; + + } + + cameraXR.near = cameraR.near = cameraL.near = depthNear; + cameraXR.far = cameraR.far = cameraL.far = depthFar; + + if ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) { + + // Note that the new renderState won't apply until the next frame. See #18320 + + session.updateRenderState( { + depthNear: cameraXR.near, + depthFar: cameraXR.far + } ); + + _currentDepthNear = cameraXR.near; + _currentDepthFar = cameraXR.far; + + } + + cameraL.layers.mask = camera.layers.mask | 0b010; + cameraR.layers.mask = camera.layers.mask | 0b100; + cameraXR.layers.mask = cameraL.layers.mask | cameraR.layers.mask; + + const parent = camera.parent; + const cameras = cameraXR.cameras; + + updateCamera( cameraXR, parent ); + + for ( let i = 0; i < cameras.length; i ++ ) { + + updateCamera( cameras[ i ], parent ); + + } + + // update projection matrix for proper view frustum culling + + if ( cameras.length === 2 ) { + + setProjectionFromUnion( cameraXR, cameraL, cameraR ); + + } else { + + // assume single camera setup (AR) + + cameraXR.projectionMatrix.copy( cameraL.projectionMatrix ); + + } + + // update user camera and its children + + updateUserCamera( camera, cameraXR, parent ); + + }; + + function updateUserCamera( camera, cameraXR, parent ) { + + if ( parent === null ) { + + camera.matrix.copy( cameraXR.matrixWorld ); + + } else { + + camera.matrix.copy( parent.matrixWorld ); + camera.matrix.invert(); + camera.matrix.multiply( cameraXR.matrixWorld ); + + } + + camera.matrix.decompose( camera.position, camera.quaternion, camera.scale ); + camera.updateMatrixWorld( true ); + + camera.projectionMatrix.copy( cameraXR.projectionMatrix ); + camera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse ); + + if ( camera.isPerspectiveCamera ) { + + camera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] ); + camera.zoom = 1; + + } + + } + + this.getCamera = function () { + + return cameraXR; + + }; + + this.getFoveation = function () { + + if ( glProjLayer === null && glBaseLayer === null ) { + + return undefined; + + } + + return foveation; + + }; + + this.setFoveation = function ( value ) { + + // 0 = no foveation = full resolution + // 1 = maximum foveation = the edges render at lower resolution + + foveation = value; + + if ( glProjLayer !== null ) { + + glProjLayer.fixedFoveation = value; + + } + + if ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) { + + glBaseLayer.fixedFoveation = value; + + } + + }; + + this.hasDepthSensing = function () { + + return depthSensing.texture !== null; + + }; + + this.getDepthSensingMesh = function () { + + return depthSensing.getMesh( cameraXR ); + + }; + + // Animation Loop + + let onAnimationFrameCallback = null; + + function onAnimationFrame( time, frame ) { + + pose = frame.getViewerPose( customReferenceSpace || referenceSpace ); + xrFrame = frame; + + if ( pose !== null ) { + + const views = pose.views; + + if ( glBaseLayer !== null ) { + + renderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer ); + renderer.setRenderTarget( newRenderTarget ); + + } + + let cameraXRNeedsUpdate = false; + + // check if it's necessary to rebuild cameraXR's camera list + + if ( views.length !== cameraXR.cameras.length ) { + + cameraXR.cameras.length = 0; + cameraXRNeedsUpdate = true; + + } + + for ( let i = 0; i < views.length; i ++ ) { + + const view = views[ i ]; + + let viewport = null; + + if ( glBaseLayer !== null ) { + + viewport = glBaseLayer.getViewport( view ); + + } else { + + const glSubImage = glBinding.getViewSubImage( glProjLayer, view ); + viewport = glSubImage.viewport; + + // For side-by-side projection, we only produce a single texture for both eyes. + if ( i === 0 ) { + + renderer.setRenderTargetTextures( + newRenderTarget, + glSubImage.colorTexture, + glProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture ); + + renderer.setRenderTarget( newRenderTarget ); + + } + + } + + let camera = cameras[ i ]; + + if ( camera === undefined ) { + + camera = new PerspectiveCamera(); + camera.layers.enable( i ); + camera.viewport = new Vector4(); + cameras[ i ] = camera; + + } + + camera.matrix.fromArray( view.transform.matrix ); + camera.matrix.decompose( camera.position, camera.quaternion, camera.scale ); + camera.projectionMatrix.fromArray( view.projectionMatrix ); + camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert(); + camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height ); + + if ( i === 0 ) { + + cameraXR.matrix.copy( camera.matrix ); + cameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale ); + + } + + if ( cameraXRNeedsUpdate === true ) { + + cameraXR.cameras.push( camera ); + + } + + } + + // + + const enabledFeatures = session.enabledFeatures; + const gpuDepthSensingEnabled = enabledFeatures && + enabledFeatures.includes( 'depth-sensing' ) && + session.depthUsage == 'gpu-optimized'; + + if ( gpuDepthSensingEnabled && glBinding ) { + + const depthData = glBinding.getDepthInformation( views[ 0 ] ); + + if ( depthData && depthData.isValid && depthData.texture ) { + + depthSensing.init( renderer, depthData, session.renderState ); + + } + + } + + } + + // + + for ( let i = 0; i < controllers.length; i ++ ) { + + const inputSource = controllerInputSources[ i ]; + const controller = controllers[ i ]; + + if ( inputSource !== null && controller !== undefined ) { + + controller.update( inputSource, frame, customReferenceSpace || referenceSpace ); + + } + + } + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame ); + + if ( frame.detectedPlanes ) { + + scope.dispatchEvent( { type: 'planesdetected', data: frame } ); + + } + + xrFrame = null; + + } + + const animation = new WebGLAnimation(); + + animation.setAnimationLoop( onAnimationFrame ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + + }; + + this.dispose = function () {}; + + } + +} + +const _e1 = /*@__PURE__*/ new Euler(); +const _m1 = /*@__PURE__*/ new Matrix4(); + +function WebGLMaterials( renderer, properties ) { + + function refreshTransformUniform( map, uniform ) { + + if ( map.matrixAutoUpdate === true ) { + + map.updateMatrix(); + + } + + uniform.value.copy( map.matrix ); + + } + + function refreshFogUniforms( uniforms, fog ) { + + fog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) ); + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) { + + if ( material.isMeshBasicMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isMeshToonMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsToon( uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsPhong( uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsStandard( uniforms, material ); + + if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ); + + } + + } else if ( material.isMeshMatcapMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsMatcap( uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isMeshDistanceMaterial ) { + + refreshUniformsCommon( uniforms, material ); + refreshUniformsDistance( uniforms, material ); + + } else if ( material.isMeshNormalMaterial ) { + + refreshUniformsCommon( uniforms, material ); + + } else if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( uniforms, material ); + + if ( material.isLineDashedMaterial ) { + + refreshUniformsDash( uniforms, material ); + + } + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( uniforms, material, pixelRatio, height ); + + } else if ( material.isSpriteMaterial ) { + + refreshUniformsSprites( uniforms, material ); + + } else if ( material.isShadowMaterial ) { + + uniforms.color.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + + } else if ( material.isShaderMaterial ) { + + material.uniformsNeedUpdate = false; // #15581 + + } + + } + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + if ( material.color ) { + + uniforms.diffuse.value.copy( material.color ); + + } + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + if ( material.map ) { + + uniforms.map.value = material.map; + + refreshTransformUniform( material.map, uniforms.mapTransform ); + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + refreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform ); + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + + refreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform ); + + uniforms.bumpScale.value = material.bumpScale; + + if ( material.side === BackSide ) { + + uniforms.bumpScale.value *= -1; + + } + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + + refreshTransformUniform( material.normalMap, uniforms.normalMapTransform ); + + uniforms.normalScale.value.copy( material.normalScale ); + + if ( material.side === BackSide ) { + + uniforms.normalScale.value.negate(); + + } + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + + refreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform ); + + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + refreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform ); + + } + + if ( material.specularMap ) { + + uniforms.specularMap.value = material.specularMap; + + refreshTransformUniform( material.specularMap, uniforms.specularMapTransform ); + + } + + if ( material.alphaTest > 0 ) { + + uniforms.alphaTest.value = material.alphaTest; + + } + + const materialProperties = properties.get( material ); + + const envMap = materialProperties.envMap; + const envMapRotation = materialProperties.envMapRotation; + + if ( envMap ) { + + uniforms.envMap.value = envMap; + + _e1.copy( envMapRotation ); + + // accommodate left-handed frame + _e1.x *= -1; _e1.y *= -1; _e1.z *= -1; + + if ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) { + + // environment maps which are not cube render targets or PMREMs follow a different convention + _e1.y *= -1; + _e1.z *= -1; + + } + + uniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) ); + + uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.ior.value = material.ior; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + refreshTransformUniform( material.lightMap, uniforms.lightMapTransform ); + + } + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + refreshTransformUniform( material.aoMap, uniforms.aoMapTransform ); + + } + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + + if ( material.map ) { + + uniforms.map.value = material.map; + + refreshTransformUniform( material.map, uniforms.mapTransform ); + + } + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material, pixelRatio, height ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * pixelRatio; + uniforms.scale.value = height * 0.5; + + if ( material.map ) { + + uniforms.map.value = material.map; + + refreshTransformUniform( material.map, uniforms.uvTransform ); + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + refreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform ); + + } + + if ( material.alphaTest > 0 ) { + + uniforms.alphaTest.value = material.alphaTest; + + } + + } + + function refreshUniformsSprites( uniforms, material ) { + + uniforms.diffuse.value.copy( material.color ); + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + + if ( material.map ) { + + uniforms.map.value = material.map; + + refreshTransformUniform( material.map, uniforms.mapTransform ); + + } + + if ( material.alphaMap ) { + + uniforms.alphaMap.value = material.alphaMap; + + refreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform ); + + } + + if ( material.alphaTest > 0 ) { + + uniforms.alphaTest.value = material.alphaTest; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value.copy( material.specular ); + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + } + + function refreshUniformsToon( uniforms, material ) { + + if ( material.gradientMap ) { + + uniforms.gradientMap.value = material.gradientMap; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.metalness.value = material.metalness; + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + refreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform ); + + } + + uniforms.roughness.value = material.roughness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + refreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform ); + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) { + + uniforms.ior.value = material.ior; // also part of uniforms common + + if ( material.sheen > 0 ) { + + uniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen ); + + uniforms.sheenRoughness.value = material.sheenRoughness; + + if ( material.sheenColorMap ) { + + uniforms.sheenColorMap.value = material.sheenColorMap; + + refreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform ); + + } + + if ( material.sheenRoughnessMap ) { + + uniforms.sheenRoughnessMap.value = material.sheenRoughnessMap; + + refreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform ); + + } + + } + + if ( material.clearcoat > 0 ) { + + uniforms.clearcoat.value = material.clearcoat; + uniforms.clearcoatRoughness.value = material.clearcoatRoughness; + + if ( material.clearcoatMap ) { + + uniforms.clearcoatMap.value = material.clearcoatMap; + + refreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform ); + + } + + if ( material.clearcoatRoughnessMap ) { + + uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap; + + refreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform ); + + } + + if ( material.clearcoatNormalMap ) { + + uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap; + + refreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform ); + + uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale ); + + if ( material.side === BackSide ) { + + uniforms.clearcoatNormalScale.value.negate(); + + } + + } + + } + + if ( material.dispersion > 0 ) { + + uniforms.dispersion.value = material.dispersion; + + } + + if ( material.iridescence > 0 ) { + + uniforms.iridescence.value = material.iridescence; + uniforms.iridescenceIOR.value = material.iridescenceIOR; + uniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ]; + uniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ]; + + if ( material.iridescenceMap ) { + + uniforms.iridescenceMap.value = material.iridescenceMap; + + refreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform ); + + } + + if ( material.iridescenceThicknessMap ) { + + uniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap; + + refreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform ); + + } + + } + + if ( material.transmission > 0 ) { + + uniforms.transmission.value = material.transmission; + uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture; + uniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height ); + + if ( material.transmissionMap ) { + + uniforms.transmissionMap.value = material.transmissionMap; + + refreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform ); + + } + + uniforms.thickness.value = material.thickness; + + if ( material.thicknessMap ) { + + uniforms.thicknessMap.value = material.thicknessMap; + + refreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform ); + + } + + uniforms.attenuationDistance.value = material.attenuationDistance; + uniforms.attenuationColor.value.copy( material.attenuationColor ); + + } + + if ( material.anisotropy > 0 ) { + + uniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) ); + + if ( material.anisotropyMap ) { + + uniforms.anisotropyMap.value = material.anisotropyMap; + + refreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform ); + + } + + } + + uniforms.specularIntensity.value = material.specularIntensity; + uniforms.specularColor.value.copy( material.specularColor ); + + if ( material.specularColorMap ) { + + uniforms.specularColorMap.value = material.specularColorMap; + + refreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform ); + + } + + if ( material.specularIntensityMap ) { + + uniforms.specularIntensityMap.value = material.specularIntensityMap; + + refreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform ); + + } + + } + + function refreshUniformsMatcap( uniforms, material ) { + + if ( material.matcap ) { + + uniforms.matcap.value = material.matcap; + + } + + } + + function refreshUniformsDistance( uniforms, material ) { + + const light = properties.get( material ).light; + + uniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld ); + uniforms.nearDistance.value = light.shadow.camera.near; + uniforms.farDistance.value = light.shadow.camera.far; + + } + + return { + refreshFogUniforms: refreshFogUniforms, + refreshMaterialUniforms: refreshMaterialUniforms + }; + +} + +function WebGLUniformsGroups( gl, info, capabilities, state ) { + + let buffers = {}; + let updateList = {}; + let allocatedBindingPoints = []; + + const maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program + + function bind( uniformsGroup, program ) { + + const webglProgram = program.program; + state.uniformBlockBinding( uniformsGroup, webglProgram ); + + } + + function update( uniformsGroup, program ) { + + let buffer = buffers[ uniformsGroup.id ]; + + if ( buffer === undefined ) { + + prepareUniformsGroup( uniformsGroup ); + + buffer = createBuffer( uniformsGroup ); + buffers[ uniformsGroup.id ] = buffer; + + uniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose ); + + } + + // ensure to update the binding points/block indices mapping for this program + + const webglProgram = program.program; + state.updateUBOMapping( uniformsGroup, webglProgram ); + + // update UBO once per frame + + const frame = info.render.frame; + + if ( updateList[ uniformsGroup.id ] !== frame ) { + + updateBufferData( uniformsGroup ); + + updateList[ uniformsGroup.id ] = frame; + + } + + } + + function createBuffer( uniformsGroup ) { + + // the setup of an UBO is independent of a particular shader program but global + + const bindingPointIndex = allocateBindingPointIndex(); + uniformsGroup.__bindingPointIndex = bindingPointIndex; + + const buffer = gl.createBuffer(); + const size = uniformsGroup.__size; + const usage = uniformsGroup.usage; + + gl.bindBuffer( gl.UNIFORM_BUFFER, buffer ); + gl.bufferData( gl.UNIFORM_BUFFER, size, usage ); + gl.bindBuffer( gl.UNIFORM_BUFFER, null ); + gl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer ); + + return buffer; + + } + + function allocateBindingPointIndex() { + + for ( let i = 0; i < maxBindingPoints; i ++ ) { + + if ( allocatedBindingPoints.indexOf( i ) === -1 ) { + + allocatedBindingPoints.push( i ); + return i; + + } + + } + + console.error( 'THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' ); + + return 0; + + } + + function updateBufferData( uniformsGroup ) { + + const buffer = buffers[ uniformsGroup.id ]; + const uniforms = uniformsGroup.uniforms; + const cache = uniformsGroup.__cache; + + gl.bindBuffer( gl.UNIFORM_BUFFER, buffer ); + + for ( let i = 0, il = uniforms.length; i < il; i ++ ) { + + const uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ]; + + for ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) { + + const uniform = uniformArray[ j ]; + + if ( hasUniformChanged( uniform, i, j, cache ) === true ) { + + const offset = uniform.__offset; + + const values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ]; + + let arrayOffset = 0; + + for ( let k = 0; k < values.length; k ++ ) { + + const value = values[ k ]; + + const info = getUniformSize( value ); + + // TODO add integer and struct support + if ( typeof value === 'number' || typeof value === 'boolean' ) { + + uniform.__data[ 0 ] = value; + gl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data ); + + } else if ( value.isMatrix3 ) { + + // manually converting 3x3 to 3x4 + + uniform.__data[ 0 ] = value.elements[ 0 ]; + uniform.__data[ 1 ] = value.elements[ 1 ]; + uniform.__data[ 2 ] = value.elements[ 2 ]; + uniform.__data[ 3 ] = 0; + uniform.__data[ 4 ] = value.elements[ 3 ]; + uniform.__data[ 5 ] = value.elements[ 4 ]; + uniform.__data[ 6 ] = value.elements[ 5 ]; + uniform.__data[ 7 ] = 0; + uniform.__data[ 8 ] = value.elements[ 6 ]; + uniform.__data[ 9 ] = value.elements[ 7 ]; + uniform.__data[ 10 ] = value.elements[ 8 ]; + uniform.__data[ 11 ] = 0; + + } else { + + value.toArray( uniform.__data, arrayOffset ); + + arrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT; + + } + + } + + gl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data ); + + } + + } + + } + + gl.bindBuffer( gl.UNIFORM_BUFFER, null ); + + } + + function hasUniformChanged( uniform, index, indexArray, cache ) { + + const value = uniform.value; + const indexString = index + '_' + indexArray; + + if ( cache[ indexString ] === undefined ) { + + // cache entry does not exist so far + + if ( typeof value === 'number' || typeof value === 'boolean' ) { + + cache[ indexString ] = value; + + } else { + + cache[ indexString ] = value.clone(); + + } + + return true; + + } else { + + const cachedObject = cache[ indexString ]; + + // compare current value with cached entry + + if ( typeof value === 'number' || typeof value === 'boolean' ) { + + if ( cachedObject !== value ) { + + cache[ indexString ] = value; + return true; + + } + + } else { + + if ( cachedObject.equals( value ) === false ) { + + cachedObject.copy( value ); + return true; + + } + + } + + } + + return false; + + } + + function prepareUniformsGroup( uniformsGroup ) { + + // determine total buffer size according to the STD140 layout + // Hint: STD140 is the only supported layout in WebGL 2 + + const uniforms = uniformsGroup.uniforms; + + let offset = 0; // global buffer offset in bytes + const chunkSize = 16; // size of a chunk in bytes + + for ( let i = 0, l = uniforms.length; i < l; i ++ ) { + + const uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ]; + + for ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) { + + const uniform = uniformArray[ j ]; + + const values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ]; + + for ( let k = 0, kl = values.length; k < kl; k ++ ) { + + const value = values[ k ]; + + const info = getUniformSize( value ); + + const chunkOffset = offset % chunkSize; // offset in the current chunk + const chunkPadding = chunkOffset % info.boundary; // required padding to match boundary + const chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data + + offset += chunkPadding; + + // Check for chunk overflow + if ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) { + + // Add padding and adjust offset + offset += ( chunkSize - chunkStart ); + + } + + // the following two properties will be used for partial buffer updates + uniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT ); + uniform.__offset = offset; + + // Update the global offset + offset += info.storage; + + } + + } + + } + + // ensure correct final padding + + const chunkOffset = offset % chunkSize; + + if ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset ); + + // + + uniformsGroup.__size = offset; + uniformsGroup.__cache = {}; + + return this; + + } + + function getUniformSize( value ) { + + const info = { + boundary: 0, // bytes + storage: 0 // bytes + }; + + // determine sizes according to STD140 + + if ( typeof value === 'number' || typeof value === 'boolean' ) { + + // float/int/bool + + info.boundary = 4; + info.storage = 4; + + } else if ( value.isVector2 ) { + + // vec2 + + info.boundary = 8; + info.storage = 8; + + } else if ( value.isVector3 || value.isColor ) { + + // vec3 + + info.boundary = 16; + info.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes + + } else if ( value.isVector4 ) { + + // vec4 + + info.boundary = 16; + info.storage = 16; + + } else if ( value.isMatrix3 ) { + + // mat3 (in STD140 a 3x3 matrix is represented as 3x4) + + info.boundary = 48; + info.storage = 48; + + } else if ( value.isMatrix4 ) { + + // mat4 + + info.boundary = 64; + info.storage = 64; + + } else if ( value.isTexture ) { + + console.warn( 'THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.' ); + + } else { + + console.warn( 'THREE.WebGLRenderer: Unsupported uniform value type.', value ); + + } + + return info; + + } + + function onUniformsGroupsDispose( event ) { + + const uniformsGroup = event.target; + + uniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose ); + + const index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex ); + allocatedBindingPoints.splice( index, 1 ); + + gl.deleteBuffer( buffers[ uniformsGroup.id ] ); + + delete buffers[ uniformsGroup.id ]; + delete updateList[ uniformsGroup.id ]; + + } + + function dispose() { + + for ( const id in buffers ) { + + gl.deleteBuffer( buffers[ id ] ); + + } + + allocatedBindingPoints = []; + buffers = {}; + updateList = {}; + + } + + return { + + bind: bind, + update: update, + + dispose: dispose + + }; + +} + +class WebGLRenderer { + + constructor( parameters = {} ) { + + const { + canvas = createCanvasElement(), + context = null, + depth = true, + stencil = false, + alpha = false, + antialias = false, + premultipliedAlpha = true, + preserveDrawingBuffer = false, + powerPreference = 'default', + failIfMajorPerformanceCaveat = false, + reverseDepthBuffer = false, + } = parameters; + + this.isWebGLRenderer = true; + + let _alpha; + + if ( context !== null ) { + + if ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) { + + throw new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' ); + + } + + _alpha = context.getContextAttributes().alpha; + + } else { + + _alpha = alpha; + + } + + const uintClearColor = new Uint32Array( 4 ); + const intClearColor = new Int32Array( 4 ); + + let currentRenderList = null; + let currentRenderState = null; + + // render() can be called from within a callback triggered by another render. + // We track this so that the nested render call gets its list and state isolated from the parent render call. + + const renderListStack = []; + const renderStateStack = []; + + // public properties + + this.domElement = canvas; + + // Debug configuration container + this.debug = { + + /** + * Enables error checking and reporting when shader programs are being compiled + * @type {boolean} + */ + checkShaderErrors: true, + /** + * Callback for custom error reporting. + * @type {?Function} + */ + onShaderError: null + }; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this._outputColorSpace = SRGBColorSpace; + + // tone mapping + + this.toneMapping = NoToneMapping; + this.toneMappingExposure = 1.0; + + // internal properties + + const _this = this; + + let _isContextLost = false; + + // internal state cache + + let _currentActiveCubeFace = 0; + let _currentActiveMipmapLevel = 0; + let _currentRenderTarget = null; + let _currentMaterialId = -1; + + let _currentCamera = null; + + const _currentViewport = new Vector4(); + const _currentScissor = new Vector4(); + let _currentScissorTest = null; + + const _currentClearColor = new Color( 0x000000 ); + let _currentClearAlpha = 0; + + // + + let _width = canvas.width; + let _height = canvas.height; + + let _pixelRatio = 1; + let _opaqueSort = null; + let _transparentSort = null; + + const _viewport = new Vector4( 0, 0, _width, _height ); + const _scissor = new Vector4( 0, 0, _width, _height ); + let _scissorTest = false; + + // frustum + + const _frustum = new Frustum(); + + // clipping + + let _clippingEnabled = false; + let _localClippingEnabled = false; + + // transmission render target scale + this.transmissionResolutionScale = 1.0; + + // camera matrices cache + + const _currentProjectionMatrix = new Matrix4(); + const _projScreenMatrix = new Matrix4(); + + const _vector3 = new Vector3(); + + const _vector4 = new Vector4(); + + const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true }; + + let _renderBackground = false; + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + // initialize + + let _gl = context; + + function getContext( contextName, contextAttributes ) { + + return canvas.getContext( contextName, contextAttributes ); + + } + + try { + + const contextAttributes = { + alpha: true, + depth, + stencil, + antialias, + premultipliedAlpha, + preserveDrawingBuffer, + powerPreference, + failIfMajorPerformanceCaveat, + }; + + // OffscreenCanvas does not have setAttribute, see #22811 + if ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` ); + + // event listeners must be registered before WebGL context is created, see #12753 + canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + canvas.addEventListener( 'webglcontextrestored', onContextRestore, false ); + canvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false ); + + if ( _gl === null ) { + + const contextName = 'webgl2'; + + _gl = getContext( contextName, contextAttributes ); + + if ( _gl === null ) { + + if ( getContext( contextName ) ) { + + throw new Error( 'Error creating WebGL context with your selected attributes.' ); + + } else { + + throw new Error( 'Error creating WebGL context.' ); + + } + + } + + } + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error.message ); + throw error; + + } + + let extensions, capabilities, state, info; + let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects; + let programCache, materials, renderLists, renderStates, clipping, shadowMap; + + let background, morphtargets, bufferRenderer, indexedBufferRenderer; + + let utils, bindingStates, uniformsGroups; + + function initGLContext() { + + extensions = new WebGLExtensions( _gl ); + extensions.init(); + + utils = new WebGLUtils( _gl, extensions ); + + capabilities = new WebGLCapabilities( _gl, extensions, parameters, utils ); + + state = new WebGLState( _gl, extensions ); + + if ( capabilities.reverseDepthBuffer && reverseDepthBuffer ) { + + state.buffers.depth.setReversed( true ); + + } + + info = new WebGLInfo( _gl ); + properties = new WebGLProperties(); + textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ); + cubemaps = new WebGLCubeMaps( _this ); + cubeuvmaps = new WebGLCubeUVMaps( _this ); + attributes = new WebGLAttributes( _gl ); + bindingStates = new WebGLBindingStates( _gl, attributes ); + geometries = new WebGLGeometries( _gl, attributes, info, bindingStates ); + objects = new WebGLObjects( _gl, geometries, attributes, info ); + morphtargets = new WebGLMorphtargets( _gl, capabilities, textures ); + clipping = new WebGLClipping( properties ); + programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ); + materials = new WebGLMaterials( _this, properties ); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates( extensions ); + background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha ); + shadowMap = new WebGLShadowMap( _this, objects, capabilities ); + uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state ); + + bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info ); + indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info ); + + info.programs = programCache.programs; + + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.shadowMap = shadowMap; + _this.state = state; + _this.info = info; + + } + + initGLContext(); + + // xr + + const xr = new WebXRManager( _this, _gl ); + + this.xr = xr; + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + const extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.loseContext(); + + }; + + this.forceContextRestore = function () { + + const extension = extensions.get( 'WEBGL_lose_context' ); + if ( extension ) extension.restoreContext(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _width, _height, false ); + + }; + + this.getSize = function ( target ) { + + return target.set( _width, _height ); + + }; + + this.setSize = function ( width, height, updateStyle = true ) { + + if ( xr.isPresenting ) { + + console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' ); + return; + + } + + _width = width; + _height = height; + + canvas.width = Math.floor( width * _pixelRatio ); + canvas.height = Math.floor( height * _pixelRatio ); + + if ( updateStyle === true ) { + + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.getDrawingBufferSize = function ( target ) { + + return target.set( _width * _pixelRatio, _height * _pixelRatio ).floor(); + + }; + + this.setDrawingBufferSize = function ( width, height, pixelRatio ) { + + _width = width; + _height = height; + + _pixelRatio = pixelRatio; + + canvas.width = Math.floor( width * pixelRatio ); + canvas.height = Math.floor( height * pixelRatio ); + + this.setViewport( 0, 0, width, height ); + + }; + + this.getCurrentViewport = function ( target ) { + + return target.copy( _currentViewport ); + + }; + + this.getViewport = function ( target ) { + + return target.copy( _viewport ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + if ( x.isVector4 ) { + + _viewport.set( x.x, x.y, x.z, x.w ); + + } else { + + _viewport.set( x, y, width, height ); + + } + + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() ); + + }; + + this.getScissor = function ( target ) { + + return target.copy( _scissor ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + if ( x.isVector4 ) { + + _scissor.set( x.x, x.y, x.z, x.w ); + + } else { + + _scissor.set( x, y, width, height ); + + } + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() ); + + }; + + this.getScissorTest = function () { + + return _scissorTest; + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + this.setOpaqueSort = function ( method ) { + + _opaqueSort = method; + + }; + + this.setTransparentSort = function ( method ) { + + _transparentSort = method; + + }; + + // Clearing + + this.getClearColor = function ( target ) { + + return target.copy( background.getClearColor() ); + + }; + + this.setClearColor = function () { + + background.setClearColor( ...arguments ); + + }; + + this.getClearAlpha = function () { + + return background.getClearAlpha(); + + }; + + this.setClearAlpha = function () { + + background.setClearAlpha( ...arguments ); + + }; + + this.clear = function ( color = true, depth = true, stencil = true ) { + + let bits = 0; + + if ( color ) { + + // check if we're trying to clear an integer target + let isIntegerFormat = false; + if ( _currentRenderTarget !== null ) { + + const targetFormat = _currentRenderTarget.texture.format; + isIntegerFormat = targetFormat === RGBAIntegerFormat || + targetFormat === RGIntegerFormat || + targetFormat === RedIntegerFormat; + + } + + // use the appropriate clear functions to clear the target if it's a signed + // or unsigned integer target + if ( isIntegerFormat ) { + + const targetType = _currentRenderTarget.texture.type; + const isUnsignedType = targetType === UnsignedByteType || + targetType === UnsignedIntType || + targetType === UnsignedShortType || + targetType === UnsignedInt248Type || + targetType === UnsignedShort4444Type || + targetType === UnsignedShort5551Type; + + const clearColor = background.getClearColor(); + const a = background.getClearAlpha(); + const r = clearColor.r; + const g = clearColor.g; + const b = clearColor.b; + + if ( isUnsignedType ) { + + uintClearColor[ 0 ] = r; + uintClearColor[ 1 ] = g; + uintClearColor[ 2 ] = b; + uintClearColor[ 3 ] = a; + _gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor ); + + } else { + + intClearColor[ 0 ] = r; + intClearColor[ 1 ] = g; + intClearColor[ 2 ] = b; + intClearColor[ 3 ] = a; + _gl.clearBufferiv( _gl.COLOR, 0, intClearColor ); + + } + + } else { + + bits |= _gl.COLOR_BUFFER_BIT; + + } + + } + + if ( depth ) { + + bits |= _gl.DEPTH_BUFFER_BIT; + + } + + if ( stencil ) { + + bits |= _gl.STENCIL_BUFFER_BIT; + this.state.buffers.stencil.setMask( 0xffffffff ); + + } + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + // + + this.dispose = function () { + + canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false ); + canvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false ); + + background.dispose(); + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + cubemaps.dispose(); + cubeuvmaps.dispose(); + objects.dispose(); + bindingStates.dispose(); + uniformsGroups.dispose(); + programCache.dispose(); + + xr.dispose(); + + xr.removeEventListener( 'sessionstart', onXRSessionStart ); + xr.removeEventListener( 'sessionend', onXRSessionEnd ); + + animation.stop(); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + console.log( 'THREE.WebGLRenderer: Context Lost.' ); + + _isContextLost = true; + + } + + function onContextRestore( /* event */ ) { + + console.log( 'THREE.WebGLRenderer: Context Restored.' ); + + _isContextLost = false; + + const infoAutoReset = info.autoReset; + const shadowMapEnabled = shadowMap.enabled; + const shadowMapAutoUpdate = shadowMap.autoUpdate; + const shadowMapNeedsUpdate = shadowMap.needsUpdate; + const shadowMapType = shadowMap.type; + + initGLContext(); + + info.autoReset = infoAutoReset; + shadowMap.enabled = shadowMapEnabled; + shadowMap.autoUpdate = shadowMapAutoUpdate; + shadowMap.needsUpdate = shadowMapNeedsUpdate; + shadowMap.type = shadowMapType; + + } + + function onContextCreationError( event ) { + + console.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage ); + + } + + function onMaterialDispose( event ) { + + const material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReferences( material ); + + properties.remove( material ); + + } + + + function releaseMaterialProgramReferences( material ) { + + const programs = properties.get( material ).programs; + + if ( programs !== undefined ) { + + programs.forEach( function ( program ) { + + programCache.releaseProgram( program ); + + } ); + + if ( material.isShaderMaterial ) { + + programCache.releaseShaderCache( material ); + + } + + } + + } + + // Buffer rendering + + this.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) { + + if ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null) + + const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 ); + + const program = setProgram( camera, scene, geometry, material, object ); + + state.setMaterial( material, frontFaceCW ); + + // + + let index = geometry.index; + let rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = geometries.getWireframeAttribute( geometry ); + + if ( index === undefined ) return; + + rangeFactor = 2; + + } + + // + + const drawRange = geometry.drawRange; + const position = geometry.attributes.position; + + let drawStart = drawRange.start * rangeFactor; + let drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor; + + if ( group !== null ) { + + drawStart = Math.max( drawStart, group.start * rangeFactor ); + drawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor ); + + } + + if ( index !== null ) { + + drawStart = Math.max( drawStart, 0 ); + drawEnd = Math.min( drawEnd, index.count ); + + } else if ( position !== undefined && position !== null ) { + + drawStart = Math.max( drawStart, 0 ); + drawEnd = Math.min( drawEnd, position.count ); + + } + + const drawCount = drawEnd - drawStart; + + if ( drawCount < 0 || drawCount === Infinity ) return; + + // + + bindingStates.setup( object, material, program, geometry, index ); + + let attribute; + let renderer = bufferRenderer; + + if ( index !== null ) { + + attribute = attributes.get( index ); + + renderer = indexedBufferRenderer; + renderer.setIndex( attribute ); + + } + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + renderer.setMode( _gl.TRIANGLES ); + + } + + } else if ( object.isLine ) { + + let lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else if ( object.isLineLoop ) { + + renderer.setMode( _gl.LINE_LOOP ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } else if ( object.isSprite ) { + + renderer.setMode( _gl.TRIANGLES ); + + } + + if ( object.isBatchedMesh ) { + + if ( object._multiDrawInstances !== null ) { + + // @deprecated, r174 + warnOnce( 'THREE.WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' ); + renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances ); + + } else { + + if ( ! extensions.get( 'WEBGL_multi_draw' ) ) { + + const starts = object._multiDrawStarts; + const counts = object._multiDrawCounts; + const drawCount = object._multiDrawCount; + const bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1; + const uniforms = properties.get( material ).currentProgram.getUniforms(); + for ( let i = 0; i < drawCount; i ++ ) { + + uniforms.setValue( _gl, '_gl_DrawID', i ); + renderer.render( starts[ i ] / bytesPerElement, counts[ i ] ); + + } + + } else { + + renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount ); + + } + + } + + } else if ( object.isInstancedMesh ) { + + renderer.renderInstances( drawStart, drawCount, object.count ); + + } else if ( geometry.isInstancedBufferGeometry ) { + + const maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity; + const instanceCount = Math.min( geometry.instanceCount, maxInstanceCount ); + + renderer.renderInstances( drawStart, drawCount, instanceCount ); + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + // Compile + + function prepareMaterial( material, scene, object ) { + + if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) { + + material.side = BackSide; + material.needsUpdate = true; + getProgram( material, scene, object ); + + material.side = FrontSide; + material.needsUpdate = true; + getProgram( material, scene, object ); + + material.side = DoubleSide; + + } else { + + getProgram( material, scene, object ); + + } + + } + + this.compile = function ( scene, camera, targetScene = null ) { + + if ( targetScene === null ) targetScene = scene; + + currentRenderState = renderStates.get( targetScene ); + currentRenderState.init( camera ); + + renderStateStack.push( currentRenderState ); + + // gather lights from both the target scene and the new object that will be added to the scene. + + targetScene.traverseVisible( function ( object ) { + + if ( object.isLight && object.layers.test( camera.layers ) ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + if ( scene !== targetScene ) { + + scene.traverseVisible( function ( object ) { + + if ( object.isLight && object.layers.test( camera.layers ) ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } + + } ); + + } + + currentRenderState.setupLights(); + + // Only initialize materials in the new scene, not the targetScene. + + const materials = new Set(); + + scene.traverse( function ( object ) { + + if ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) { + + return; + + } + + const material = object.material; + + if ( material ) { + + if ( Array.isArray( material ) ) { + + for ( let i = 0; i < material.length; i ++ ) { + + const material2 = material[ i ]; + + prepareMaterial( material2, targetScene, object ); + materials.add( material2 ); + + } + + } else { + + prepareMaterial( material, targetScene, object ); + materials.add( material ); + + } + + } + + } ); + + currentRenderState = renderStateStack.pop(); + + return materials; + + }; + + // compileAsync + + this.compileAsync = function ( scene, camera, targetScene = null ) { + + const materials = this.compile( scene, camera, targetScene ); + + // Wait for all the materials in the new object to indicate that they're + // ready to be used before resolving the promise. + + return new Promise( ( resolve ) => { + + function checkMaterialsReady() { + + materials.forEach( function ( material ) { + + const materialProperties = properties.get( material ); + const program = materialProperties.currentProgram; + + if ( program.isReady() ) { + + // remove any programs that report they're ready to use from the list + materials.delete( material ); + + } + + } ); + + // once the list of compiling materials is empty, call the callback + + if ( materials.size === 0 ) { + + resolve( scene ); + return; + + } + + // if some materials are still not ready, wait a bit and check again + + setTimeout( checkMaterialsReady, 10 ); + + } + + if ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) { + + // If we can check the compilation status of the materials without + // blocking then do so right away. + + checkMaterialsReady(); + + } else { + + // Otherwise start by waiting a bit to give the materials we just + // initialized a chance to finish. + + setTimeout( checkMaterialsReady, 10 ); + + } + + } ); + + }; + + // Animation Loop + + let onAnimationFrameCallback = null; + + function onAnimationFrame( time ) { + + if ( onAnimationFrameCallback ) onAnimationFrameCallback( time ); + + } + + function onXRSessionStart() { + + animation.stop(); + + } + + function onXRSessionEnd() { + + animation.start(); + + } + + const animation = new WebGLAnimation(); + animation.setAnimationLoop( onAnimationFrame ); + + if ( typeof self !== 'undefined' ) animation.setContext( self ); + + this.setAnimationLoop = function ( callback ) { + + onAnimationFrameCallback = callback; + xr.setAnimationLoop( callback ); + + ( callback === null ) ? animation.stop() : animation.start(); + + }; + + xr.addEventListener( 'sessionstart', onXRSessionStart ); + xr.addEventListener( 'sessionend', onXRSessionEnd ); + + // Rendering + + this.render = function ( scene, camera ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + if ( _isContextLost === true ) return; + + // update scene graph + + if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld(); + + if ( xr.enabled === true && xr.isPresenting === true ) { + + if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera ); + + camera = xr.getCamera(); // use XR camera for rendering + + } + + // + if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget ); + + currentRenderState = renderStates.get( scene, renderStateStack.length ); + currentRenderState.init( camera ); + + renderStateStack.push( currentRenderState ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromProjectionMatrix( _projScreenMatrix ); + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled ); + + currentRenderList = renderLists.get( scene, renderListStack.length ); + currentRenderList.init(); + + renderListStack.push( currentRenderList ); + + if ( xr.enabled === true && xr.isPresenting === true ) { + + const depthSensingMesh = _this.xr.getDepthSensingMesh(); + + if ( depthSensingMesh !== null ) { + + projectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects ); + + } + + } + + projectObject( scene, camera, 0, _this.sortObjects ); + + currentRenderList.finish(); + + if ( _this.sortObjects === true ) { + + currentRenderList.sort( _opaqueSort, _transparentSort ); + + } + + _renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false; + if ( _renderBackground ) { + + background.addToRenderList( currentRenderList, scene ); + + } + + // + + this.info.render.frame ++; + + if ( _clippingEnabled === true ) clipping.beginShadows(); + + const shadowsArray = currentRenderState.state.shadowsArray; + + shadowMap.render( shadowsArray, scene, camera ); + + if ( _clippingEnabled === true ) clipping.endShadows(); + + // + + if ( this.info.autoReset === true ) this.info.reset(); + + // render scene + + const opaqueObjects = currentRenderList.opaque; + const transmissiveObjects = currentRenderList.transmissive; + + currentRenderState.setupLights(); + + if ( camera.isArrayCamera ) { + + const cameras = camera.cameras; + + if ( transmissiveObjects.length > 0 ) { + + for ( let i = 0, l = cameras.length; i < l; i ++ ) { + + const camera2 = cameras[ i ]; + + renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 ); + + } + + } + + if ( _renderBackground ) background.render( scene ); + + for ( let i = 0, l = cameras.length; i < l; i ++ ) { + + const camera2 = cameras[ i ]; + + renderScene( currentRenderList, scene, camera2, camera2.viewport ); + + } + + } else { + + if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ); + + if ( _renderBackground ) background.render( scene ); + + renderScene( currentRenderList, scene, camera ); + + } + + // + + if ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) { + + // resolve multisample renderbuffers to a single-sample texture if necessary + + textures.updateMultisampleRenderTarget( _currentRenderTarget ); + + // Generate mipmap if we're using any kind of mipmap filtering + + textures.updateRenderTargetMipmap( _currentRenderTarget ); + + } + + // + + if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera ); + + // _gl.finish(); + + bindingStates.resetDefaultState(); + _currentMaterialId = -1; + _currentCamera = null; + + renderStateStack.pop(); + + if ( renderStateStack.length > 0 ) { + + currentRenderState = renderStateStack[ renderStateStack.length - 1 ]; + + if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera ); + + } else { + + currentRenderState = null; + + } + + renderListStack.pop(); + + if ( renderListStack.length > 0 ) { + + currentRenderList = renderListStack[ renderListStack.length - 1 ]; + + } else { + + currentRenderList = null; + + } + + }; + + function projectObject( object, camera, groupOrder, sortObjects ) { + + if ( object.visible === false ) return; + + const visible = object.layers.test( camera.layers ); + + if ( visible ) { + + if ( object.isGroup ) { + + groupOrder = object.renderOrder; + + } else if ( object.isLOD ) { + + if ( object.autoUpdate === true ) object.update( camera ); + + } else if ( object.isLight ) { + + currentRenderState.pushLight( object ); + + if ( object.castShadow ) { + + currentRenderState.pushShadow( object ); + + } + + } else if ( object.isSprite ) { + + if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { + + if ( sortObjects ) { + + _vector4.setFromMatrixPosition( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + const geometry = objects.update( object ); + const material = object.material; + + if ( material.visible ) { + + currentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null ); + + } + + } + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { + + const geometry = objects.update( object ); + const material = object.material; + + if ( sortObjects ) { + + if ( object.boundingSphere !== undefined ) { + + if ( object.boundingSphere === null ) object.computeBoundingSphere(); + _vector4.copy( object.boundingSphere.center ); + + } else { + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + _vector4.copy( geometry.boundingSphere.center ); + + } + + _vector4 + .applyMatrix4( object.matrixWorld ) + .applyMatrix4( _projScreenMatrix ); + + } + + if ( Array.isArray( material ) ) { + + const groups = geometry.groups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + const groupMaterial = material[ group.materialIndex ]; + + if ( groupMaterial && groupMaterial.visible ) { + + currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group ); + + } + + } + + } else if ( material.visible ) { + + currentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null ); + + } + + } + + } + + } + + const children = object.children; + + for ( let i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, groupOrder, sortObjects ); + + } + + } + + function renderScene( currentRenderList, scene, camera, viewport ) { + + const opaqueObjects = currentRenderList.opaque; + const transmissiveObjects = currentRenderList.transmissive; + const transparentObjects = currentRenderList.transparent; + + currentRenderState.setupLightsView( camera ); + + if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera ); + + if ( viewport ) state.viewport( _currentViewport.copy( viewport ) ); + + if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera ); + if ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera ); + if ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera ); + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest( true ); + state.buffers.depth.setMask( true ); + state.buffers.color.setMask( true ); + + state.setPolygonOffset( false ); + + } + + function renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) { + + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + + if ( overrideMaterial !== null ) { + + return; + + } + + if ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) { + + currentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, { + generateMipmaps: true, + type: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType, + minFilter: LinearMipmapLinearFilter, + samples: 4, + stencilBuffer: stencil, + resolveDepthBuffer: false, + resolveStencilBuffer: false, + colorSpace: ColorManagement.workingColorSpace, + } ); + + // debug + + /* + const geometry = new PlaneGeometry(); + const material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } ); + + const mesh = new Mesh( geometry, material ); + scene.add( mesh ); + */ + + } + + const transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ]; + + const activeViewport = camera.viewport || _currentViewport; + transmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale ); + + // + + const currentRenderTarget = _this.getRenderTarget(); + _this.setRenderTarget( transmissionRenderTarget ); + + _this.getClearColor( _currentClearColor ); + _currentClearAlpha = _this.getClearAlpha(); + if ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 ); + + _this.clear(); + + if ( _renderBackground ) background.render( scene ); + + // Turn off the features which can affect the frag color for opaque objects pass. + // Otherwise they are applied twice in opaque objects pass and transmission objects pass. + const currentToneMapping = _this.toneMapping; + _this.toneMapping = NoToneMapping; + + // Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector). + // Transmission render pass requires viewport to match the transmissionRenderTarget. + const currentCameraViewport = camera.viewport; + if ( camera.viewport !== undefined ) camera.viewport = undefined; + + currentRenderState.setupLightsView( camera ); + + if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera ); + + renderObjects( opaqueObjects, scene, camera ); + + textures.updateMultisampleRenderTarget( transmissionRenderTarget ); + textures.updateRenderTargetMipmap( transmissionRenderTarget ); + + if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131 + + let renderTargetNeedsUpdate = false; + + for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) { + + const renderItem = transmissiveObjects[ i ]; + + const object = renderItem.object; + const geometry = renderItem.geometry; + const material = renderItem.material; + const group = renderItem.group; + + if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) { + + const currentSide = material.side; + + material.side = BackSide; + material.needsUpdate = true; + + renderObject( object, scene, camera, geometry, material, group ); + + material.side = currentSide; + material.needsUpdate = true; + + renderTargetNeedsUpdate = true; + + } + + } + + if ( renderTargetNeedsUpdate === true ) { + + textures.updateMultisampleRenderTarget( transmissionRenderTarget ); + textures.updateRenderTargetMipmap( transmissionRenderTarget ); + + } + + } + + _this.setRenderTarget( currentRenderTarget ); + + _this.setClearColor( _currentClearColor, _currentClearAlpha ); + + if ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport; + + _this.toneMapping = currentToneMapping; + + } + + function renderObjects( renderList, scene, camera ) { + + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + + for ( let i = 0, l = renderList.length; i < l; i ++ ) { + + const renderItem = renderList[ i ]; + + const object = renderItem.object; + const geometry = renderItem.geometry; + const material = overrideMaterial === null ? renderItem.material : overrideMaterial; + const group = renderItem.group; + + if ( object.layers.test( camera.layers ) ) { + + renderObject( object, scene, camera, geometry, material, group ); + + } + + } + + } + + function renderObject( object, scene, camera, geometry, material, group ) { + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + material.onBeforeRender( _this, scene, camera, geometry, object, group ); + + if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) { + + material.side = BackSide; + material.needsUpdate = true; + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + material.side = FrontSide; + material.needsUpdate = true; + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + material.side = DoubleSide; + + } else { + + _this.renderBufferDirect( camera, scene, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + } + + function getProgram( material, scene, object ) { + + if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... + + const materialProperties = properties.get( material ); + + const lights = currentRenderState.state.lights; + const shadowsArray = currentRenderState.state.shadowsArray; + + const lightsStateVersion = lights.state.version; + + const parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object ); + const programCacheKey = programCache.getProgramCacheKey( parameters ); + + let programs = materialProperties.programs; + + // always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change + + materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.fog = scene.fog; + materialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment ); + materialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation; + + if ( programs === undefined ) { + + // new material + + material.addEventListener( 'dispose', onMaterialDispose ); + + programs = new Map(); + materialProperties.programs = programs; + + } + + let program = programs.get( programCacheKey ); + + if ( program !== undefined ) { + + // early out if program and light state is identical + + if ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) { + + updateCommonMaterialProperties( material, parameters ); + + return program; + + } + + } else { + + parameters.uniforms = programCache.getUniforms( material ); + + material.onBeforeCompile( parameters, _this ); + + program = programCache.acquireProgram( parameters, programCacheKey ); + programs.set( programCacheKey, program ); + + materialProperties.uniforms = parameters.uniforms; + + } + + const uniforms = materialProperties.uniforms; + + if ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) { + + uniforms.clippingPlanes = clipping.uniform; + + } + + updateCommonMaterialProperties( material, parameters ); + + // store the light setup it was created for + + materialProperties.needsLights = materialNeedsLights( material ); + materialProperties.lightsStateVersion = lightsStateVersion; + + if ( materialProperties.needsLights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.lightProbe.value = lights.state.probe; + uniforms.directionalLights.value = lights.state.directional; + uniforms.directionalLightShadows.value = lights.state.directionalShadow; + uniforms.spotLights.value = lights.state.spot; + uniforms.spotLightShadows.value = lights.state.spotShadow; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.ltc_1.value = lights.state.rectAreaLTC1; + uniforms.ltc_2.value = lights.state.rectAreaLTC2; + uniforms.pointLights.value = lights.state.point; + uniforms.pointLightShadows.value = lights.state.pointShadow; + uniforms.hemisphereLights.value = lights.state.hemi; + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotLightMatrix.value = lights.state.spotLightMatrix; + uniforms.spotLightMap.value = lights.state.spotLightMap; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + // TODO (abelnation): add area lights shadow info to uniforms + + } + + materialProperties.currentProgram = program; + materialProperties.uniformsList = null; + + return program; + + } + + function getUniformList( materialProperties ) { + + if ( materialProperties.uniformsList === null ) { + + const progUniforms = materialProperties.currentProgram.getUniforms(); + materialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms ); + + } + + return materialProperties.uniformsList; + + } + + function updateCommonMaterialProperties( material, parameters ) { + + const materialProperties = properties.get( material ); + + materialProperties.outputColorSpace = parameters.outputColorSpace; + materialProperties.batching = parameters.batching; + materialProperties.batchingColor = parameters.batchingColor; + materialProperties.instancing = parameters.instancing; + materialProperties.instancingColor = parameters.instancingColor; + materialProperties.instancingMorph = parameters.instancingMorph; + materialProperties.skinning = parameters.skinning; + materialProperties.morphTargets = parameters.morphTargets; + materialProperties.morphNormals = parameters.morphNormals; + materialProperties.morphColors = parameters.morphColors; + materialProperties.morphTargetsCount = parameters.morphTargetsCount; + materialProperties.numClippingPlanes = parameters.numClippingPlanes; + materialProperties.numIntersection = parameters.numClipIntersection; + materialProperties.vertexAlphas = parameters.vertexAlphas; + materialProperties.vertexTangents = parameters.vertexTangents; + materialProperties.toneMapping = parameters.toneMapping; + + } + + function setProgram( camera, scene, geometry, material, object ) { + + if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ... + + textures.resetTextureUnits(); + + const fog = scene.fog; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ); + const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment ); + const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4; + const vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 ); + const morphTargets = !! geometry.morphAttributes.position; + const morphNormals = !! geometry.morphAttributes.normal; + const morphColors = !! geometry.morphAttributes.color; + + let toneMapping = NoToneMapping; + + if ( material.toneMapped ) { + + if ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) { + + toneMapping = _this.toneMapping; + + } + + } + + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0; + + const materialProperties = properties.get( material ); + const lights = currentRenderState.state.lights; + + if ( _clippingEnabled === true ) { + + if ( _localClippingEnabled === true || camera !== _currentCamera ) { + + const useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + clipping.setState( material, camera, useCache ); + + } + + } + + // + + let needsProgramChange = false; + + if ( material.version === materialProperties.__version ) { + + if ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) { + + needsProgramChange = true; + + } else if ( materialProperties.outputColorSpace !== colorSpace ) { + + needsProgramChange = true; + + } else if ( object.isBatchedMesh && materialProperties.batching === false ) { + + needsProgramChange = true; + + } else if ( ! object.isBatchedMesh && materialProperties.batching === true ) { + + needsProgramChange = true; + + } else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) { + + needsProgramChange = true; + + } else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) { + + needsProgramChange = true; + + } else if ( object.isInstancedMesh && materialProperties.instancing === false ) { + + needsProgramChange = true; + + } else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) { + + needsProgramChange = true; + + } else if ( object.isSkinnedMesh && materialProperties.skinning === false ) { + + needsProgramChange = true; + + } else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) { + + needsProgramChange = true; + + } else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) { + + needsProgramChange = true; + + } else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) { + + needsProgramChange = true; + + } else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) { + + needsProgramChange = true; + + } else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) { + + needsProgramChange = true; + + } else if ( materialProperties.envMap !== envMap ) { + + needsProgramChange = true; + + } else if ( material.fog === true && materialProperties.fog !== fog ) { + + needsProgramChange = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== clipping.numPlanes || + materialProperties.numIntersection !== clipping.numIntersection ) ) { + + needsProgramChange = true; + + } else if ( materialProperties.vertexAlphas !== vertexAlphas ) { + + needsProgramChange = true; + + } else if ( materialProperties.vertexTangents !== vertexTangents ) { + + needsProgramChange = true; + + } else if ( materialProperties.morphTargets !== morphTargets ) { + + needsProgramChange = true; + + } else if ( materialProperties.morphNormals !== morphNormals ) { + + needsProgramChange = true; + + } else if ( materialProperties.morphColors !== morphColors ) { + + needsProgramChange = true; + + } else if ( materialProperties.toneMapping !== toneMapping ) { + + needsProgramChange = true; + + } else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) { + + needsProgramChange = true; + + } + + } else { + + needsProgramChange = true; + materialProperties.__version = material.version; + + } + + // + + let program = materialProperties.currentProgram; + + if ( needsProgramChange === true ) { + + program = getProgram( material, scene, object ); + + } + + let refreshProgram = false; + let refreshMaterial = false; + let refreshLights = false; + + const p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.uniforms; + + if ( state.useProgram( program.program ) ) { + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || _currentCamera !== camera ) { + + // common camera uniforms + + const reverseDepthBuffer = state.buffers.depth.getReversed(); + + if ( reverseDepthBuffer ) { + + _currentProjectionMatrix.copy( camera.projectionMatrix ); + + toNormalizedProjectionMatrix( _currentProjectionMatrix ); + toReversedProjectionMatrix( _currentProjectionMatrix ); + + p_uniforms.setValue( _gl, 'projectionMatrix', _currentProjectionMatrix ); + + } else { + + p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); + + } + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + const uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + // consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067 + + if ( material.isMeshPhongMaterial || + material.isMeshToonMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial ) { + + p_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true ); + + } + + if ( _currentCamera !== camera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + } + + // skinning and morph target uniforms must be set even if material didn't change + // auto-setting of texture unit for bone and morph texture must go before other textures + // otherwise textures used for skinning and morphing can take over texture units reserved for other material textures + + if ( object.isSkinnedMesh ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + const skeleton = object.skeleton; + + if ( skeleton ) { + + if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture(); + + p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures ); + + } + + } + + if ( object.isBatchedMesh ) { + + p_uniforms.setOptional( _gl, object, 'batchingTexture' ); + p_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures ); + + p_uniforms.setOptional( _gl, object, 'batchingIdTexture' ); + p_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures ); + + p_uniforms.setOptional( _gl, object, 'batchingColorTexture' ); + if ( object._colorsTexture !== null ) { + + p_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures ); + + } + + } + + const morphAttributes = geometry.morphAttributes; + + if ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) { + + morphtargets.update( object, geometry, program ); + + } + + if ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) { + + materialProperties.receiveShadow = object.receiveShadow; + p_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow ); + + } + + // https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512 + + if ( material.isMeshGouraudMaterial && material.envMap !== null ) { + + m_uniforms.envMap.value = envMap; + + m_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1; + + } + + if ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) { + + m_uniforms.envMapIntensity.value = scene.environmentIntensity; + + } + + if ( refreshMaterial ) { + + p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); + + if ( materialProperties.needsLights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog === true ) { + + materials.refreshFogUniforms( m_uniforms, fog ); + + } + + materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] ); + + WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures ); + + } + + if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) { + + WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures ); + material.uniformsNeedUpdate = false; + + } + + if ( material.isSpriteMaterial ) { + + p_uniforms.setValue( _gl, 'center', object.center ); + + } + + // common matrices + + p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); + p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + // UBOs + + if ( material.isShaderMaterial || material.isRawShaderMaterial ) { + + const groups = material.uniformsGroups; + + for ( let i = 0, l = groups.length; i < l; i ++ ) { + + const group = groups[ i ]; + + uniformsGroups.update( group, program ); + uniformsGroups.bind( group, program ); + + } + + } + + return program; + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + uniforms.lightProbe.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.directionalLightShadows.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.pointLightShadows.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.spotLightShadows.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + function materialNeedsLights( material ) { + + return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial || + material.isMeshStandardMaterial || material.isShadowMaterial || + ( material.isShaderMaterial && material.lights === true ); + + } + + this.getActiveCubeFace = function () { + + return _currentActiveCubeFace; + + }; + + this.getActiveMipmapLevel = function () { + + return _currentActiveMipmapLevel; + + }; + + this.getRenderTarget = function () { + + return _currentRenderTarget; + + }; + + this.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) { + + properties.get( renderTarget.texture ).__webglTexture = colorTexture; + properties.get( renderTarget.depthTexture ).__webglTexture = depthTexture; + + const renderTargetProperties = properties.get( renderTarget ); + renderTargetProperties.__hasExternalTextures = true; + + renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined; + + if ( ! renderTargetProperties.__autoAllocateDepthBuffer ) { + + // The multisample_render_to_texture extension doesn't work properly if there + // are midframe flushes and an external depth buffer. Disable use of the extension. + if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) { + + console.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' ); + renderTargetProperties.__useRenderToTexture = false; + + } + + } + + }; + + this.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) { + + const renderTargetProperties = properties.get( renderTarget ); + renderTargetProperties.__webglFramebuffer = defaultFramebuffer; + renderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined; + + }; + + const _scratchFrameBuffer = _gl.createFramebuffer(); + this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) { + + _currentRenderTarget = renderTarget; + _currentActiveCubeFace = activeCubeFace; + _currentActiveMipmapLevel = activeMipmapLevel; + + let useDefaultFramebuffer = true; + let framebuffer = null; + let isCube = false; + let isRenderTarget3D = false; + + if ( renderTarget ) { + + const renderTargetProperties = properties.get( renderTarget ); + + if ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) { + + // We need to make sure to rebind the framebuffer. + state.bindFramebuffer( _gl.FRAMEBUFFER, null ); + useDefaultFramebuffer = false; + + } else if ( renderTargetProperties.__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } else if ( renderTargetProperties.__hasExternalTextures ) { + + // Color and depth texture must be rebound in order for the swapchain to update. + textures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture ); + + } else if ( renderTarget.depthBuffer ) { + + // check if the depth texture is already bound to the frame buffer and that it's been initialized + const depthTexture = renderTarget.depthTexture; + if ( renderTargetProperties.__boundDepthTexture !== depthTexture ) { + + // check if the depth texture is compatible + if ( + depthTexture !== null && + properties.has( depthTexture ) && + ( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height ) + ) { + + throw new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' ); + + } + + // Swap the depth buffer to the currently attached one + textures.setupDepthRenderbuffer( renderTarget ); + + } + + } + + const texture = renderTarget.texture; + + if ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) { + + isRenderTarget3D = true; + + } + + const __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLCubeRenderTarget ) { + + if ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) { + + framebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ]; + + } else { + + framebuffer = __webglFramebuffer[ activeCubeFace ]; + + } + + isCube = true; + + } else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) { + + framebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer; + + } else { + + if ( Array.isArray( __webglFramebuffer ) ) { + + framebuffer = __webglFramebuffer[ activeMipmapLevel ]; + + } else { + + framebuffer = __webglFramebuffer; + + } + + } + + _currentViewport.copy( renderTarget.viewport ); + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + } else { + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor(); + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor(); + _currentScissorTest = _scissorTest; + + } + + // Use a scratch frame buffer if rendering to a mip level to avoid depth buffers + // being bound that are different sizes. + if ( activeMipmapLevel !== 0 ) { + + framebuffer = _scratchFrameBuffer; + + } + + const framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( framebufferBound && useDefaultFramebuffer ) { + + state.drawBuffers( renderTarget, framebuffer ); + + } + + state.viewport( _currentViewport ); + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + if ( isCube ) { + + const textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel ); + + } else if ( isRenderTarget3D ) { + + const textureProperties = properties.get( renderTarget.texture ); + const layer = activeCubeFace; + _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel, layer ); + + } else if ( renderTarget !== null && activeMipmapLevel !== 0 ) { + + // Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap. + // If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown. + const textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel ); + + } + + _currentMaterialId = -1; // reset current material to ensure correct uniform bindings + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + let framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) { + + framebuffer = framebuffer[ activeCubeFaceIndex ]; + + } + + if ( framebuffer ) { + + state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + try { + + const texture = renderTarget.texture; + const textureFormat = texture.format; + const textureType = texture.type; + + if ( ! capabilities.textureFormatReadable( textureFormat ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( ! capabilities.textureTypeReadable( textureType ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer ); + + } + + } finally { + + // restore framebuffer of current render target if necessary + + const framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null; + state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + } + + } + + }; + + this.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) { + + if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) { + + throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + + } + + let framebuffer = properties.get( renderTarget ).__webglFramebuffer; + if ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) { + + framebuffer = framebuffer[ activeCubeFaceIndex ]; + + } + + if ( framebuffer ) { + + const texture = renderTarget.texture; + const textureFormat = texture.format; + const textureType = texture.type; + + if ( ! capabilities.textureFormatReadable( textureFormat ) ) { + + throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' ); + + } + + if ( ! capabilities.textureTypeReadable( textureType ) ) { + + throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' ); + + } + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + // set the active frame buffer to the one we want to read + state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + const glBuffer = _gl.createBuffer(); + _gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer ); + _gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ ); + _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 ); + + // reset the frame buffer to the currently set buffer before waiting + const currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null; + state.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer ); + + // check if the commands have finished every 8 ms + const sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 ); + + _gl.flush(); + + await probeAsync( _gl, sync, 4 ); + + // read the data and delete the buffer + _gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer ); + _gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer ); + _gl.deleteBuffer( glBuffer ); + _gl.deleteSync( sync ); + + return buffer; + + } else { + + throw new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' ); + + } + + } + + }; + + this.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) { + + // support previous signature with position first + if ( texture.isTexture !== true ) { + + // @deprecated, r165 + warnOnce( 'WebGLRenderer: copyFramebufferToTexture function signature has changed.' ); + + position = arguments[ 0 ] || null; + texture = arguments[ 1 ]; + + } + + const levelScale = Math.pow( 2, - level ); + const width = Math.floor( texture.image.width * levelScale ); + const height = Math.floor( texture.image.height * levelScale ); + + const x = position !== null ? position.x : 0; + const y = position !== null ? position.y : 0; + + textures.setTexture2D( texture, 0 ); + + _gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height ); + + state.unbindTexture(); + + }; + + const _srcFramebuffer = _gl.createFramebuffer(); + const _dstFramebuffer = _gl.createFramebuffer(); + this.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) { + + // support previous signature with dstPosition first + if ( srcTexture.isTexture !== true ) { + + // @deprecated, r165 + warnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed.' ); + + dstPosition = arguments[ 0 ] || null; + srcTexture = arguments[ 1 ]; + dstTexture = arguments[ 2 ]; + dstLevel = arguments[ 3 ] || 0; + srcRegion = null; + + } + + // support the previous signature with just a single dst mipmap level + if ( dstLevel === null ) { + + if ( srcLevel !== 0 ) { + + // @deprecated, r171 + warnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' ); + dstLevel = srcLevel; + srcLevel = 0; + + } else { + + dstLevel = 0; + + } + + } + + // gather the necessary dimensions to copy + let width, height, depth, minX, minY, minZ; + let dstX, dstY, dstZ; + const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image; + if ( srcRegion !== null ) { + + width = srcRegion.max.x - srcRegion.min.x; + height = srcRegion.max.y - srcRegion.min.y; + depth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1; + minX = srcRegion.min.x; + minY = srcRegion.min.y; + minZ = srcRegion.isBox3 ? srcRegion.min.z : 0; + + } else { + + const levelScale = Math.pow( 2, - srcLevel ); + width = Math.floor( image.width * levelScale ); + height = Math.floor( image.height * levelScale ); + if ( srcTexture.isDataArrayTexture ) { + + depth = image.depth; + + } else if ( srcTexture.isData3DTexture ) { + + depth = Math.floor( image.depth * levelScale ); + + } else { + + depth = 1; + + } + + minX = 0; + minY = 0; + minZ = 0; + + } + + if ( dstPosition !== null ) { + + dstX = dstPosition.x; + dstY = dstPosition.y; + dstZ = dstPosition.z; + + } else { + + dstX = 0; + dstY = 0; + dstZ = 0; + + } + + // Set up the destination target + const glFormat = utils.convert( dstTexture.format ); + const glType = utils.convert( dstTexture.type ); + let glTarget; + + if ( dstTexture.isData3DTexture ) { + + textures.setTexture3D( dstTexture, 0 ); + glTarget = _gl.TEXTURE_3D; + + } else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) { + + textures.setTexture2DArray( dstTexture, 0 ); + glTarget = _gl.TEXTURE_2D_ARRAY; + + } else { + + textures.setTexture2D( dstTexture, 0 ); + glTarget = _gl.TEXTURE_2D; + + } + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment ); + + // used for copying data from cpu + const currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH ); + const currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT ); + const currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS ); + const currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS ); + const currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES ); + + _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width ); + _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height ); + _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX ); + _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY ); + _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ ); + + // set up the src texture + const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture; + const isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture; + if ( srcTexture.isDepthTexture ) { + + const srcTextureProperties = properties.get( srcTexture ); + const dstTextureProperties = properties.get( dstTexture ); + const srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget ); + const dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget ); + state.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer ); + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer ); + + for ( let i = 0; i < depth; i ++ ) { + + // if the source or destination are a 3d target then a layer needs to be bound + if ( isSrc3D ) { + + _gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i ); + _gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i ); + + } + + _gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST ); + + } + + state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null ); + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null ); + + } else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) { + + // get the appropriate frame buffers + const srcTextureProperties = properties.get( srcTexture ); + const dstTextureProperties = properties.get( dstTexture ); + + // bind the frame buffer targets + state.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer ); + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer ); + + for ( let i = 0; i < depth; i ++ ) { + + // assign the correct layers and mip maps to the frame buffers + if ( isSrc3D ) { + + _gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i ); + + } else { + + _gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel ); + + } + + if ( isDst3D ) { + + _gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i ); + + } else { + + _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel ); + + } + + // copy the data using the fastest function that can achieve the copy + if ( srcLevel !== 0 ) { + + _gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST ); + + } else if ( isDst3D ) { + + _gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height ); + + } else { + + _gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height ); + + } + + } + + // unbind read, draw buffers + state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null ); + state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null ); + + } else { + + if ( isDst3D ) { + + // copy data into the 3d texture + if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) { + + _gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data ); + + } else if ( dstTexture.isCompressedArrayTexture ) { + + _gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data ); + + } else { + + _gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image ); + + } + + } else { + + // copy data into the 2d texture + if ( srcTexture.isDataTexture ) { + + _gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data ); + + } else if ( srcTexture.isCompressedTexture ) { + + _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data ); + + } else { + + _gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image ); + + } + + } + + } + + // reset values + _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen ); + _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight ); + _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels ); + _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows ); + _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages ); + + // Generate mipmaps only when copying level 0 + if ( dstLevel === 0 && dstTexture.generateMipmaps ) { + + _gl.generateMipmap( glTarget ); + + } + + state.unbindTexture(); + + }; + + this.copyTextureToTexture3D = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) { + + // support previous signature with source box first + if ( srcTexture.isTexture !== true ) { + + // @deprecated, r165 + warnOnce( 'WebGLRenderer: copyTextureToTexture3D function signature has changed.' ); + + srcRegion = arguments[ 0 ] || null; + dstPosition = arguments[ 1 ] || null; + srcTexture = arguments[ 2 ]; + dstTexture = arguments[ 3 ]; + level = arguments[ 4 ] || 0; + + } + + // @deprecated, r170 + warnOnce( 'WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.' ); + + return this.copyTextureToTexture( srcTexture, dstTexture, srcRegion, dstPosition, level ); + + }; + + this.initRenderTarget = function ( target ) { + + if ( properties.get( target ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( target ); + + } + + }; + + this.initTexture = function ( texture ) { + + if ( texture.isCubeTexture ) { + + textures.setTextureCube( texture, 0 ); + + } else if ( texture.isData3DTexture ) { + + textures.setTexture3D( texture, 0 ); + + } else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) { + + textures.setTexture2DArray( texture, 0 ); + + } else { + + textures.setTexture2D( texture, 0 ); + + } + + state.unbindTexture(); + + }; + + this.resetState = function () { + + _currentActiveCubeFace = 0; + _currentActiveMipmapLevel = 0; + _currentRenderTarget = null; + + state.reset(); + bindingStates.reset(); + + }; + + if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); + + } + + } + + get coordinateSystem() { + + return WebGLCoordinateSystem; + + } + + get outputColorSpace() { + + return this._outputColorSpace; + + } + + set outputColorSpace( colorSpace ) { + + this._outputColorSpace = colorSpace; + + const gl = this.getContext(); + gl.drawingBufferColorspace = ColorManagement._getDrawingBufferColorSpace( colorSpace ); + gl.unpackColorSpace = ColorManagement._getUnpackColorSpace(); + + } + +} + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +// Allows minifiers to rename references to globalThis +const global = globalThis; +/** + * Useful for visualizing and logging insights into what the Lit template system is doing. + * + * Compiled out of prod mode builds. + */ +const debugLogEvent = (event) => { + const shouldEmit = global + .emitLitDebugLogEvents; + if (!shouldEmit) { + return; + } + global.dispatchEvent(new CustomEvent('lit-debug', { + detail: event, + })); + } + ; +// Used for connecting beginRender and endRender events when there are nested +// renders when errors are thrown preventing an endRender event from being +// called. +let debugLogRenderId = 0; +let issueWarning$1; +{ + global.litIssuedWarnings ??= new Set(); + // Issue a warning, if we haven't already. + issueWarning$1 = (code, warning) => { + warning += code + ? ` See https://lit.dev/msg/${code} for more information.` + : ''; + if (!global.litIssuedWarnings.has(warning)) { + console.warn(warning); + global.litIssuedWarnings.add(warning); + } + }; + issueWarning$1('dev-mode', `Lit is in dev mode. Not recommended for production!`); +} +const wrap = global.ShadyDOM?.inUse && + global.ShadyDOM?.noPatch === true + ? global.ShadyDOM.wrap + : (node) => node; +const trustedTypes = global.trustedTypes; +/** + * Our TrustedTypePolicy for HTML which is declared using the html template + * tag function. + * + * That HTML is a developer-authored constant, and is parsed with innerHTML + * before any untrusted expressions have been mixed in. Therefor it is + * considered safe by construction. + */ +const policy = trustedTypes + ? trustedTypes.createPolicy('lit-html', { + createHTML: (s) => s, + }) + : undefined; +const identityFunction = (value) => value; +const noopSanitizer = (_node, _name, _type) => identityFunction; +/** Sets the global sanitizer factory. */ +const setSanitizer = (newSanitizer) => { + if (sanitizerFactoryInternal !== noopSanitizer) { + throw new Error(`Attempted to overwrite existing lit-html security policy.` + + ` setSanitizeDOMValueFactory should be called at most once.`); + } + sanitizerFactoryInternal = newSanitizer; +}; +/** + * Only used in internal tests, not a part of the public API. + */ +const _testOnlyClearSanitizerFactoryDoNotCallOrElse = () => { + sanitizerFactoryInternal = noopSanitizer; +}; +const createSanitizer = (node, name, type) => { + return sanitizerFactoryInternal(node, name, type); +}; +// Added to an attribute name to mark the attribute as bound so we can find +// it easily. +const boundAttributeSuffix = '$lit$'; +// This marker is used in many syntactic positions in HTML, so it must be +// a valid element name and attribute name. We don't support dynamic names (yet) +// but this at least ensures that the parse tree is closer to the template +// intention. +const marker = `lit$${Math.random().toFixed(9).slice(2)}$`; +// String used to tell if a comment is a marker comment +const markerMatch = '?' + marker; +// Text used to insert a comment marker node. We use processing instruction +// syntax because it's slightly smaller, but parses as a comment node. +const nodeMarker = `<${markerMatch}>`; +const d = document; +// Creates a dynamic marker. We never have to search for these in the DOM. +const createMarker = () => d.createComment(''); +const isPrimitive = (value) => value === null || (typeof value != 'object' && typeof value != 'function'); +const isArray = Array.isArray; +const isIterable = (value) => isArray(value) || + // eslint-disable-next-line @typescript-eslint/no-explicit-any + typeof value?.[Symbol.iterator] === 'function'; +const SPACE_CHAR = `[ \t\n\f\r]`; +const ATTR_VALUE_CHAR = `[^ \t\n\f\r"'\`<>=]`; +const NAME_CHAR = `[^\\s"'>=/]`; +// These regexes represent the five parsing states that we care about in the +// Template's HTML scanner. They match the *end* of the state they're named +// after. +// Depending on the match, we transition to a new state. If there's no match, +// we stay in the same state. +// Note that the regexes are stateful. We utilize lastIndex and sync it +// across the multiple regexes used. In addition to the five regexes below +// we also dynamically create a regex to find the matching end tags for raw +// text elements. +/** + * End of text is: `<` followed by: + * (comment start) or (tag) or (dynamic tag binding) + */ +const textEndRegex = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g; +const COMMENT_START = 1; +const TAG_NAME = 2; +const DYNAMIC_TAG_NAME = 3; +const commentEndRegex = /-->/g; +/** + * Comments not started with + + + + + + + + + + + + + + +`; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ControlsPrompt = html ` + + + + + + + + + + + + + + + + + + +`; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ARGlyph = html ` + + + + + + + + + + + +`; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const templateResult = html ` + +
    + + + +
    + + + +
    + + + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    + +
    +
    + +
    + +
    + + +
    + + + +
    + + +
    +
    +
    + +
    `; +const makeTemplate = (shadowRoot) => { + render(templateResult, shadowRoot); +}; + +// This file is part of meshoptimizer library and is distributed under the terms of MIT License. +// Copyright (C) 2016-2022, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) +var MeshoptDecoder = (function() { + + // Built with clang version 14.0.4 + // Built from meshoptimizer 0.18 + var wasm_base = "b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq:P8Yqdbk;3sezu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfgocl4cifcd4hxdndndndnaoc9WGgmTmbcbhPcehsawcjdfhzalhHinaraH9Rax6midnaraHaxfgl9RcK6mbczhoinawcj;cbfaogifgoc9WfhOdndndndndnaHaic9WfgAco4fRbbaAci4coG4ciGPlbedibkaO9cb83ibaOcwf9cb83ibxikaOalRblalRbbgAco4gCaCciSgCE86bbaocGfalclfaCfgORbbaAcl4ciGgCaCciSgCE86bbaocVfaOaCfgORbbaAcd4ciGgCaCciSgCE86bbaoc7faOaCfgORbbaAciGgAaAciSgAE86bbaoctfaOaAfgARbbalRbegOco4gCaCciSgCE86bbaoc91faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc4faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc93faAaCfgARbbaOciGgOaOciSgOE86bbaoc94faAaOfgARbbalRbdgOco4gCaCciSgCE86bbaoc95faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc96faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc97faAaCfgARbbaOciGgOaOciSgOE86bbaoc98faAaOfgORbbalRbiglco4gAaAciSgAE86bbaoc99faOaAfgORbbalcl4ciGgAaAciSgAE86bbaoc9:faOaAfgORbbalcd4ciGgAaAciSgAE86bbaocufaOaAfgoRbbalciGglalciSglE86bbaoalfhlxdkaOalRbwalRbbgAcl4gCaCcsSgCE86bbaocGfalcwfaCfgORbbaAcsGgAaAcsSgAE86bbaocVfaOaAfgORbbalRbegAcl4gCaCcsSgCE86bbaoc7faOaCfgORbbaAcsGgAaAcsSgAE86bbaoctfaOaAfgORbbalRbdgAcl4gCaCcsSgCE86bbaoc91faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc4faOaAfgORbbalRbigAcl4gCaCcsSgCE86bbaoc93faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc94faOaAfgORbbalRblgAcl4gCaCcsSgCE86bbaoc95faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc96faOaAfgORbbalRbvgAcl4gCaCcsSgCE86bbaoc97faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc98faOaAfgORbbalRbogAcl4gCaCcsSgCE86bbaoc99faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc9:faOaAfgORbbalRbrglcl4gAaAcsSgAE86bbaocufaOaAfgoRbbalcsGglalcsSglE86bbaoalfhlxekaOal8Pbb83bbaOcwfalcwf8Pbb83bbalczfhlkdnaiam9pmbaiczfhoaral9RcL0mekkaiam6mialTmidnakTmbawaPfRbbhOcbhoazhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkkazcefhzaPcefgPad6hsalhHaPad9hmexvkkcbhlasceGmdxikalaxad2fhCdnakTmbcbhHcehsawcjdfhminaral9Rax6mialTmdalaxfhlawaHfRbbhOcbhoamhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkamcefhmaHcefgHad6hsaHad9hmbkaChlxikcbhocehsinaral9Rax6mdalTmealaxfhlaocefgoad6hsadao9hmbkaChlxdkcbhlasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqalmbkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;yzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabavcefciGaiVcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabavcdfciGaiVcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabavcufciGaiVcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabavciGaiVcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2geTmbinababydbgdcwtcw91:Yadce91cjjj;8ifcjjj98G::NUdbabclfhbaecufgembkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaiczfhiaeczfheadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb"; + var wasm_simd = "b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;t9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;h8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincehHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAci6hHalhOaAcefgohAaoclSmdxekkcbhlaHceGmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;uzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:EPliuo97eue978Jjjjjbca9Rhidndnadcl9hmbdnaec98GglTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaiaeciGgvcdtgdVcbczad9R;8kbaiabalcdtfglad;8qbbdnavTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkalaiad;8qbbskdnaec98GgxTmbcbhvabhdinadczfglalpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgvax6mbkkaxae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabaxcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbhdabheinaeaepbbbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepkbbaeczfheadclfgdav6mbkkdnaval9pmbaialciGgdcdtgeVcbc;abae9R;8kbaiabavcdtfgvae;8qbbdnadTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepklbkavaiae;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb"; + + var detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]); + var wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]); + + if (typeof WebAssembly !== 'object') { + return { + supported: false, + }; + } + + var wasm = WebAssembly.validate(detector) ? wasm_simd : wasm_base; + + var instance; + + var ready = + WebAssembly.instantiate(unpack(wasm), {}) + .then(function(result) { + instance = result.instance; + instance.exports.__wasm_call_ctors(); + }); + + function unpack(data) { + var result = new Uint8Array(data.length); + for (var i = 0; i < data.length; ++i) { + var ch = data.charCodeAt(i); + result[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4; + } + var write = 0; + for (var i = 0; i < data.length; ++i) { + result[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i]; + } + return result.buffer.slice(0, write); + } + + function decode(fun, target, count, size, source, filter) { + var sbrk = instance.exports.sbrk; + var count4 = (count + 3) & -4; + var tp = sbrk(count4 * size); + var sp = sbrk(source.length); + var heap = new Uint8Array(instance.exports.memory.buffer); + heap.set(source, sp); + var res = fun(tp, count, size, sp, source.length); + if (res == 0 && filter) { + filter(tp, count4, size); + } + target.set(heap.subarray(tp, tp + count * size)); + sbrk(tp - sbrk(0)); + if (res != 0) { + throw new Error("Malformed buffer data: " + res); + } + } + + var filters = { + NONE: "", + OCTAHEDRAL: "meshopt_decodeFilterOct", + QUATERNION: "meshopt_decodeFilterQuat", + EXPONENTIAL: "meshopt_decodeFilterExp", + }; + + var decoders = { + ATTRIBUTES: "meshopt_decodeVertexBuffer", + TRIANGLES: "meshopt_decodeIndexBuffer", + INDICES: "meshopt_decodeIndexSequence", + }; + + var workers = []; + var requestId = 0; + + function createWorker(url) { + var worker = { + object: new Worker(url), + pending: 0, + requests: {} + }; + + worker.object.onmessage = function(event) { + var data = event.data; + + worker.pending -= data.count; + worker.requests[data.id][data.action](data.value); + + delete worker.requests[data.id]; + }; + + return worker; + } + + function initWorkers(count) { + var source = + "var instance; var ready = WebAssembly.instantiate(new Uint8Array([" + new Uint8Array(unpack(wasm)) + "]), {})" + + ".then(function(result) { instance = result.instance; instance.exports.__wasm_call_ctors(); });" + + "self.onmessage = workerProcess;" + + decode.toString() + workerProcess.toString(); + + var blob = new Blob([source], {type: 'text/javascript'}); + var url = URL.createObjectURL(blob); + + for (var i = 0; i < count; ++i) { + workers[i] = createWorker(url); + } + + URL.revokeObjectURL(url); + } + + function decodeWorker(count, size, source, mode, filter) { + var worker = workers[0]; + + for (var i = 1; i < workers.length; ++i) { + if (workers[i].pending < worker.pending) { + worker = workers[i]; + } + } + + return new Promise(function (resolve, reject) { + var data = new Uint8Array(source); + var id = requestId++; + + worker.pending += count; + worker.requests[id] = { resolve: resolve, reject: reject }; + worker.object.postMessage({ id: id, count: count, size: size, source: data, mode: mode, filter: filter }, [ data.buffer ]); + }); + } + + function workerProcess(event) { + ready.then(function() { + var data = event.data; + try { + var target = new Uint8Array(data.count * data.size); + decode(instance.exports[data.mode], target, data.count, data.size, data.source, instance.exports[data.filter]); + self.postMessage({ id: data.id, count: data.count, action: "resolve", value: target }, [ target.buffer ]); + } catch (error) { + self.postMessage({ id: data.id, count: data.count, action: "reject", value: error }); + } + }); + } + + return { + ready: ready, + supported: true, + useWorkers: function(count) { + initWorkers(count); + }, + decodeVertexBuffer: function(target, count, size, source, filter) { + decode(instance.exports.meshopt_decodeVertexBuffer, target, count, size, source, instance.exports[filters[filter]]); + }, + decodeIndexBuffer: function(target, count, size, source) { + decode(instance.exports.meshopt_decodeIndexBuffer, target, count, size, source); + }, + decodeIndexSequence: function(target, count, size, source) { + decode(instance.exports.meshopt_decodeIndexSequence, target, count, size, source); + }, + decodeGltfBuffer: function(target, count, size, source, mode, filter) { + decode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]); + }, + decodeGltfBufferAsync: function(count, size, source, mode, filter) { + if (workers.length > 0) { + return decodeWorker(count, size, source, decoders[mode], filters[filter]); + } + + return ready.then(function() { + var target = new Uint8Array(count * size); + decode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]); + return target; + }); + } + }; +})(); + +const _taskCache$1 = new WeakMap(); + +class DRACOLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.decoderPath = ''; + this.decoderConfig = {}; + this.decoderBinary = null; + this.decoderPending = null; + + this.workerLimit = 4; + this.workerPool = []; + this.workerNextTaskID = 1; + this.workerSourceURL = ''; + + this.defaultAttributeIDs = { + position: 'POSITION', + normal: 'NORMAL', + color: 'COLOR', + uv: 'TEX_COORD' + }; + this.defaultAttributeTypes = { + position: 'Float32Array', + normal: 'Float32Array', + color: 'Float32Array', + uv: 'Float32Array' + }; + + } + + setDecoderPath( path ) { + + this.decoderPath = path; + + return this; + + } + + setDecoderConfig( config ) { + + this.decoderConfig = config; + + return this; + + } + + setWorkerLimit( workerLimit ) { + + this.workerLimit = workerLimit; + + return this; + + } + + load( url, onLoad, onProgress, onError ) { + + const loader = new FileLoader( this.manager ); + + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + + loader.load( url, ( buffer ) => { + + this.parse( buffer, onLoad, onError ); + + }, onProgress, onError ); + + } + + + parse( buffer, onLoad, onError = ()=>{} ) { + + this.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace, onError ).catch( onError ); + + } + + decodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) { + + const taskConfig = { + attributeIDs: attributeIDs || this.defaultAttributeIDs, + attributeTypes: attributeTypes || this.defaultAttributeTypes, + useUniqueIDs: !! attributeIDs, + vertexColorSpace: vertexColorSpace, + }; + + return this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError ); + + } + + decodeGeometry( buffer, taskConfig ) { + + const taskKey = JSON.stringify( taskConfig ); + + // Check for an existing task using this buffer. A transferred buffer cannot be transferred + // again from this thread. + if ( _taskCache$1.has( buffer ) ) { + + const cachedTask = _taskCache$1.get( buffer ); + + if ( cachedTask.key === taskKey ) { + + return cachedTask.promise; + + } else if ( buffer.byteLength === 0 ) { + + // Technically, it would be possible to wait for the previous task to complete, + // transfer the buffer back, and decode again with the second configuration. That + // is complex, and I don't know of any reason to decode a Draco buffer twice in + // different ways, so this is left unimplemented. + throw new Error( + + 'THREE.DRACOLoader: Unable to re-decode a buffer with different ' + + 'settings. Buffer has already been transferred.' + + ); + + } + + } + + // + + let worker; + const taskID = this.workerNextTaskID ++; + const taskCost = buffer.byteLength; + + // Obtain a worker and assign a task, and construct a geometry instance + // when the task completes. + const geometryPending = this._getWorker( taskID, taskCost ) + .then( ( _worker ) => { + + worker = _worker; + + return new Promise( ( resolve, reject ) => { + + worker._callbacks[ taskID ] = { resolve, reject }; + + worker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] ); + + // this.debug(); + + } ); + + } ) + .then( ( message ) => this._createGeometry( message.geometry ) ); + + // Remove task from the task list. + // Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416) + geometryPending + .catch( () => true ) + .then( () => { + + if ( worker && taskID ) { + + this._releaseTask( worker, taskID ); + + // this.debug(); + + } + + } ); + + // Cache the task result. + _taskCache$1.set( buffer, { + + key: taskKey, + promise: geometryPending + + } ); + + return geometryPending; + + } + + _createGeometry( geometryData ) { + + const geometry = new BufferGeometry(); + + if ( geometryData.index ) { + + geometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) ); + + } + + for ( let i = 0; i < geometryData.attributes.length; i ++ ) { + + const result = geometryData.attributes[ i ]; + const name = result.name; + const array = result.array; + const itemSize = result.itemSize; + + const attribute = new BufferAttribute( array, itemSize ); + + if ( name === 'color' ) { + + this._assignVertexColorSpace( attribute, result.vertexColorSpace ); + + attribute.normalized = ( array instanceof Float32Array ) === false; + + } + + geometry.setAttribute( name, attribute ); + + } + + return geometry; + + } + + _assignVertexColorSpace( attribute, inputColorSpace ) { + + // While .drc files do not specify colorspace, the only 'official' tooling + // is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc + // file is passed into .load() or .parse(). GLTFLoader uses internal APIs + // to decode geometry, and vertex colors are already Linear-sRGB in there. + + if ( inputColorSpace !== SRGBColorSpace ) return; + + const _color = new Color(); + + for ( let i = 0, il = attribute.count; i < il; i ++ ) { + + _color.fromBufferAttribute( attribute, i ); + ColorManagement.toWorkingColorSpace( _color, SRGBColorSpace ); + attribute.setXYZ( i, _color.r, _color.g, _color.b ); + + } + + } + + _loadLibrary( url, responseType ) { + + const loader = new FileLoader( this.manager ); + loader.setPath( this.decoderPath ); + loader.setResponseType( responseType ); + loader.setWithCredentials( this.withCredentials ); + + return new Promise( ( resolve, reject ) => { + + loader.load( url, resolve, undefined, reject ); + + } ); + + } + + preload() { + + this._initDecoder(); + + return this; + + } + + _initDecoder() { + + if ( this.decoderPending ) return this.decoderPending; + + const useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js'; + const librariesPending = []; + + if ( useJS ) { + + librariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) ); + + } else { + + librariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) ); + librariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) ); + + } + + this.decoderPending = Promise.all( librariesPending ) + .then( ( libraries ) => { + + const jsContent = libraries[ 0 ]; + + if ( ! useJS ) { + + this.decoderConfig.wasmBinary = libraries[ 1 ]; + + } + + const fn = DRACOWorker.toString(); + + const body = [ + '/* draco decoder */', + jsContent, + '', + '/* worker */', + fn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) ) + ].join( '\n' ); + + this.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) ); + + } ); + + return this.decoderPending; + + } + + _getWorker( taskID, taskCost ) { + + return this._initDecoder().then( () => { + + if ( this.workerPool.length < this.workerLimit ) { + + const worker = new Worker( this.workerSourceURL ); + + worker._callbacks = {}; + worker._taskCosts = {}; + worker._taskLoad = 0; + + worker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } ); + + worker.onmessage = function ( e ) { + + const message = e.data; + + switch ( message.type ) { + + case 'decode': + worker._callbacks[ message.id ].resolve( message ); + break; + + case 'error': + worker._callbacks[ message.id ].reject( message ); + break; + + default: + console.error( 'THREE.DRACOLoader: Unexpected message, "' + message.type + '"' ); + + } + + }; + + this.workerPool.push( worker ); + + } else { + + this.workerPool.sort( function ( a, b ) { + + return a._taskLoad > b._taskLoad ? -1 : 1; + + } ); + + } + + const worker = this.workerPool[ this.workerPool.length - 1 ]; + worker._taskCosts[ taskID ] = taskCost; + worker._taskLoad += taskCost; + return worker; + + } ); + + } + + _releaseTask( worker, taskID ) { + + worker._taskLoad -= worker._taskCosts[ taskID ]; + delete worker._callbacks[ taskID ]; + delete worker._taskCosts[ taskID ]; + + } + + debug() { + + console.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) ); + + } + + dispose() { + + for ( let i = 0; i < this.workerPool.length; ++ i ) { + + this.workerPool[ i ].terminate(); + + } + + this.workerPool.length = 0; + + if ( this.workerSourceURL !== '' ) { + + URL.revokeObjectURL( this.workerSourceURL ); + + } + + return this; + + } + +} + +/* WEB WORKER */ + +function DRACOWorker() { + + let decoderConfig; + let decoderPending; + + onmessage = function ( e ) { + + const message = e.data; + + switch ( message.type ) { + + case 'init': + decoderConfig = message.decoderConfig; + decoderPending = new Promise( function ( resolve/*, reject*/ ) { + + decoderConfig.onModuleLoaded = function ( draco ) { + + // Module is Promise-like. Wrap before resolving to avoid loop. + resolve( { draco: draco } ); + + }; + + DracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef + + } ); + break; + + case 'decode': + const buffer = message.buffer; + const taskConfig = message.taskConfig; + decoderPending.then( ( module ) => { + + const draco = module.draco; + const decoder = new draco.Decoder(); + + try { + + const geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig ); + + const buffers = geometry.attributes.map( ( attr ) => attr.array.buffer ); + + if ( geometry.index ) buffers.push( geometry.index.array.buffer ); + + self.postMessage( { type: 'decode', id: message.id, geometry }, buffers ); + + } catch ( error ) { + + console.error( error ); + + self.postMessage( { type: 'error', id: message.id, error: error.message } ); + + } finally { + + draco.destroy( decoder ); + + } + + } ); + break; + + } + + }; + + function decodeGeometry( draco, decoder, array, taskConfig ) { + + const attributeIDs = taskConfig.attributeIDs; + const attributeTypes = taskConfig.attributeTypes; + + let dracoGeometry; + let decodingStatus; + + const geometryType = decoder.GetEncodedGeometryType( array ); + + if ( geometryType === draco.TRIANGULAR_MESH ) { + + dracoGeometry = new draco.Mesh(); + decodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry ); + + } else if ( geometryType === draco.POINT_CLOUD ) { + + dracoGeometry = new draco.PointCloud(); + decodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry ); + + } else { + + throw new Error( 'THREE.DRACOLoader: Unexpected geometry type.' ); + + } + + if ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) { + + throw new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() ); + + } + + const geometry = { index: null, attributes: [] }; + + // Gather all vertex attributes. + for ( const attributeName in attributeIDs ) { + + const attributeType = self[ attributeTypes[ attributeName ] ]; + + let attribute; + let attributeID; + + // A Draco file may be created with default vertex attributes, whose attribute IDs + // are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively, + // a Draco file may contain a custom set of attributes, identified by known unique + // IDs. glTF files always do the latter, and `.drc` files typically do the former. + if ( taskConfig.useUniqueIDs ) { + + attributeID = attributeIDs[ attributeName ]; + attribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID ); + + } else { + + attributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] ); + + if ( attributeID === -1 ) continue; + + attribute = decoder.GetAttribute( dracoGeometry, attributeID ); + + } + + const attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ); + + if ( attributeName === 'color' ) { + + attributeResult.vertexColorSpace = taskConfig.vertexColorSpace; + + } + + geometry.attributes.push( attributeResult ); + + } + + // Add index. + if ( geometryType === draco.TRIANGULAR_MESH ) { + + geometry.index = decodeIndex( draco, decoder, dracoGeometry ); + + } + + draco.destroy( dracoGeometry ); + + return geometry; + + } + + function decodeIndex( draco, decoder, dracoGeometry ) { + + const numFaces = dracoGeometry.num_faces(); + const numIndices = numFaces * 3; + const byteLength = numIndices * 4; + + const ptr = draco._malloc( byteLength ); + decoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr ); + const index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice(); + draco._free( ptr ); + + return { array: index, itemSize: 1 }; + + } + + function decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) { + + const numComponents = attribute.num_components(); + const numPoints = dracoGeometry.num_points(); + const numValues = numPoints * numComponents; + const byteLength = numValues * attributeType.BYTES_PER_ELEMENT; + const dataType = getDracoDataType( draco, attributeType ); + + const ptr = draco._malloc( byteLength ); + decoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr ); + const array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice(); + draco._free( ptr ); + + return { + name: attributeName, + array: array, + itemSize: numComponents + }; + + } + + function getDracoDataType( draco, attributeType ) { + + switch ( attributeType ) { + + case Float32Array: return draco.DT_FLOAT32; + case Int8Array: return draco.DT_INT8; + case Int16Array: return draco.DT_INT16; + case Int32Array: return draco.DT_INT32; + case Uint8Array: return draco.DT_UINT8; + case Uint16Array: return draco.DT_UINT16; + case Uint32Array: return draco.DT_UINT32; + + } + + } + +} + +/** + * @param {BufferGeometry} geometry + * @param {number} drawMode + * @return {BufferGeometry} + */ +function toTrianglesDrawMode( geometry, drawMode ) { + + if ( drawMode === TrianglesDrawMode ) { + + console.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' ); + return geometry; + + } + + if ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) { + + let index = geometry.getIndex(); + + // generate index if not present + + if ( index === null ) { + + const indices = []; + + const position = geometry.getAttribute( 'position' ); + + if ( position !== undefined ) { + + for ( let i = 0; i < position.count; i ++ ) { + + indices.push( i ); + + } + + geometry.setIndex( indices ); + index = geometry.getIndex(); + + } else { + + console.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' ); + return geometry; + + } + + } + + // + + const numberOfTriangles = index.count - 2; + const newIndices = []; + + if ( drawMode === TriangleFanDrawMode ) { + + // gl.TRIANGLE_FAN + + for ( let i = 1; i <= numberOfTriangles; i ++ ) { + + newIndices.push( index.getX( 0 ) ); + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + + } + + } else { + + // gl.TRIANGLE_STRIP + + for ( let i = 0; i < numberOfTriangles; i ++ ) { + + if ( i % 2 === 0 ) { + + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i + 2 ) ); + + } else { + + newIndices.push( index.getX( i + 2 ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i ) ); + + } + + } + + } + + if ( ( newIndices.length / 3 ) !== numberOfTriangles ) { + + console.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' ); + + } + + // build final geometry + + const newGeometry = geometry.clone(); + newGeometry.setIndex( newIndices ); + newGeometry.clearGroups(); + + return newGeometry; + + } else { + + console.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode ); + return geometry; + + } + +} + +class GLTFLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.dracoLoader = null; + this.ktx2Loader = null; + this.meshoptDecoder = null; + + this.pluginCallbacks = []; + + this.register( function ( parser ) { + + return new GLTFMaterialsClearcoatExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsDispersionExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureBasisUExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureWebPExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureAVIFExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsSheenExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsTransmissionExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsVolumeExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsIorExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsEmissiveStrengthExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsSpecularExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsIridescenceExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsAnisotropyExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsBumpExtension$1( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFLightsExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMeshoptCompression( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMeshGpuInstancing$1( parser ); + + } ); + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + let resourcePath; + + if ( this.resourcePath !== '' ) { + + resourcePath = this.resourcePath; + + } else if ( this.path !== '' ) { + + // If a base path is set, resources will be relative paths from that plus the relative path of the gltf file + // Example path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf' + // resourcePath = 'https://my-cnd-server.com/assets/models/' + // referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin' + // referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png' + const relativeUrl = LoaderUtils.extractUrlBase( url ); + resourcePath = LoaderUtils.resolveURL( relativeUrl, this.path ); + + } else { + + resourcePath = LoaderUtils.extractUrlBase( url ); + + } + + // Tells the LoadingManager to track an extra item, which resolves after + // the model is fully loaded. This means the count of items loaded will + // be incorrect, but ensures manager.onLoad() does not fire early. + this.manager.itemStart( url ); + + const _onError = function ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + }; + + const loader = new FileLoader( this.manager ); + + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + + loader.load( url, function ( data ) { + + try { + + scope.parse( data, resourcePath, function ( gltf ) { + + onLoad( gltf ); + + scope.manager.itemEnd( url ); + + }, _onError ); + + } catch ( e ) { + + _onError( e ); + + } + + }, onProgress, _onError ); + + } + + setDRACOLoader( dracoLoader ) { + + this.dracoLoader = dracoLoader; + return this; + + } + + setKTX2Loader( ktx2Loader ) { + + this.ktx2Loader = ktx2Loader; + return this; + + } + + setMeshoptDecoder( meshoptDecoder ) { + + this.meshoptDecoder = meshoptDecoder; + return this; + + } + + register( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) === -1 ) { + + this.pluginCallbacks.push( callback ); + + } + + return this; + + } + + unregister( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) !== -1 ) { + + this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 ); + + } + + return this; + + } + + parse( data, path, onLoad, onError ) { + + let json; + const extensions = {}; + const plugins = {}; + const textDecoder = new TextDecoder(); + + if ( typeof data === 'string' ) { + + json = JSON.parse( data ); + + } else if ( data instanceof ArrayBuffer ) { + + const magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) ); + + if ( magic === BINARY_EXTENSION_HEADER_MAGIC ) { + + try { + + extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data ); + + } catch ( error ) { + + if ( onError ) onError( error ); + return; + + } + + json = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content ); + + } else { + + json = JSON.parse( textDecoder.decode( data ) ); + + } + + } else { + + json = data; + + } + + if ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) { + + if ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) ); + return; + + } + + const parser = new GLTFParser( json, { + + path: path || this.resourcePath || '', + crossOrigin: this.crossOrigin, + requestHeader: this.requestHeader, + manager: this.manager, + ktx2Loader: this.ktx2Loader, + meshoptDecoder: this.meshoptDecoder + + } ); + + parser.fileLoader.setRequestHeader( this.requestHeader ); + + for ( let i = 0; i < this.pluginCallbacks.length; i ++ ) { + + const plugin = this.pluginCallbacks[ i ]( parser ); + + if ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' ); + + plugins[ plugin.name ] = plugin; + + // Workaround to avoid determining as unknown extension + // in addUnknownExtensionsToUserData(). + // Remove this workaround if we move all the existing + // extension handlers to plugin system + extensions[ plugin.name ] = true; + + } + + if ( json.extensionsUsed ) { + + for ( let i = 0; i < json.extensionsUsed.length; ++ i ) { + + const extensionName = json.extensionsUsed[ i ]; + const extensionsRequired = json.extensionsRequired || []; + + switch ( extensionName ) { + + case EXTENSIONS.KHR_MATERIALS_UNLIT: + extensions[ extensionName ] = new GLTFMaterialsUnlitExtension$1(); + break; + + case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: + extensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader ); + break; + + case EXTENSIONS.KHR_TEXTURE_TRANSFORM: + extensions[ extensionName ] = new GLTFTextureTransformExtension(); + break; + + case EXTENSIONS.KHR_MESH_QUANTIZATION: + extensions[ extensionName ] = new GLTFMeshQuantizationExtension(); + break; + + default: + + if ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) { + + console.warn( 'THREE.GLTFLoader: Unknown extension "' + extensionName + '".' ); + + } + + } + + } + + } + + parser.setExtensions( extensions ); + parser.setPlugins( plugins ); + parser.parse( onLoad, onError ); + + } + + parseAsync( data, path ) { + + const scope = this; + + return new Promise( function ( resolve, reject ) { + + scope.parse( data, path, resolve, reject ); + + } ); + + } + +} + +/* GLTFREGISTRY */ + +function GLTFRegistry() { + + let objects = {}; + + return { + + get: function ( key ) { + + return objects[ key ]; + + }, + + add: function ( key, object ) { + + objects[ key ] = object; + + }, + + remove: function ( key ) { + + delete objects[ key ]; + + }, + + removeAll: function () { + + objects = {}; + + } + + }; + +} + +/*********************************/ +/********** EXTENSIONS ***********/ +/*********************************/ + +const EXTENSIONS = { + KHR_BINARY_GLTF: 'KHR_binary_glTF', + KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', + KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual', + KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat', + KHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion', + KHR_MATERIALS_IOR: 'KHR_materials_ior', + KHR_MATERIALS_SHEEN: 'KHR_materials_sheen', + KHR_MATERIALS_SPECULAR: 'KHR_materials_specular', + KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission', + KHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence', + KHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy', + KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', + KHR_MATERIALS_VOLUME: 'KHR_materials_volume', + KHR_TEXTURE_BASISU: 'KHR_texture_basisu', + KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform', + KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization', + KHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength', + EXT_MATERIALS_BUMP: 'EXT_materials_bump', + EXT_TEXTURE_WEBP: 'EXT_texture_webp', + EXT_TEXTURE_AVIF: 'EXT_texture_avif', + EXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression', + EXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing' +}; + +/** + * Punctual Lights Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual + */ +class GLTFLightsExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; + + // Object3D instance caches + this.cache = { refs: {}, uses: {} }; + + } + + _markDefs() { + + const parser = this.parser; + const nodeDefs = this.parser.json.nodes || []; + + for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + const nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.extensions + && nodeDef.extensions[ this.name ] + && nodeDef.extensions[ this.name ].light !== undefined ) { + + parser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light ); + + } + + } + + } + + _loadLight( lightIndex ) { + + const parser = this.parser; + const cacheKey = 'light:' + lightIndex; + let dependency = parser.cache.get( cacheKey ); + + if ( dependency ) return dependency; + + const json = parser.json; + const extensions = ( json.extensions && json.extensions[ this.name ] ) || {}; + const lightDefs = extensions.lights || []; + const lightDef = lightDefs[ lightIndex ]; + let lightNode; + + const color = new Color( 0xffffff ); + + if ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace ); + + const range = lightDef.range !== undefined ? lightDef.range : 0; + + switch ( lightDef.type ) { + + case 'directional': + lightNode = new DirectionalLight( color ); + lightNode.target.position.set( 0, 0, -1 ); + lightNode.add( lightNode.target ); + break; + + case 'point': + lightNode = new PointLight( color ); + lightNode.distance = range; + break; + + case 'spot': + lightNode = new SpotLight( color ); + lightNode.distance = range; + // Handle spotlight properties. + lightDef.spot = lightDef.spot || {}; + lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0; + lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0; + lightNode.angle = lightDef.spot.outerConeAngle; + lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; + lightNode.target.position.set( 0, 0, -1 ); + lightNode.add( lightNode.target ); + break; + + default: + throw new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type ); + + } + + // Some lights (e.g. spot) default to a position other than the origin. Reset the position + // here, because node-level parsing will only override position if explicitly specified. + lightNode.position.set( 0, 0, 0 ); + + assignExtrasToUserData( lightNode, lightDef ); + + if ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity; + + lightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) ); + + dependency = Promise.resolve( lightNode ); + + parser.cache.add( cacheKey, dependency ); + + return dependency; + + } + + getDependency( type, index ) { + + if ( type !== 'light' ) return; + + return this._loadLight( index ); + + } + + createNodeAttachment( nodeIndex ) { + + const self = this; + const parser = this.parser; + const json = parser.json; + const nodeDef = json.nodes[ nodeIndex ]; + const lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {}; + const lightIndex = lightDef.light; + + if ( lightIndex === undefined ) return null; + + return this._loadLight( lightIndex ).then( function ( light ) { + + return parser._getNodeRef( self.cache, lightIndex, light ); + + } ); + + } + +} + +/** + * Unlit Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit + */ +let GLTFMaterialsUnlitExtension$1 = class GLTFMaterialsUnlitExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + + } + + getMaterialType() { + + return MeshBasicMaterial; + + } + + extendParams( materialParams, materialDef, parser ) { + + const pending = []; + + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + const metallicRoughness = materialDef.pbrMetallicRoughness; + + if ( metallicRoughness ) { + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + const array = metallicRoughness.baseColorFactor; + + materialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) ); + + } + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Materials Emissive Strength Extension + * + * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md + */ +let GLTFMaterialsEmissiveStrengthExtension$1 = class GLTFMaterialsEmissiveStrengthExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength; + + if ( emissiveStrength !== undefined ) { + + materialParams.emissiveIntensity = emissiveStrength; + + } + + return Promise.resolve(); + + } + +}; + +/** + * Clearcoat Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat + */ +let GLTFMaterialsClearcoatExtension$1 = class GLTFMaterialsClearcoatExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.clearcoatFactor !== undefined ) { + + materialParams.clearcoat = extension.clearcoatFactor; + + } + + if ( extension.clearcoatTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) ); + + } + + if ( extension.clearcoatRoughnessFactor !== undefined ) { + + materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; + + } + + if ( extension.clearcoatRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) ); + + } + + if ( extension.clearcoatNormalTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) ); + + if ( extension.clearcoatNormalTexture.scale !== undefined ) { + + const scale = extension.clearcoatNormalTexture.scale; + + materialParams.clearcoatNormalScale = new Vector2( scale, scale ); + + } + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Materials dispersion Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion + */ +let GLTFMaterialsDispersionExtension$1 = class GLTFMaterialsDispersionExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_DISPERSION; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const extension = materialDef.extensions[ this.name ]; + + materialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0; + + return Promise.resolve(); + + } + +}; + +/** + * Iridescence Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence + */ +let GLTFMaterialsIridescenceExtension$1 = class GLTFMaterialsIridescenceExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.iridescenceFactor !== undefined ) { + + materialParams.iridescence = extension.iridescenceFactor; + + } + + if ( extension.iridescenceTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) ); + + } + + if ( extension.iridescenceIor !== undefined ) { + + materialParams.iridescenceIOR = extension.iridescenceIor; + + } + + if ( materialParams.iridescenceThicknessRange === undefined ) { + + materialParams.iridescenceThicknessRange = [ 100, 400 ]; + + } + + if ( extension.iridescenceThicknessMinimum !== undefined ) { + + materialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum; + + } + + if ( extension.iridescenceThicknessMaximum !== undefined ) { + + materialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum; + + } + + if ( extension.iridescenceThicknessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Sheen Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen + */ +let GLTFMaterialsSheenExtension$1 = class GLTFMaterialsSheenExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_SHEEN; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + materialParams.sheenColor = new Color( 0, 0, 0 ); + materialParams.sheenRoughness = 0; + materialParams.sheen = 1; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.sheenColorFactor !== undefined ) { + + const colorFactor = extension.sheenColorFactor; + materialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace ); + + } + + if ( extension.sheenRoughnessFactor !== undefined ) { + + materialParams.sheenRoughness = extension.sheenRoughnessFactor; + + } + + if ( extension.sheenColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) ); + + } + + if ( extension.sheenRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Transmission Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission + * Draft: https://github.com/KhronosGroup/glTF/pull/1698 + */ +let GLTFMaterialsTransmissionExtension$1 = class GLTFMaterialsTransmissionExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.transmissionFactor !== undefined ) { + + materialParams.transmission = extension.transmissionFactor; + + } + + if ( extension.transmissionTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Materials Volume Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume + */ +let GLTFMaterialsVolumeExtension$1 = class GLTFMaterialsVolumeExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_VOLUME; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + materialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0; + + if ( extension.thicknessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) ); + + } + + materialParams.attenuationDistance = extension.attenuationDistance || Infinity; + + const colorArray = extension.attenuationColor || [ 1, 1, 1 ]; + materialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace ); + + return Promise.all( pending ); + + } + +}; + +/** + * Materials ior Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior + */ +let GLTFMaterialsIorExtension$1 = class GLTFMaterialsIorExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_IOR; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const extension = materialDef.extensions[ this.name ]; + + materialParams.ior = extension.ior !== undefined ? extension.ior : 1.5; + + return Promise.resolve(); + + } + +}; + +/** + * Materials specular Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular + */ +let GLTFMaterialsSpecularExtension$1 = class GLTFMaterialsSpecularExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_SPECULAR; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + materialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0; + + if ( extension.specularTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) ); + + } + + const colorArray = extension.specularColorFactor || [ 1, 1, 1 ]; + materialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace ); + + if ( extension.specularColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) ); + + } + + return Promise.all( pending ); + + } + +}; + + +/** + * Materials bump Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump + */ +let GLTFMaterialsBumpExtension$1 = class GLTFMaterialsBumpExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.EXT_MATERIALS_BUMP; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + materialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0; + + if ( extension.bumpTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * Materials anisotropy Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy + */ +let GLTFMaterialsAnisotropyExtension$1 = class GLTFMaterialsAnisotropyExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY; + + } + + getMaterialType( materialIndex ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return MeshPhysicalMaterial; + + } + + extendMaterialParams( materialIndex, materialParams ) { + + const parser = this.parser; + const materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + const pending = []; + + const extension = materialDef.extensions[ this.name ]; + + if ( extension.anisotropyStrength !== undefined ) { + + materialParams.anisotropy = extension.anisotropyStrength; + + } + + if ( extension.anisotropyRotation !== undefined ) { + + materialParams.anisotropyRotation = extension.anisotropyRotation; + + } + + if ( extension.anisotropyTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) ); + + } + + return Promise.all( pending ); + + } + +}; + +/** + * BasisU Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu + */ +class GLTFTextureBasisUExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_TEXTURE_BASISU; + + } + + loadTexture( textureIndex ) { + + const parser = this.parser; + const json = parser.json; + + const textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) { + + return null; + + } + + const extension = textureDef.extensions[ this.name ]; + const loader = parser.options.ktx2Loader; + + if ( ! loader ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' ); + + } else { + + // Assumes that the extension is optional and that a fallback texture is present + return null; + + } + + } + + return parser.loadTextureImage( textureIndex, extension.source, loader ); + + } + +} + +/** + * WebP Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp + */ +class GLTFTextureWebPExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.EXT_TEXTURE_WEBP; + this.isSupported = null; + + } + + loadTexture( textureIndex ) { + + const name = this.name; + const parser = this.parser; + const json = parser.json; + + const textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) { + + return null; + + } + + const extension = textureDef.extensions[ name ]; + const source = json.images[ extension.source ]; + + let loader = parser.textureLoader; + if ( source.uri ) { + + const handler = parser.options.manager.getHandler( source.uri ); + if ( handler !== null ) loader = handler; + + } + + return this.detectSupport().then( function ( isSupported ) { + + if ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader ); + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' ); + + } + + // Fall back to PNG or JPEG. + return parser.loadTexture( textureIndex ); + + } ); + + } + + detectSupport() { + + if ( ! this.isSupported ) { + + this.isSupported = new Promise( function ( resolve ) { + + const image = new Image(); + + // Lossy test image. Support for lossy images doesn't guarantee support for all + // WebP images, unfortunately. + image.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'; + + image.onload = image.onerror = function () { + + resolve( image.height === 1 ); + + }; + + } ); + + } + + return this.isSupported; + + } + +} + +/** + * AVIF Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif + */ +class GLTFTextureAVIFExtension { + + constructor( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.EXT_TEXTURE_AVIF; + this.isSupported = null; + + } + + loadTexture( textureIndex ) { + + const name = this.name; + const parser = this.parser; + const json = parser.json; + + const textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) { + + return null; + + } + + const extension = textureDef.extensions[ name ]; + const source = json.images[ extension.source ]; + + let loader = parser.textureLoader; + if ( source.uri ) { + + const handler = parser.options.manager.getHandler( source.uri ); + if ( handler !== null ) loader = handler; + + } + + return this.detectSupport().then( function ( isSupported ) { + + if ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader ); + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' ); + + } + + // Fall back to PNG or JPEG. + return parser.loadTexture( textureIndex ); + + } ); + + } + + detectSupport() { + + if ( ! this.isSupported ) { + + this.isSupported = new Promise( function ( resolve ) { + + const image = new Image(); + + // Lossy test image. + image.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI='; + image.onload = image.onerror = function () { + + resolve( image.height === 1 ); + + }; + + } ); + + } + + return this.isSupported; + + } + +} + +/** + * meshopt BufferView Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression + */ +class GLTFMeshoptCompression { + + constructor( parser ) { + + this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; + this.parser = parser; + + } + + loadBufferView( index ) { + + const json = this.parser.json; + const bufferView = json.bufferViews[ index ]; + + if ( bufferView.extensions && bufferView.extensions[ this.name ] ) { + + const extensionDef = bufferView.extensions[ this.name ]; + + const buffer = this.parser.getDependency( 'buffer', extensionDef.buffer ); + const decoder = this.parser.options.meshoptDecoder; + + if ( ! decoder || ! decoder.supported ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' ); + + } else { + + // Assumes that the extension is optional and that fallback buffer data is present + return null; + + } + + } + + return buffer.then( function ( res ) { + + const byteOffset = extensionDef.byteOffset || 0; + const byteLength = extensionDef.byteLength || 0; + + const count = extensionDef.count; + const stride = extensionDef.byteStride; + + const source = new Uint8Array( res, byteOffset, byteLength ); + + if ( decoder.decodeGltfBufferAsync ) { + + return decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) { + + return res.buffer; + + } ); + + } else { + + // Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync + return decoder.ready.then( function () { + + const result = new ArrayBuffer( count * stride ); + decoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter ); + return result; + + } ); + + } + + } ); + + } else { + + return null; + + } + + } + +} + +/** + * GPU Instancing Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing + * + */ +let GLTFMeshGpuInstancing$1 = class GLTFMeshGpuInstancing { + + constructor( parser ) { + + this.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING; + this.parser = parser; + + } + + createNodeMesh( nodeIndex ) { + + const json = this.parser.json; + const nodeDef = json.nodes[ nodeIndex ]; + + if ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] || + nodeDef.mesh === undefined ) { + + return null; + + } + + const meshDef = json.meshes[ nodeDef.mesh ]; + + // No Points or Lines + Instancing support yet + + for ( const primitive of meshDef.primitives ) { + + if ( primitive.mode !== WEBGL_CONSTANTS$1.TRIANGLES && + primitive.mode !== WEBGL_CONSTANTS$1.TRIANGLE_STRIP && + primitive.mode !== WEBGL_CONSTANTS$1.TRIANGLE_FAN && + primitive.mode !== undefined ) { + + return null; + + } + + } + + const extensionDef = nodeDef.extensions[ this.name ]; + const attributesDef = extensionDef.attributes; + + // @TODO: Can we support InstancedMesh + SkinnedMesh? + + const pending = []; + const attributes = {}; + + for ( const key in attributesDef ) { + + pending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => { + + attributes[ key ] = accessor; + return attributes[ key ]; + + } ) ); + + } + + if ( pending.length < 1 ) { + + return null; + + } + + pending.push( this.parser.createNodeMesh( nodeIndex ) ); + + return Promise.all( pending ).then( results => { + + const nodeObject = results.pop(); + const meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ]; + const count = results[ 0 ].count; // All attribute counts should be same + const instancedMeshes = []; + + for ( const mesh of meshes ) { + + // Temporal variables + const m = new Matrix4(); + const p = new Vector3(); + const q = new Quaternion(); + const s = new Vector3( 1, 1, 1 ); + + const instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count ); + + for ( let i = 0; i < count; i ++ ) { + + if ( attributes.TRANSLATION ) { + + p.fromBufferAttribute( attributes.TRANSLATION, i ); + + } + + if ( attributes.ROTATION ) { + + q.fromBufferAttribute( attributes.ROTATION, i ); + + } + + if ( attributes.SCALE ) { + + s.fromBufferAttribute( attributes.SCALE, i ); + + } + + instancedMesh.setMatrixAt( i, m.compose( p, q, s ) ); + + } + + // Add instance attributes to the geometry, excluding TRS. + for ( const attributeName in attributes ) { + + if ( attributeName === '_COLOR_0' ) { + + const attr = attributes[ attributeName ]; + instancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized ); + + } else if ( attributeName !== 'TRANSLATION' && + attributeName !== 'ROTATION' && + attributeName !== 'SCALE' ) { + + mesh.geometry.setAttribute( attributeName, attributes[ attributeName ] ); + + } + + } + + // Just in case + Object3D.prototype.copy.call( instancedMesh, mesh ); + + this.parser.assignFinalMaterial( instancedMesh ); + + instancedMeshes.push( instancedMesh ); + + } + + if ( nodeObject.isGroup ) { + + nodeObject.clear(); + + nodeObject.add( ... instancedMeshes ); + + return nodeObject; + + } + + return instancedMeshes[ 0 ]; + + } ); + + } + +}; + +/* BINARY EXTENSION */ +const BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; +const BINARY_EXTENSION_HEADER_LENGTH = 12; +const BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; + +class GLTFBinaryExtension { + + constructor( data ) { + + this.name = EXTENSIONS.KHR_BINARY_GLTF; + this.content = null; + this.body = null; + + const headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH ); + const textDecoder = new TextDecoder(); + + this.header = { + magic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ), + version: headerView.getUint32( 4, true ), + length: headerView.getUint32( 8, true ) + }; + + if ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) { + + throw new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' ); + + } else if ( this.header.version < 2.0 ) { + + throw new Error( 'THREE.GLTFLoader: Legacy binary file detected.' ); + + } + + const chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH; + const chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH ); + let chunkIndex = 0; + + while ( chunkIndex < chunkContentsLength ) { + + const chunkLength = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + const chunkType = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) { + + const contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength ); + this.content = textDecoder.decode( contentArray ); + + } else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) { + + const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; + this.body = data.slice( byteOffset, byteOffset + chunkLength ); + + } + + // Clients must ignore chunks with unknown types. + + chunkIndex += chunkLength; + + } + + if ( this.content === null ) { + + throw new Error( 'THREE.GLTFLoader: JSON content not found.' ); + + } + + } + +} + +/** + * DRACO Mesh Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression + */ +class GLTFDracoMeshCompressionExtension { + + constructor( json, dracoLoader ) { + + if ( ! dracoLoader ) { + + throw new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' ); + + } + + this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; + this.json = json; + this.dracoLoader = dracoLoader; + this.dracoLoader.preload(); + + } + + decodePrimitive( primitive, parser ) { + + const json = this.json; + const dracoLoader = this.dracoLoader; + const bufferViewIndex = primitive.extensions[ this.name ].bufferView; + const gltfAttributeMap = primitive.extensions[ this.name ].attributes; + const threeAttributeMap = {}; + const attributeNormalizedMap = {}; + const attributeTypeMap = {}; + + for ( const attributeName in gltfAttributeMap ) { + + const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + threeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ]; + + } + + for ( const attributeName in primitive.attributes ) { + + const threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + if ( gltfAttributeMap[ attributeName ] !== undefined ) { + + const accessorDef = json.accessors[ primitive.attributes[ attributeName ] ]; + const componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + attributeTypeMap[ threeAttributeName ] = componentType.name; + attributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true; + + } + + } + + return parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) { + + return new Promise( function ( resolve, reject ) { + + dracoLoader.decodeDracoFile( bufferView, function ( geometry ) { + + for ( const attributeName in geometry.attributes ) { + + const attribute = geometry.attributes[ attributeName ]; + const normalized = attributeNormalizedMap[ attributeName ]; + + if ( normalized !== undefined ) attribute.normalized = normalized; + + } + + resolve( geometry ); + + }, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject ); + + } ); + + } ); + + } + +} + +/** + * Texture Transform Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform + */ +class GLTFTextureTransformExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; + + } + + extendTexture( texture, transform ) { + + if ( ( transform.texCoord === undefined || transform.texCoord === texture.channel ) + && transform.offset === undefined + && transform.rotation === undefined + && transform.scale === undefined ) { + + // See https://github.com/mrdoob/three.js/issues/21819. + return texture; + + } + + texture = texture.clone(); + + if ( transform.texCoord !== undefined ) { + + texture.channel = transform.texCoord; + + } + + if ( transform.offset !== undefined ) { + + texture.offset.fromArray( transform.offset ); + + } + + if ( transform.rotation !== undefined ) { + + texture.rotation = transform.rotation; + + } + + if ( transform.scale !== undefined ) { + + texture.repeat.fromArray( transform.scale ); + + } + + texture.needsUpdate = true; + + return texture; + + } + +} + +/** + * Mesh Quantization Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization + */ +class GLTFMeshQuantizationExtension { + + constructor() { + + this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; + + } + +} + +/*********************************/ +/********** INTERPOLATION ********/ +/*********************************/ + +// Spline Interpolation +// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation +class GLTFCubicSplineInterpolant extends Interpolant { + + constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + super( parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + copySampleValue_( index ) { + + // Copies a sample value to the result buffer. See description of glTF + // CUBICSPLINE values layout in interpolate_() function below. + + const result = this.resultBuffer, + values = this.sampleValues, + valueSize = this.valueSize, + offset = index * valueSize * 3 + valueSize; + + for ( let i = 0; i !== valueSize; i ++ ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + } + + interpolate_( i1, t0, t, t1 ) { + + const result = this.resultBuffer; + const values = this.sampleValues; + const stride = this.valueSize; + + const stride2 = stride * 2; + const stride3 = stride * 3; + + const td = t1 - t0; + + const p = ( t - t0 ) / td; + const pp = p * p; + const ppp = pp * p; + + const offset1 = i1 * stride3; + const offset0 = offset1 - stride3; + + const s2 = -2 * ppp + 3 * pp; + const s3 = ppp - pp; + const s0 = 1 - s2; + const s1 = s3 - pp + p; + + // Layout of keyframe output values for CUBICSPLINE animations: + // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] + for ( let i = 0; i !== stride; i ++ ) { + + const p0 = values[ offset0 + i + stride ]; // splineVertex_k + const m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k) + const p1 = values[ offset1 + i + stride ]; // splineVertex_k+1 + const m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k) + + result[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + + } + + return result; + + } + +} + +const _q = new Quaternion(); + +class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant { + + interpolate_( i1, t0, t, t1 ) { + + const result = super.interpolate_( i1, t0, t, t1 ); + + _q.fromArray( result ).normalize().toArray( result ); + + return result; + + } + +} + + +/*********************************/ +/********** INTERNALS ************/ +/*********************************/ + +/* CONSTANTS */ + +const WEBGL_CONSTANTS$1 = { + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6}; + +const WEBGL_COMPONENT_TYPES = { + 5120: Int8Array, + 5121: Uint8Array, + 5122: Int16Array, + 5123: Uint16Array, + 5125: Uint32Array, + 5126: Float32Array +}; + +const WEBGL_FILTERS = { + 9728: NearestFilter, + 9729: LinearFilter, + 9984: NearestMipmapNearestFilter, + 9985: LinearMipmapNearestFilter, + 9986: NearestMipmapLinearFilter, + 9987: LinearMipmapLinearFilter +}; + +const WEBGL_WRAPPINGS = { + 33071: ClampToEdgeWrapping, + 33648: MirroredRepeatWrapping, + 10497: RepeatWrapping +}; + +const WEBGL_TYPE_SIZES = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4, + 'MAT2': 4, + 'MAT3': 9, + 'MAT4': 16 +}; + +const ATTRIBUTES = { + POSITION: 'position', + NORMAL: 'normal', + TANGENT: 'tangent', + TEXCOORD_0: 'uv', + TEXCOORD_1: 'uv1', + TEXCOORD_2: 'uv2', + TEXCOORD_3: 'uv3', + COLOR_0: 'color', + WEIGHTS_0: 'skinWeight', + JOINTS_0: 'skinIndex', +}; + +const PATH_PROPERTIES$1 = { + scale: 'scale', + translation: 'position', + rotation: 'quaternion', + weights: 'morphTargetInfluences' +}; + +const INTERPOLATION = { + CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each + // keyframe track will be initialized with a default interpolation type, then modified. + LINEAR: InterpolateLinear, + STEP: InterpolateDiscrete +}; + +const ALPHA_MODES = { + OPAQUE: 'OPAQUE', + MASK: 'MASK', + BLEND: 'BLEND' +}; + +/** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material + * + * @param {Object} cache + * @return {Material} + */ +function createDefaultMaterial( cache ) { + + if ( cache[ 'DefaultMaterial' ] === undefined ) { + + cache[ 'DefaultMaterial' ] = new MeshStandardMaterial( { + color: 0xFFFFFF, + emissive: 0x000000, + metalness: 1, + roughness: 1, + transparent: false, + depthTest: true, + side: FrontSide + } ); + + } + + return cache[ 'DefaultMaterial' ]; + +} + +function addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) { + + // Add unknown glTF extensions to an object's userData. + + for ( const name in objectDef.extensions ) { + + if ( knownExtensions[ name ] === undefined ) { + + object.userData.gltfExtensions = object.userData.gltfExtensions || {}; + object.userData.gltfExtensions[ name ] = objectDef.extensions[ name ]; + + } + + } + +} + +/** + * @param {Object3D|Material|BufferGeometry} object + * @param {GLTF.definition} gltfDef + */ +function assignExtrasToUserData( object, gltfDef ) { + + if ( gltfDef.extras !== undefined ) { + + if ( typeof gltfDef.extras === 'object' ) { + + Object.assign( object.userData, gltfDef.extras ); + + } else { + + console.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras ); + + } + + } + +} + +/** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets + * + * @param {BufferGeometry} geometry + * @param {Array} targets + * @param {GLTFParser} parser + * @return {Promise} + */ +function addMorphTargets( geometry, targets, parser ) { + + let hasMorphPosition = false; + let hasMorphNormal = false; + let hasMorphColor = false; + + for ( let i = 0, il = targets.length; i < il; i ++ ) { + + const target = targets[ i ]; + + if ( target.POSITION !== undefined ) hasMorphPosition = true; + if ( target.NORMAL !== undefined ) hasMorphNormal = true; + if ( target.COLOR_0 !== undefined ) hasMorphColor = true; + + if ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break; + + } + + if ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry ); + + const pendingPositionAccessors = []; + const pendingNormalAccessors = []; + const pendingColorAccessors = []; + + for ( let i = 0, il = targets.length; i < il; i ++ ) { + + const target = targets[ i ]; + + if ( hasMorphPosition ) { + + const pendingAccessor = target.POSITION !== undefined + ? parser.getDependency( 'accessor', target.POSITION ) + : geometry.attributes.position; + + pendingPositionAccessors.push( pendingAccessor ); + + } + + if ( hasMorphNormal ) { + + const pendingAccessor = target.NORMAL !== undefined + ? parser.getDependency( 'accessor', target.NORMAL ) + : geometry.attributes.normal; + + pendingNormalAccessors.push( pendingAccessor ); + + } + + if ( hasMorphColor ) { + + const pendingAccessor = target.COLOR_0 !== undefined + ? parser.getDependency( 'accessor', target.COLOR_0 ) + : geometry.attributes.color; + + pendingColorAccessors.push( pendingAccessor ); + + } + + } + + return Promise.all( [ + Promise.all( pendingPositionAccessors ), + Promise.all( pendingNormalAccessors ), + Promise.all( pendingColorAccessors ) + ] ).then( function ( accessors ) { + + const morphPositions = accessors[ 0 ]; + const morphNormals = accessors[ 1 ]; + const morphColors = accessors[ 2 ]; + + if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions; + if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals; + if ( hasMorphColor ) geometry.morphAttributes.color = morphColors; + geometry.morphTargetsRelative = true; + + return geometry; + + } ); + +} + +/** + * @param {Mesh} mesh + * @param {GLTF.Mesh} meshDef + */ +function updateMorphTargets( mesh, meshDef ) { + + mesh.updateMorphTargets(); + + if ( meshDef.weights !== undefined ) { + + for ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) { + + mesh.morphTargetInfluences[ i ] = meshDef.weights[ i ]; + + } + + } + + // .extras has user-defined data, so check that .extras.targetNames is an array. + if ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) { + + const targetNames = meshDef.extras.targetNames; + + if ( mesh.morphTargetInfluences.length === targetNames.length ) { + + mesh.morphTargetDictionary = {}; + + for ( let i = 0, il = targetNames.length; i < il; i ++ ) { + + mesh.morphTargetDictionary[ targetNames[ i ] ] = i; + + } + + } else { + + console.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' ); + + } + + } + +} + +function createPrimitiveKey( primitiveDef ) { + + let geometryKey; + + const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]; + + if ( dracoExtension ) { + + geometryKey = 'draco:' + dracoExtension.bufferView + + ':' + dracoExtension.indices + + ':' + createAttributesKey( dracoExtension.attributes ); + + } else { + + geometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode; + + } + + if ( primitiveDef.targets !== undefined ) { + + for ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) { + + geometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] ); + + } + + } + + return geometryKey; + +} + +function createAttributesKey( attributes ) { + + let attributesKey = ''; + + const keys = Object.keys( attributes ).sort(); + + for ( let i = 0, il = keys.length; i < il; i ++ ) { + + attributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';'; + + } + + return attributesKey; + +} + +function getNormalizedComponentScale( constructor ) { + + // Reference: + // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data + + switch ( constructor ) { + + case Int8Array: + return 1 / 127; + + case Uint8Array: + return 1 / 255; + + case Int16Array: + return 1 / 32767; + + case Uint16Array: + return 1 / 65535; + + default: + throw new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' ); + + } + +} + +function getImageURIMimeType( uri ) { + + if ( uri.search( /\.jpe?g($|\?)/i ) > 0 || uri.search( /^data\:image\/jpeg/ ) === 0 ) return 'image/jpeg'; + if ( uri.search( /\.webp($|\?)/i ) > 0 || uri.search( /^data\:image\/webp/ ) === 0 ) return 'image/webp'; + if ( uri.search( /\.ktx2($|\?)/i ) > 0 || uri.search( /^data\:image\/ktx2/ ) === 0 ) return 'image/ktx2'; + + return 'image/png'; + +} + +const _identityMatrix = new Matrix4(); + +/* GLTF PARSER */ + +class GLTFParser { + + constructor( json = {}, options = {} ) { + + this.json = json; + this.extensions = {}; + this.plugins = {}; + this.options = options; + + // loader object cache + this.cache = new GLTFRegistry(); + + // associations between Three.js objects and glTF elements + this.associations = new Map(); + + // BufferGeometry caching + this.primitiveCache = {}; + + // Node cache + this.nodeCache = {}; + + // Object3D instance caches + this.meshCache = { refs: {}, uses: {} }; + this.cameraCache = { refs: {}, uses: {} }; + this.lightCache = { refs: {}, uses: {} }; + + this.sourceCache = {}; + this.textureCache = {}; + + // Track node names, to ensure no duplicates + this.nodeNamesUsed = {}; + + // Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the + // expensive work of uploading a texture to the GPU off the main thread. + + let isSafari = false; + let safariVersion = -1; + let isFirefox = false; + let firefoxVersion = -1; + + if ( typeof navigator !== 'undefined' ) { + + const userAgent = navigator.userAgent; + + isSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true; + const safariMatch = userAgent.match( /Version\/(\d+)/ ); + safariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : -1; + + isFirefox = userAgent.indexOf( 'Firefox' ) > -1; + firefoxVersion = isFirefox ? userAgent.match( /Firefox\/([0-9]+)\./ )[ 1 ] : -1; + + } + + if ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) { + + this.textureLoader = new TextureLoader( this.options.manager ); + + } else { + + this.textureLoader = new ImageBitmapLoader( this.options.manager ); + + } + + this.textureLoader.setCrossOrigin( this.options.crossOrigin ); + this.textureLoader.setRequestHeader( this.options.requestHeader ); + + this.fileLoader = new FileLoader( this.options.manager ); + this.fileLoader.setResponseType( 'arraybuffer' ); + + if ( this.options.crossOrigin === 'use-credentials' ) { + + this.fileLoader.setWithCredentials( true ); + + } + + } + + setExtensions( extensions ) { + + this.extensions = extensions; + + } + + setPlugins( plugins ) { + + this.plugins = plugins; + + } + + parse( onLoad, onError ) { + + const parser = this; + const json = this.json; + const extensions = this.extensions; + + // Clear the loader cache + this.cache.removeAll(); + this.nodeCache = {}; + + // Mark the special nodes/meshes in json for efficient parse + this._invokeAll( function ( ext ) { + + return ext._markDefs && ext._markDefs(); + + } ); + + Promise.all( this._invokeAll( function ( ext ) { + + return ext.beforeRoot && ext.beforeRoot(); + + } ) ).then( function () { + + return Promise.all( [ + + parser.getDependencies( 'scene' ), + parser.getDependencies( 'animation' ), + parser.getDependencies( 'camera' ), + + ] ); + + } ).then( function ( dependencies ) { + + const result = { + scene: dependencies[ 0 ][ json.scene || 0 ], + scenes: dependencies[ 0 ], + animations: dependencies[ 1 ], + cameras: dependencies[ 2 ], + asset: json.asset, + parser: parser, + userData: {} + }; + + addUnknownExtensionsToUserData( extensions, result, json ); + + assignExtrasToUserData( result, json ); + + return Promise.all( parser._invokeAll( function ( ext ) { + + return ext.afterRoot && ext.afterRoot( result ); + + } ) ).then( function () { + + for ( const scene of result.scenes ) { + + scene.updateMatrixWorld(); + + } + + onLoad( result ); + + } ); + + } ).catch( onError ); + + } + + /** + * Marks the special nodes/meshes in json for efficient parse. + */ + _markDefs() { + + const nodeDefs = this.json.nodes || []; + const skinDefs = this.json.skins || []; + const meshDefs = this.json.meshes || []; + + // Nothing in the node definition indicates whether it is a Bone or an + // Object3D. Use the skins' joint references to mark bones. + for ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) { + + const joints = skinDefs[ skinIndex ].joints; + + for ( let i = 0, il = joints.length; i < il; i ++ ) { + + nodeDefs[ joints[ i ] ].isBone = true; + + } + + } + + // Iterate over all nodes, marking references to shared resources, + // as well as skeleton joints. + for ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + const nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.mesh !== undefined ) { + + this._addNodeRef( this.meshCache, nodeDef.mesh ); + + // Nothing in the mesh definition indicates whether it is + // a SkinnedMesh or Mesh. Use the node's mesh reference + // to mark SkinnedMesh if node has skin. + if ( nodeDef.skin !== undefined ) { + + meshDefs[ nodeDef.mesh ].isSkinnedMesh = true; + + } + + } + + if ( nodeDef.camera !== undefined ) { + + this._addNodeRef( this.cameraCache, nodeDef.camera ); + + } + + } + + } + + /** + * Counts references to shared node / Object3D resources. These resources + * can be reused, or "instantiated", at multiple nodes in the scene + * hierarchy. Mesh, Camera, and Light instances are instantiated and must + * be marked. Non-scenegraph resources (like Materials, Geometries, and + * Textures) can be reused directly and are not marked here. + * + * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. + * + * @param {Object} cache + * @param {Object3D} index + */ + _addNodeRef( cache, index ) { + + if ( index === undefined ) return; + + if ( cache.refs[ index ] === undefined ) { + + cache.refs[ index ] = cache.uses[ index ] = 0; + + } + + cache.refs[ index ] ++; + + } + + /** + * Returns a reference to a shared resource, cloning it if necessary. + * + * @param {Object} cache + * @param {number} index + * @param {Object} object + * @return {Object} + */ + _getNodeRef( cache, index, object ) { + + if ( cache.refs[ index ] <= 1 ) return object; + + const ref = object.clone(); + + // Propagates mappings to the cloned object, prevents mappings on the + // original object from being lost. + const updateMappings = ( original, clone ) => { + + const mappings = this.associations.get( original ); + if ( mappings != null ) { + + this.associations.set( clone, mappings ); + + } + + for ( const [ i, child ] of original.children.entries() ) { + + updateMappings( child, clone.children[ i ] ); + + } + + }; + + updateMappings( object, ref ); + + ref.name += '_instance_' + ( cache.uses[ index ] ++ ); + + return ref; + + } + + _invokeOne( func ) { + + const extensions = Object.values( this.plugins ); + extensions.push( this ); + + for ( let i = 0; i < extensions.length; i ++ ) { + + const result = func( extensions[ i ] ); + + if ( result ) return result; + + } + + return null; + + } + + _invokeAll( func ) { + + const extensions = Object.values( this.plugins ); + extensions.unshift( this ); + + const pending = []; + + for ( let i = 0; i < extensions.length; i ++ ) { + + const result = func( extensions[ i ] ); + + if ( result ) pending.push( result ); + + } + + return pending; + + } + + /** + * Requests the specified dependency asynchronously, with caching. + * @param {string} type + * @param {number} index + * @return {Promise} + */ + getDependency( type, index ) { + + const cacheKey = type + ':' + index; + let dependency = this.cache.get( cacheKey ); + + if ( ! dependency ) { + + switch ( type ) { + + case 'scene': + dependency = this.loadScene( index ); + break; + + case 'node': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadNode && ext.loadNode( index ); + + } ); + break; + + case 'mesh': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMesh && ext.loadMesh( index ); + + } ); + break; + + case 'accessor': + dependency = this.loadAccessor( index ); + break; + + case 'bufferView': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadBufferView && ext.loadBufferView( index ); + + } ); + break; + + case 'buffer': + dependency = this.loadBuffer( index ); + break; + + case 'material': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMaterial && ext.loadMaterial( index ); + + } ); + break; + + case 'texture': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadTexture && ext.loadTexture( index ); + + } ); + break; + + case 'skin': + dependency = this.loadSkin( index ); + break; + + case 'animation': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadAnimation && ext.loadAnimation( index ); + + } ); + break; + + case 'camera': + dependency = this.loadCamera( index ); + break; + + default: + dependency = this._invokeOne( function ( ext ) { + + return ext != this && ext.getDependency && ext.getDependency( type, index ); + + } ); + + if ( ! dependency ) { + + throw new Error( 'Unknown type: ' + type ); + + } + + break; + + } + + this.cache.add( cacheKey, dependency ); + + } + + return dependency; + + } + + /** + * Requests all dependencies of the specified type asynchronously, with caching. + * @param {string} type + * @return {Promise>} + */ + getDependencies( type ) { + + let dependencies = this.cache.get( type ); + + if ( ! dependencies ) { + + const parser = this; + const defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || []; + + dependencies = Promise.all( defs.map( function ( def, index ) { + + return parser.getDependency( type, index ); + + } ) ); + + this.cache.add( type, dependencies ); + + } + + return dependencies; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferIndex + * @return {Promise} + */ + loadBuffer( bufferIndex ) { + + const bufferDef = this.json.buffers[ bufferIndex ]; + const loader = this.fileLoader; + + if ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) { + + throw new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' ); + + } + + // If present, GLB container is required to be the first buffer. + if ( bufferDef.uri === undefined && bufferIndex === 0 ) { + + return Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body ); + + } + + const options = this.options; + + return new Promise( function ( resolve, reject ) { + + loader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () { + + reject( new Error( 'THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".' ) ); + + } ); + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferViewIndex + * @return {Promise} + */ + loadBufferView( bufferViewIndex ) { + + const bufferViewDef = this.json.bufferViews[ bufferViewIndex ]; + + return this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) { + + const byteLength = bufferViewDef.byteLength || 0; + const byteOffset = bufferViewDef.byteOffset || 0; + return buffer.slice( byteOffset, byteOffset + byteLength ); + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors + * @param {number} accessorIndex + * @return {Promise} + */ + loadAccessor( accessorIndex ) { + + const parser = this; + const json = this.json; + + const accessorDef = this.json.accessors[ accessorIndex ]; + + if ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) { + + const itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; + const TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + const normalized = accessorDef.normalized === true; + + const array = new TypedArray( accessorDef.count * itemSize ); + return Promise.resolve( new BufferAttribute( array, itemSize, normalized ) ); + + } + + const pendingBufferViews = []; + + if ( accessorDef.bufferView !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) ); + + } else { + + pendingBufferViews.push( null ); + + } + + if ( accessorDef.sparse !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) ); + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) ); + + } + + return Promise.all( pendingBufferViews ).then( function ( bufferViews ) { + + const bufferView = bufferViews[ 0 ]; + + const itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; + const TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. + const elementBytes = TypedArray.BYTES_PER_ELEMENT; + const itemBytes = elementBytes * itemSize; + const byteOffset = accessorDef.byteOffset || 0; + const byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined; + const normalized = accessorDef.normalized === true; + let array, bufferAttribute; + + // The buffer is not interleaved if the stride is the item size in bytes. + if ( byteStride && byteStride !== itemBytes ) { + + // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer + // This makes sure that IBA.count reflects accessor.count properly + const ibSlice = Math.floor( byteOffset / byteStride ); + const ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count; + let ib = parser.cache.get( ibCacheKey ); + + if ( ! ib ) { + + array = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); + + // Integer parameters to IB/IBA are in array elements, not bytes. + ib = new InterleavedBuffer( array, byteStride / elementBytes ); + + parser.cache.add( ibCacheKey, ib ); + + } + + bufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized ); + + } else { + + if ( bufferView === null ) { + + array = new TypedArray( accessorDef.count * itemSize ); + + } else { + + array = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize ); + + } + + bufferAttribute = new BufferAttribute( array, itemSize, normalized ); + + } + + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors + if ( accessorDef.sparse !== undefined ) { + + const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; + const TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ]; + + const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; + const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; + + const sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices ); + const sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize ); + + if ( bufferView !== null ) { + + // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. + bufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized ); + + } + + // Ignore normalized since we copy from sparse + bufferAttribute.normalized = false; + + for ( let i = 0, il = sparseIndices.length; i < il; i ++ ) { + + const index = sparseIndices[ i ]; + + bufferAttribute.setX( index, sparseValues[ i * itemSize ] ); + if ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] ); + if ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] ); + if ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] ); + if ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' ); + + } + + bufferAttribute.normalized = normalized; + + } + + return bufferAttribute; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures + * @param {number} textureIndex + * @return {Promise} + */ + loadTexture( textureIndex ) { + + const json = this.json; + const options = this.options; + const textureDef = json.textures[ textureIndex ]; + const sourceIndex = textureDef.source; + const sourceDef = json.images[ sourceIndex ]; + + let loader = this.textureLoader; + + if ( sourceDef.uri ) { + + const handler = options.manager.getHandler( sourceDef.uri ); + if ( handler !== null ) loader = handler; + + } + + return this.loadTextureImage( textureIndex, sourceIndex, loader ); + + } + + loadTextureImage( textureIndex, sourceIndex, loader ) { + + const parser = this; + const json = this.json; + + const textureDef = json.textures[ textureIndex ]; + const sourceDef = json.images[ sourceIndex ]; + + const cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler; + + if ( this.textureCache[ cacheKey ] ) { + + // See https://github.com/mrdoob/three.js/issues/21559. + return this.textureCache[ cacheKey ]; + + } + + const promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) { + + texture.flipY = false; + + texture.name = textureDef.name || sourceDef.name || ''; + + if ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) { + + texture.name = sourceDef.uri; + + } + + const samplers = json.samplers || {}; + const sampler = samplers[ textureDef.sampler ] || {}; + + texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter; + texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter; + texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping; + texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping; + texture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + + parser.associations.set( texture, { textures: textureIndex } ); + + return texture; + + } ).catch( function () { + + return null; + + } ); + + this.textureCache[ cacheKey ] = promise; + + return promise; + + } + + loadImageSource( sourceIndex, loader ) { + + const parser = this; + const json = this.json; + const options = this.options; + + if ( this.sourceCache[ sourceIndex ] !== undefined ) { + + return this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() ); + + } + + const sourceDef = json.images[ sourceIndex ]; + + const URL = self.URL || self.webkitURL; + + let sourceURI = sourceDef.uri || ''; + let isObjectURL = false; + + if ( sourceDef.bufferView !== undefined ) { + + // Load binary image data from bufferView, if provided. + + sourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) { + + isObjectURL = true; + const blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } ); + sourceURI = URL.createObjectURL( blob ); + return sourceURI; + + } ); + + } else if ( sourceDef.uri === undefined ) { + + throw new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' ); + + } + + const promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) { + + return new Promise( function ( resolve, reject ) { + + let onLoad = resolve; + + if ( loader.isImageBitmapLoader === true ) { + + onLoad = function ( imageBitmap ) { + + const texture = new Texture$1( imageBitmap ); + texture.needsUpdate = true; + + resolve( texture ); + + }; + + } + + loader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject ); + + } ); + + } ).then( function ( texture ) { + + // Clean up resources and configure Texture. + + if ( isObjectURL === true ) { + + URL.revokeObjectURL( sourceURI ); + + } + + assignExtrasToUserData( texture, sourceDef ); + + texture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri ); + + return texture; + + } ).catch( function ( error ) { + + console.error( 'THREE.GLTFLoader: Couldn\'t load texture', sourceURI ); + throw error; + + } ); + + this.sourceCache[ sourceIndex ] = promise; + return promise; + + } + + /** + * Asynchronously assigns a texture to the given material parameters. + * + * @param {Object} materialParams + * @param {string} mapName + * @param {Object} mapDef + * @param {string} colorSpace + * @return {Promise} + */ + assignTexture( materialParams, mapName, mapDef, colorSpace ) { + + const parser = this; + + return this.getDependency( 'texture', mapDef.index ).then( function ( texture ) { + + if ( ! texture ) return null; + + if ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) { + + texture = texture.clone(); + texture.channel = mapDef.texCoord; + + } + + if ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) { + + const transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined; + + if ( transform ) { + + const gltfReference = parser.associations.get( texture ); + texture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform ); + parser.associations.set( texture, gltfReference ); + + } + + } + + if ( colorSpace !== undefined ) { + + texture.colorSpace = colorSpace; + + } + + materialParams[ mapName ] = texture; + + return texture; + + } ); + + } + + /** + * Assigns final material to a Mesh, Line, or Points instance. The instance + * already has a material (generated from the glTF material options alone) + * but reuse of the same glTF material may require multiple threejs materials + * to accommodate different primitive types, defines, etc. New materials will + * be created if necessary, and reused from a cache. + * @param {Object3D} mesh Mesh, Line, or Points instance. + */ + assignFinalMaterial( mesh ) { + + const geometry = mesh.geometry; + let material = mesh.material; + + const useDerivativeTangents = geometry.attributes.tangent === undefined; + const useVertexColors = geometry.attributes.color !== undefined; + const useFlatShading = geometry.attributes.normal === undefined; + + if ( mesh.isPoints ) { + + const cacheKey = 'PointsMaterial:' + material.uuid; + + let pointsMaterial = this.cache.get( cacheKey ); + + if ( ! pointsMaterial ) { + + pointsMaterial = new PointsMaterial(); + Material$1.prototype.copy.call( pointsMaterial, material ); + pointsMaterial.color.copy( material.color ); + pointsMaterial.map = material.map; + pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px + + this.cache.add( cacheKey, pointsMaterial ); + + } + + material = pointsMaterial; + + } else if ( mesh.isLine ) { + + const cacheKey = 'LineBasicMaterial:' + material.uuid; + + let lineMaterial = this.cache.get( cacheKey ); + + if ( ! lineMaterial ) { + + lineMaterial = new LineBasicMaterial(); + Material$1.prototype.copy.call( lineMaterial, material ); + lineMaterial.color.copy( material.color ); + lineMaterial.map = material.map; + + this.cache.add( cacheKey, lineMaterial ); + + } + + material = lineMaterial; + + } + + // Clone the material if it will be modified + if ( useDerivativeTangents || useVertexColors || useFlatShading ) { + + let cacheKey = 'ClonedMaterial:' + material.uuid + ':'; + + if ( useDerivativeTangents ) cacheKey += 'derivative-tangents:'; + if ( useVertexColors ) cacheKey += 'vertex-colors:'; + if ( useFlatShading ) cacheKey += 'flat-shading:'; + + let cachedMaterial = this.cache.get( cacheKey ); + + if ( ! cachedMaterial ) { + + cachedMaterial = material.clone(); + + if ( useVertexColors ) cachedMaterial.vertexColors = true; + if ( useFlatShading ) cachedMaterial.flatShading = true; + + if ( useDerivativeTangents ) { + + // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 + if ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= -1; + if ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= -1; + + } + + this.cache.add( cacheKey, cachedMaterial ); + + this.associations.set( cachedMaterial, this.associations.get( material ) ); + + } + + material = cachedMaterial; + + } + + mesh.material = material; + + } + + getMaterialType( /* materialIndex */ ) { + + return MeshStandardMaterial; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials + * @param {number} materialIndex + * @return {Promise} + */ + loadMaterial( materialIndex ) { + + const parser = this; + const json = this.json; + const extensions = this.extensions; + const materialDef = json.materials[ materialIndex ]; + + let materialType; + const materialParams = {}; + const materialExtensions = materialDef.extensions || {}; + + const pending = []; + + if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) { + + const kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ]; + materialType = kmuExtension.getMaterialType(); + pending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) ); + + } else { + + // Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material + + const metallicRoughness = materialDef.pbrMetallicRoughness || {}; + + materialParams.color = new Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + const array = metallicRoughness.baseColorFactor; + + materialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) ); + + } + + materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0; + materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0; + + if ( metallicRoughness.metallicRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) ); + pending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) ); + + } + + materialType = this._invokeOne( function ( ext ) { + + return ext.getMaterialType && ext.getMaterialType( materialIndex ); + + } ); + + pending.push( Promise.all( this._invokeAll( function ( ext ) { + + return ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams ); + + } ) ) ); + + } + + if ( materialDef.doubleSided === true ) { + + materialParams.side = DoubleSide; + + } + + const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; + + if ( alphaMode === ALPHA_MODES.BLEND ) { + + materialParams.transparent = true; + + // See: https://github.com/mrdoob/three.js/issues/17706 + materialParams.depthWrite = false; + + } else { + + materialParams.transparent = false; + + if ( alphaMode === ALPHA_MODES.MASK ) { + + materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5; + + } + + } + + if ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); + + materialParams.normalScale = new Vector2( 1, 1 ); + + if ( materialDef.normalTexture.scale !== undefined ) { + + const scale = materialDef.normalTexture.scale; + + materialParams.normalScale.set( scale, scale ); + + } + + } + + if ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) ); + + if ( materialDef.occlusionTexture.strength !== undefined ) { + + materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; + + } + + } + + if ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) { + + const emissiveFactor = materialDef.emissiveFactor; + materialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace ); + + } + + if ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) ); + + } + + return Promise.all( pending ).then( function () { + + const material = new materialType( materialParams ); + + if ( materialDef.name ) material.name = materialDef.name; + + assignExtrasToUserData( material, materialDef ); + + parser.associations.set( material, { materials: materialIndex } ); + + if ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef ); + + return material; + + } ); + + } + + /** + * When Object3D instances are targeted by animation, they need unique names. + * + * @param {string} originalName + * @return {string} + */ + createUniqueName( originalName ) { + + const sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' ); + + if ( sanitizedName in this.nodeNamesUsed ) { + + return sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] ); + + } else { + + this.nodeNamesUsed[ sanitizedName ] = 0; + + return sanitizedName; + + } + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry + * + * Creates BufferGeometries from primitives. + * + * @param {Array} primitives + * @return {Promise>} + */ + loadGeometries( primitives ) { + + const parser = this; + const extensions = this.extensions; + const cache = this.primitiveCache; + + function createDracoPrimitive( primitive ) { + + return extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] + .decodePrimitive( primitive, parser ) + .then( function ( geometry ) { + + return addPrimitiveAttributes( geometry, primitive, parser ); + + } ); + + } + + const pending = []; + + for ( let i = 0, il = primitives.length; i < il; i ++ ) { + + const primitive = primitives[ i ]; + const cacheKey = createPrimitiveKey( primitive ); + + // See if we've already created this geometry + const cached = cache[ cacheKey ]; + + if ( cached ) { + + // Use the cached geometry if it exists + pending.push( cached.promise ); + + } else { + + let geometryPromise; + + if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) { + + // Use DRACO geometry if available + geometryPromise = createDracoPrimitive( primitive ); + + } else { + + // Otherwise create a new geometry + geometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser ); + + } + + // Cache this geometry + cache[ cacheKey ] = { primitive: primitive, promise: geometryPromise }; + + pending.push( geometryPromise ); + + } + + } + + return Promise.all( pending ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes + * @param {number} meshIndex + * @return {Promise} + */ + loadMesh( meshIndex ) { + + const parser = this; + const json = this.json; + const extensions = this.extensions; + + const meshDef = json.meshes[ meshIndex ]; + const primitives = meshDef.primitives; + + const pending = []; + + for ( let i = 0, il = primitives.length; i < il; i ++ ) { + + const material = primitives[ i ].material === undefined + ? createDefaultMaterial( this.cache ) + : this.getDependency( 'material', primitives[ i ].material ); + + pending.push( material ); + + } + + pending.push( parser.loadGeometries( primitives ) ); + + return Promise.all( pending ).then( function ( results ) { + + const materials = results.slice( 0, results.length - 1 ); + const geometries = results[ results.length - 1 ]; + + const meshes = []; + + for ( let i = 0, il = geometries.length; i < il; i ++ ) { + + const geometry = geometries[ i ]; + const primitive = primitives[ i ]; + + // 1. create Mesh + + let mesh; + + const material = materials[ i ]; + + if ( primitive.mode === WEBGL_CONSTANTS$1.TRIANGLES || + primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_STRIP || + primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_FAN || + primitive.mode === undefined ) { + + // .isSkinnedMesh isn't in glTF spec. See ._markDefs() + mesh = meshDef.isSkinnedMesh === true + ? new SkinnedMesh( geometry, material ) + : new Mesh( geometry, material ); + + if ( mesh.isSkinnedMesh === true ) { + + // normalize skin weights to fix malformed assets (see #15319) + mesh.normalizeSkinWeights(); + + } + + if ( primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_STRIP ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode ); + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.TRIANGLE_FAN ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode ); + + } + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.LINES ) { + + mesh = new LineSegments( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.LINE_STRIP ) { + + mesh = new Line( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.LINE_LOOP ) { + + mesh = new LineLoop( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS$1.POINTS ) { + + mesh = new Points( geometry, material ); + + } else { + + throw new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode ); + + } + + if ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) { + + updateMorphTargets( mesh, meshDef ); + + } + + mesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) ); + + assignExtrasToUserData( mesh, meshDef ); + + if ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive ); + + parser.assignFinalMaterial( mesh ); + + meshes.push( mesh ); + + } + + for ( let i = 0, il = meshes.length; i < il; i ++ ) { + + parser.associations.set( meshes[ i ], { + meshes: meshIndex, + primitives: i + } ); + + } + + if ( meshes.length === 1 ) { + + if ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef ); + + return meshes[ 0 ]; + + } + + const group = new Group(); + + if ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef ); + + parser.associations.set( group, { meshes: meshIndex } ); + + for ( let i = 0, il = meshes.length; i < il; i ++ ) { + + group.add( meshes[ i ] ); + + } + + return group; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras + * @param {number} cameraIndex + * @return {Promise} + */ + loadCamera( cameraIndex ) { + + let camera; + const cameraDef = this.json.cameras[ cameraIndex ]; + const params = cameraDef[ cameraDef.type ]; + + if ( ! params ) { + + console.warn( 'THREE.GLTFLoader: Missing camera parameters.' ); + return; + + } + + if ( cameraDef.type === 'perspective' ) { + + camera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 ); + + } else if ( cameraDef.type === 'orthographic' ) { + + camera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar ); + + } + + if ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name ); + + assignExtrasToUserData( camera, cameraDef ); + + return Promise.resolve( camera ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins + * @param {number} skinIndex + * @return {Promise} + */ + loadSkin( skinIndex ) { + + const skinDef = this.json.skins[ skinIndex ]; + + const pending = []; + + for ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) { + + pending.push( this._loadNodeShallow( skinDef.joints[ i ] ) ); + + } + + if ( skinDef.inverseBindMatrices !== undefined ) { + + pending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) ); + + } else { + + pending.push( null ); + + } + + return Promise.all( pending ).then( function ( results ) { + + const inverseBindMatrices = results.pop(); + const jointNodes = results; + + // Note that bones (joint nodes) may or may not be in the + // scene graph at this time. + + const bones = []; + const boneInverses = []; + + for ( let i = 0, il = jointNodes.length; i < il; i ++ ) { + + const jointNode = jointNodes[ i ]; + + if ( jointNode ) { + + bones.push( jointNode ); + + const mat = new Matrix4(); + + if ( inverseBindMatrices !== null ) { + + mat.fromArray( inverseBindMatrices.array, i * 16 ); + + } + + boneInverses.push( mat ); + + } else { + + console.warn( 'THREE.GLTFLoader: Joint "%s" could not be found.', skinDef.joints[ i ] ); + + } + + } + + return new Skeleton( bones, boneInverses ); + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations + * @param {number} animationIndex + * @return {Promise} + */ + loadAnimation( animationIndex ) { + + const json = this.json; + const parser = this; + + const animationDef = json.animations[ animationIndex ]; + const animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex; + + const pendingNodes = []; + const pendingInputAccessors = []; + const pendingOutputAccessors = []; + const pendingSamplers = []; + const pendingTargets = []; + + for ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) { + + const channel = animationDef.channels[ i ]; + const sampler = animationDef.samplers[ channel.sampler ]; + const target = channel.target; + const name = target.node; + const input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input; + const output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output; + + if ( target.node === undefined ) continue; + + pendingNodes.push( this.getDependency( 'node', name ) ); + pendingInputAccessors.push( this.getDependency( 'accessor', input ) ); + pendingOutputAccessors.push( this.getDependency( 'accessor', output ) ); + pendingSamplers.push( sampler ); + pendingTargets.push( target ); + + } + + return Promise.all( [ + + Promise.all( pendingNodes ), + Promise.all( pendingInputAccessors ), + Promise.all( pendingOutputAccessors ), + Promise.all( pendingSamplers ), + Promise.all( pendingTargets ) + + ] ).then( function ( dependencies ) { + + const nodes = dependencies[ 0 ]; + const inputAccessors = dependencies[ 1 ]; + const outputAccessors = dependencies[ 2 ]; + const samplers = dependencies[ 3 ]; + const targets = dependencies[ 4 ]; + + const tracks = []; + + for ( let i = 0, il = nodes.length; i < il; i ++ ) { + + const node = nodes[ i ]; + const inputAccessor = inputAccessors[ i ]; + const outputAccessor = outputAccessors[ i ]; + const sampler = samplers[ i ]; + const target = targets[ i ]; + + if ( node === undefined ) continue; + + if ( node.updateMatrix ) { + + node.updateMatrix(); + + } + + const createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ); + + if ( createdTracks ) { + + for ( let k = 0; k < createdTracks.length; k ++ ) { + + tracks.push( createdTracks[ k ] ); + + } + + } + + } + + return new AnimationClip( animationName, undefined, tracks ); + + } ); + + } + + createNodeMesh( nodeIndex ) { + + const json = this.json; + const parser = this; + const nodeDef = json.nodes[ nodeIndex ]; + + if ( nodeDef.mesh === undefined ) return null; + + return parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) { + + const node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); + + // if weights are provided on the node, override weights on the mesh. + if ( nodeDef.weights !== undefined ) { + + node.traverse( function ( o ) { + + if ( ! o.isMesh ) return; + + for ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) { + + o.morphTargetInfluences[ i ] = nodeDef.weights[ i ]; + + } + + } ); + + } + + return node; + + } ); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy + * @param {number} nodeIndex + * @return {Promise} + */ + loadNode( nodeIndex ) { + + const json = this.json; + const parser = this; + + const nodeDef = json.nodes[ nodeIndex ]; + + const nodePending = parser._loadNodeShallow( nodeIndex ); + + const childPending = []; + const childrenDef = nodeDef.children || []; + + for ( let i = 0, il = childrenDef.length; i < il; i ++ ) { + + childPending.push( parser.getDependency( 'node', childrenDef[ i ] ) ); + + } + + const skeletonPending = nodeDef.skin === undefined + ? Promise.resolve( null ) + : parser.getDependency( 'skin', nodeDef.skin ); + + return Promise.all( [ + nodePending, + Promise.all( childPending ), + skeletonPending + ] ).then( function ( results ) { + + const node = results[ 0 ]; + const children = results[ 1 ]; + const skeleton = results[ 2 ]; + + if ( skeleton !== null ) { + + // This full traverse should be fine because + // child glTF nodes have not been added to this node yet. + node.traverse( function ( mesh ) { + + if ( ! mesh.isSkinnedMesh ) return; + + mesh.bind( skeleton, _identityMatrix ); + + } ); + + } + + for ( let i = 0, il = children.length; i < il; i ++ ) { + + node.add( children[ i ] ); + + } + + return node; + + } ); + + } + + // ._loadNodeShallow() parses a single node. + // skin and child nodes are created and added in .loadNode() (no '_' prefix). + _loadNodeShallow( nodeIndex ) { + + const json = this.json; + const extensions = this.extensions; + const parser = this; + + // This method is called from .loadNode() and .loadSkin(). + // Cache a node to avoid duplication. + + if ( this.nodeCache[ nodeIndex ] !== undefined ) { + + return this.nodeCache[ nodeIndex ]; + + } + + const nodeDef = json.nodes[ nodeIndex ]; + + // reserve node's name before its dependencies, so the root has the intended name. + const nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : ''; + + const pending = []; + + const meshPromise = parser._invokeOne( function ( ext ) { + + return ext.createNodeMesh && ext.createNodeMesh( nodeIndex ); + + } ); + + if ( meshPromise ) { + + pending.push( meshPromise ); + + } + + if ( nodeDef.camera !== undefined ) { + + pending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) { + + return parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera ); + + } ) ); + + } + + parser._invokeAll( function ( ext ) { + + return ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex ); + + } ).forEach( function ( promise ) { + + pending.push( promise ); + + } ); + + this.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) { + + let node; + + // .isBone isn't in glTF spec. See ._markDefs + if ( nodeDef.isBone === true ) { + + node = new Bone(); + + } else if ( objects.length > 1 ) { + + node = new Group(); + + } else if ( objects.length === 1 ) { + + node = objects[ 0 ]; + + } else { + + node = new Object3D(); + + } + + if ( node !== objects[ 0 ] ) { + + for ( let i = 0, il = objects.length; i < il; i ++ ) { + + node.add( objects[ i ] ); + + } + + } + + if ( nodeDef.name ) { + + node.userData.name = nodeDef.name; + node.name = nodeName; + + } + + assignExtrasToUserData( node, nodeDef ); + + if ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef ); + + if ( nodeDef.matrix !== undefined ) { + + const matrix = new Matrix4(); + matrix.fromArray( nodeDef.matrix ); + node.applyMatrix4( matrix ); + + } else { + + if ( nodeDef.translation !== undefined ) { + + node.position.fromArray( nodeDef.translation ); + + } + + if ( nodeDef.rotation !== undefined ) { + + node.quaternion.fromArray( nodeDef.rotation ); + + } + + if ( nodeDef.scale !== undefined ) { + + node.scale.fromArray( nodeDef.scale ); + + } + + } + + if ( ! parser.associations.has( node ) ) { + + parser.associations.set( node, {} ); + + } + + parser.associations.get( node ).nodes = nodeIndex; + + return node; + + } ); + + return this.nodeCache[ nodeIndex ]; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes + * @param {number} sceneIndex + * @return {Promise} + */ + loadScene( sceneIndex ) { + + const extensions = this.extensions; + const sceneDef = this.json.scenes[ sceneIndex ]; + const parser = this; + + // Loader returns Group, not Scene. + // See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172 + const scene = new Group(); + if ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name ); + + assignExtrasToUserData( scene, sceneDef ); + + if ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef ); + + const nodeIds = sceneDef.nodes || []; + + const pending = []; + + for ( let i = 0, il = nodeIds.length; i < il; i ++ ) { + + pending.push( parser.getDependency( 'node', nodeIds[ i ] ) ); + + } + + return Promise.all( pending ).then( function ( nodes ) { + + for ( let i = 0, il = nodes.length; i < il; i ++ ) { + + scene.add( nodes[ i ] ); + + } + + // Removes dangling associations, associations that reference a node that + // didn't make it into the scene. + const reduceAssociations = ( node ) => { + + const reducedAssociations = new Map(); + + for ( const [ key, value ] of parser.associations ) { + + if ( key instanceof Material$1 || key instanceof Texture$1 ) { + + reducedAssociations.set( key, value ); + + } + + } + + node.traverse( ( node ) => { + + const mappings = parser.associations.get( node ); + + if ( mappings != null ) { + + reducedAssociations.set( node, mappings ); + + } + + } ); + + return reducedAssociations; + + }; + + parser.associations = reduceAssociations( scene ); + + return scene; + + } ); + + } + + _createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) { + + const tracks = []; + + const targetName = node.name ? node.name : node.uuid; + const targetNames = []; + + if ( PATH_PROPERTIES$1[ target.path ] === PATH_PROPERTIES$1.weights ) { + + node.traverse( function ( object ) { + + if ( object.morphTargetInfluences ) { + + targetNames.push( object.name ? object.name : object.uuid ); + + } + + } ); + + } else { + + targetNames.push( targetName ); + + } + + let TypedKeyframeTrack; + + switch ( PATH_PROPERTIES$1[ target.path ] ) { + + case PATH_PROPERTIES$1.weights: + + TypedKeyframeTrack = NumberKeyframeTrack; + break; + + case PATH_PROPERTIES$1.rotation: + + TypedKeyframeTrack = QuaternionKeyframeTrack; + break; + + case PATH_PROPERTIES$1.position: + case PATH_PROPERTIES$1.scale: + + TypedKeyframeTrack = VectorKeyframeTrack; + break; + + default: + + switch ( outputAccessor.itemSize ) { + + case 1: + TypedKeyframeTrack = NumberKeyframeTrack; + break; + case 2: + case 3: + default: + TypedKeyframeTrack = VectorKeyframeTrack; + break; + + } + + break; + + } + + const interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear; + + + const outputArray = this._getArrayFromAccessor( outputAccessor ); + + for ( let j = 0, jl = targetNames.length; j < jl; j ++ ) { + + const track = new TypedKeyframeTrack( + targetNames[ j ] + '.' + PATH_PROPERTIES$1[ target.path ], + inputAccessor.array, + outputArray, + interpolation + ); + + // Override interpolation with custom factory method. + if ( sampler.interpolation === 'CUBICSPLINE' ) { + + this._createCubicSplineTrackInterpolant( track ); + + } + + tracks.push( track ); + + } + + return tracks; + + } + + _getArrayFromAccessor( accessor ) { + + let outputArray = accessor.array; + + if ( accessor.normalized ) { + + const scale = getNormalizedComponentScale( outputArray.constructor ); + const scaled = new Float32Array( outputArray.length ); + + for ( let j = 0, jl = outputArray.length; j < jl; j ++ ) { + + scaled[ j ] = outputArray[ j ] * scale; + + } + + outputArray = scaled; + + } + + return outputArray; + + } + + _createCubicSplineTrackInterpolant( track ) { + + track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) { + + // A CUBICSPLINE keyframe in glTF has three output values for each input value, + // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() + // must be divided by three to get the interpolant's sampleSize argument. + + const interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant; + + return new interpolantType( this.times, this.values, this.getValueSize() / 3, result ); + + }; + + // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants. + track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; + + } + +} + +/** + * @param {BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + */ +function computeBounds( geometry, primitiveDef, parser ) { + + const attributes = primitiveDef.attributes; + + const box = new Box3(); + + if ( attributes.POSITION !== undefined ) { + + const accessor = parser.json.accessors[ attributes.POSITION ]; + + const min = accessor.min; + const max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + box.set( + new Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), + new Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) + ); + + if ( accessor.normalized ) { + + const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); + box.min.multiplyScalar( boxScale ); + box.max.multiplyScalar( boxScale ); + + } + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + return; + + } + + } else { + + return; + + } + + const targets = primitiveDef.targets; + + if ( targets !== undefined ) { + + const maxDisplacement = new Vector3(); + const vector = new Vector3(); + + for ( let i = 0, il = targets.length; i < il; i ++ ) { + + const target = targets[ i ]; + + if ( target.POSITION !== undefined ) { + + const accessor = parser.json.accessors[ target.POSITION ]; + const min = accessor.min; + const max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + // we need to get max of absolute components because target weight is [-1,1] + vector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) ); + vector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) ); + vector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) ); + + + if ( accessor.normalized ) { + + const boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] ); + vector.multiplyScalar( boxScale ); + + } + + // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative + // to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets + // are used to implement key-frame animations and as such only two are active at a time - this results in very large + // boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size. + maxDisplacement.max( vector ); + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + } + + } + + } + + // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets. + box.expandByVector( maxDisplacement ); + + } + + geometry.boundingBox = box; + + const sphere = new Sphere(); + + box.getCenter( sphere.center ); + sphere.radius = box.min.distanceTo( box.max ) / 2; + + geometry.boundingSphere = sphere; + +} + +/** + * @param {BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + * @return {Promise} + */ +function addPrimitiveAttributes( geometry, primitiveDef, parser ) { + + const attributes = primitiveDef.attributes; + + const pending = []; + + function assignAttributeAccessor( accessorIndex, attributeName ) { + + return parser.getDependency( 'accessor', accessorIndex ) + .then( function ( accessor ) { + + geometry.setAttribute( attributeName, accessor ); + + } ); + + } + + for ( const gltfAttributeName in attributes ) { + + const threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); + + // Skip attributes already provided by e.g. Draco extension. + if ( threeAttributeName in geometry.attributes ) continue; + + pending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) ); + + } + + if ( primitiveDef.indices !== undefined && ! geometry.index ) { + + const accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) { + + geometry.setIndex( accessor ); + + } ); + + pending.push( accessor ); + + } + + if ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) { + + console.warn( `THREE.GLTFLoader: Converting vertex colors from "srgb-linear" to "${ColorManagement.workingColorSpace}" not supported.` ); + + } + + assignExtrasToUserData( geometry, primitiveDef ); + + computeBounds( geometry, primitiveDef, parser ); + + return Promise.all( pending ).then( function () { + + return primitiveDef.targets !== undefined + ? addMorphTargets( geometry, primitiveDef.targets, parser ) + : geometry; + + } ); + +} + +/** + * @author Deepkolos / https://github.com/deepkolos + */ + +class WorkerPool { + + constructor( pool = 4 ) { + + this.pool = pool; + this.queue = []; + this.workers = []; + this.workersResolve = []; + this.workerStatus = 0; + + } + + _initWorker( workerId ) { + + if ( ! this.workers[ workerId ] ) { + + const worker = this.workerCreator(); + worker.addEventListener( 'message', this._onMessage.bind( this, workerId ) ); + this.workers[ workerId ] = worker; + + } + + } + + _getIdleWorker() { + + for ( let i = 0; i < this.pool; i ++ ) + if ( ! ( this.workerStatus & ( 1 << i ) ) ) return i; + + return -1; + + } + + _onMessage( workerId, msg ) { + + const resolve = this.workersResolve[ workerId ]; + resolve && resolve( msg ); + + if ( this.queue.length ) { + + const { resolve, msg, transfer } = this.queue.shift(); + this.workersResolve[ workerId ] = resolve; + this.workers[ workerId ].postMessage( msg, transfer ); + + } else { + + this.workerStatus ^= 1 << workerId; + + } + + } + + setWorkerCreator( workerCreator ) { + + this.workerCreator = workerCreator; + + } + + setWorkerLimit( pool ) { + + this.pool = pool; + + } + + postMessage( msg, transfer ) { + + return new Promise( ( resolve ) => { + + const workerId = this._getIdleWorker(); + + if ( workerId !== -1 ) { + + this._initWorker( workerId ); + this.workerStatus |= 1 << workerId; + this.workersResolve[ workerId ] = resolve; + this.workers[ workerId ].postMessage( msg, transfer ); + + } else { + + this.queue.push( { resolve, msg, transfer } ); + + } + + } ); + + } + + dispose() { + + this.workers.forEach( ( worker ) => worker.terminate() ); + this.workersResolve.length = 0; + this.workers.length = 0; + this.queue.length = 0; + this.workerStatus = 0; + + } + +} + +const t=0,n=2,g$1=1,u=2,T=0,C$1=1,R=10,it=0,ct=9,yt=15,xt=16,wt=22,Ft=37,Ct=43,te$1=76,ae=83,ge=97,ue=100,we=103,Ae=109,In=165,Sn=166,pi=1000066e3;class Ii{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null;}}class Si{constructor(t,e,n,i){this._dataView=void 0,this._littleEndian=void 0,this._offset=void 0,this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0;}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint8Array(t){const e=new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+this._offset,t);return this._offset+=t,e}_skip(t){return this._offset+=t,this}_scan(t,e){ void 0===e&&(e=0);const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&iA.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,"base64"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0);}decode(A,g=0){if(!I)throw new Error("ZSTDDecoder: Await .init() before decoding.");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C="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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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"; + +const DisplayP3ColorSpace = 'display-p3'; +const LinearDisplayP3ColorSpace = 'display-p3-linear'; + +/** + * Loader for KTX 2.0 GPU Texture containers. + * + * KTX 2.0 is a container format for various GPU texture formats. The loader + * supports Basis Universal GPU textures, which can be quickly transcoded to + * a wide variety of GPU texture compression formats, as well as some + * uncompressed DataTexture and Data3DTexture formats. + * + * References: + * - KTX: http://github.khronos.org/KTX-Specification/ + * - DFD: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor + * - BasisU HDR: https://github.com/BinomialLLC/basis_universal/wiki/UASTC-HDR-Texture-Specification-v1.0 + */ + + +const _taskCache = new WeakMap(); + +let _activeLoaders = 0; + +let _zstd; + +class KTX2Loader extends Loader { + + constructor( manager ) { + + super( manager ); + + this.transcoderPath = ''; + this.transcoderBinary = null; + this.transcoderPending = null; + + this.workerPool = new WorkerPool(); + this.workerSourceURL = ''; + this.workerConfig = null; + + if ( typeof MSC_TRANSCODER !== 'undefined' ) { + + console.warn( + + 'THREE.KTX2Loader: Please update to latest "basis_transcoder".' + + ' "msc_basis_transcoder" is no longer supported in three.js r125+.' + + ); + + } + + } + + setTranscoderPath( path ) { + + this.transcoderPath = path; + + return this; + + } + + setWorkerLimit( num ) { + + this.workerPool.setWorkerLimit( num ); + + return this; + + } + + async detectSupportAsync( renderer ) { + + this.workerConfig = { + astcSupported: await renderer.hasFeatureAsync( 'texture-compression-astc' ), + astcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856 + etc1Supported: await renderer.hasFeatureAsync( 'texture-compression-etc1' ), + etc2Supported: await renderer.hasFeatureAsync( 'texture-compression-etc2' ), + dxtSupported: await renderer.hasFeatureAsync( 'texture-compression-bc' ), + bptcSupported: await renderer.hasFeatureAsync( 'texture-compression-bptc' ), + pvrtcSupported: await renderer.hasFeatureAsync( 'texture-compression-pvrtc' ) + }; + + return this; + + } + + detectSupport( renderer ) { + + if ( renderer.isWebGPURenderer === true ) { + + this.workerConfig = { + astcSupported: renderer.hasFeature( 'texture-compression-astc' ), + astcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856 + etc1Supported: renderer.hasFeature( 'texture-compression-etc1' ), + etc2Supported: renderer.hasFeature( 'texture-compression-etc2' ), + dxtSupported: renderer.hasFeature( 'texture-compression-bc' ), + bptcSupported: renderer.hasFeature( 'texture-compression-bptc' ), + pvrtcSupported: renderer.hasFeature( 'texture-compression-pvrtc' ) + }; + + } else { + + this.workerConfig = { + astcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ), + astcHDRSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ) + && renderer.extensions.get( 'WEBGL_compressed_texture_astc' ).getSupportedProfiles().includes( 'hdr' ), + etc1Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc1' ), + etc2Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc' ), + dxtSupported: renderer.extensions.has( 'WEBGL_compressed_texture_s3tc' ), + bptcSupported: renderer.extensions.has( 'EXT_texture_compression_bptc' ), + pvrtcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_pvrtc' ) + || renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ) + }; + + } + + return this; + + } + + init() { + + if ( ! this.transcoderPending ) { + + // Load transcoder wrapper. + const jsLoader = new FileLoader( this.manager ); + jsLoader.setPath( this.transcoderPath ); + jsLoader.setWithCredentials( this.withCredentials ); + const jsContent = jsLoader.loadAsync( 'basis_transcoder.js' ); + + // Load transcoder WASM binary. + const binaryLoader = new FileLoader( this.manager ); + binaryLoader.setPath( this.transcoderPath ); + binaryLoader.setResponseType( 'arraybuffer' ); + binaryLoader.setWithCredentials( this.withCredentials ); + const binaryContent = binaryLoader.loadAsync( 'basis_transcoder.wasm' ); + + this.transcoderPending = Promise.all( [ jsContent, binaryContent ] ) + .then( ( [ jsContent, binaryContent ] ) => { + + const fn = KTX2Loader.BasisWorker.toString(); + + const body = [ + '/* constants */', + 'let _EngineFormat = ' + JSON.stringify( KTX2Loader.EngineFormat ), + 'let _EngineType = ' + JSON.stringify( KTX2Loader.EngineType ), + 'let _TranscoderFormat = ' + JSON.stringify( KTX2Loader.TranscoderFormat ), + 'let _BasisFormat = ' + JSON.stringify( KTX2Loader.BasisFormat ), + '/* basis_transcoder.js */', + jsContent, + '/* worker */', + fn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) ) + ].join( '\n' ); + + this.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) ); + this.transcoderBinary = binaryContent; + + this.workerPool.setWorkerCreator( () => { + + const worker = new Worker( this.workerSourceURL ); + const transcoderBinary = this.transcoderBinary.slice( 0 ); + + worker.postMessage( { type: 'init', config: this.workerConfig, transcoderBinary }, [ transcoderBinary ] ); + + return worker; + + } ); + + } ); + + if ( _activeLoaders > 0 ) { + + // Each instance loads a transcoder and allocates workers, increasing network and memory cost. + + console.warn( + + 'THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.' + + ' Use a single KTX2Loader instance, or call .dispose() on old instances.' + + ); + + } + + _activeLoaders ++; + + } + + return this.transcoderPending; + + } + + load( url, onLoad, onProgress, onError ) { + + if ( this.workerConfig === null ) { + + throw new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' ); + + } + + const loader = new FileLoader( this.manager ); + + loader.setResponseType( 'arraybuffer' ); + loader.setWithCredentials( this.withCredentials ); + + loader.load( url, ( buffer ) => { + + this.parse( buffer, onLoad, onError ); + + }, onProgress, onError ); + + } + + parse( buffer, onLoad, onError ) { + + if ( this.workerConfig === null ) { + + throw new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' ); + + } + + // Check for an existing task using this buffer. A transferred buffer cannot be transferred + // again from this thread. + if ( _taskCache.has( buffer ) ) { + + const cachedTask = _taskCache.get( buffer ); + + return cachedTask.promise.then( onLoad ).catch( onError ); + + } + + this._createTexture( buffer ) + .then( ( texture ) => onLoad ? onLoad( texture ) : null ) + .catch( onError ); + + } + + _createTextureFrom( transcodeResult, container ) { + + const { type: messageType, error, data: { faces, width, height, format, type, dfdFlags } } = transcodeResult; + + if ( messageType === 'error' ) return Promise.reject( error ); + + let texture; + + if ( container.faceCount === 6 ) { + + texture = new CompressedCubeTexture( faces, format, type ); + + } else { + + const mipmaps = faces[ 0 ].mipmaps; + + texture = container.layerCount > 1 + ? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, type ) + : new CompressedTexture( mipmaps, width, height, format, type ); + + } + + texture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter; + texture.magFilter = LinearFilter; + texture.generateMipmaps = false; + + texture.needsUpdate = true; + texture.colorSpace = parseColorSpace( container ); + texture.premultiplyAlpha = !! ( dfdFlags & g$1 ); + + return texture; + + } + + /** + * @param {ArrayBuffer} buffer + * @param {?Object} config + * @return {Promise} + */ + async _createTexture( buffer, config = {} ) { + + const container = Pi( new Uint8Array( buffer ) ); + + // Basis UASTC HDR is a subset of ASTC, which can be transcoded efficiently + // to BC6H. To detect whether a KTX2 file uses Basis UASTC HDR, or default + // ASTC, inspect the DFD color model. + // + // Source: https://github.com/BinomialLLC/basis_universal/issues/381 + const isBasisHDR = container.vkFormat === pi + && container.dataFormatDescriptor[ 0 ].colorModel === 0xA7; + + // If the device supports ASTC, Basis UASTC HDR requires no transcoder. + const needsTranscoder = container.vkFormat === it + || isBasisHDR && ! this.workerConfig.astcHDRSupported; + + if ( ! needsTranscoder ) { + + return createRawTexture( container ); + + } + + // + const taskConfig = config; + const texturePending = this.init().then( () => { + + return this.workerPool.postMessage( { type: 'transcode', buffer, taskConfig: taskConfig }, [ buffer ] ); + + } ).then( ( e ) => this._createTextureFrom( e.data, container ) ); + + // Cache the task result. + _taskCache.set( buffer, { promise: texturePending } ); + + return texturePending; + + } + + dispose() { + + this.workerPool.dispose(); + if ( this.workerSourceURL ) URL.revokeObjectURL( this.workerSourceURL ); + + _activeLoaders --; + + return this; + + } + +} + + +/* CONSTANTS */ + +KTX2Loader.BasisFormat = { + ETC1S: 0, + UASTC: 1, + UASTC_HDR: 2, +}; + +// Source: https://github.com/BinomialLLC/basis_universal/blob/master/webgl/texture_test/index.html +KTX2Loader.TranscoderFormat = { + ETC1: 0, + ETC2: 1, + BC1: 2, + BC3: 3, + BC4: 4, + BC5: 5, + BC7_M6_OPAQUE_ONLY: 6, + BC7_M5: 7, + PVRTC1_4_RGB: 8, + PVRTC1_4_RGBA: 9, + ASTC_4x4: 10, + ATC_RGB: 11, + ATC_RGBA_INTERPOLATED_ALPHA: 12, + RGBA32: 13, + RGB565: 14, + BGR565: 15, + RGBA4444: 16, + BC6H: 22, + RGB_HALF: 24, + RGBA_HALF: 25, +}; + +KTX2Loader.EngineFormat = { + RGBAFormat: RGBAFormat, + RGBA_ASTC_4x4_Format: RGBA_ASTC_4x4_Format, + RGB_BPTC_UNSIGNED_Format: RGB_BPTC_UNSIGNED_Format, + RGBA_BPTC_Format: RGBA_BPTC_Format, + RGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format, + RGBA_PVRTC_4BPPV1_Format: RGBA_PVRTC_4BPPV1_Format, + RGBA_S3TC_DXT5_Format: RGBA_S3TC_DXT5_Format, + RGB_ETC1_Format: RGB_ETC1_Format, + RGB_ETC2_Format: RGB_ETC2_Format, + RGB_PVRTC_4BPPV1_Format: RGB_PVRTC_4BPPV1_Format, + RGBA_S3TC_DXT1_Format: RGBA_S3TC_DXT1_Format, +}; + +KTX2Loader.EngineType = { + UnsignedByteType: UnsignedByteType, + HalfFloatType: HalfFloatType, + FloatType: FloatType, +}; + +/* WEB WORKER */ + +KTX2Loader.BasisWorker = function () { + + let config; + let transcoderPending; + let BasisModule; + + const EngineFormat = _EngineFormat; // eslint-disable-line no-undef + const EngineType = _EngineType; // eslint-disable-line no-undef + const TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef + const BasisFormat = _BasisFormat; // eslint-disable-line no-undef + + self.addEventListener( 'message', function ( e ) { + + const message = e.data; + + switch ( message.type ) { + + case 'init': + config = message.config; + init( message.transcoderBinary ); + break; + + case 'transcode': + transcoderPending.then( () => { + + try { + + const { faces, buffers, width, height, hasAlpha, format, type, dfdFlags } = transcode( message.buffer ); + + self.postMessage( { type: 'transcode', id: message.id, data: { faces, width, height, hasAlpha, format, type, dfdFlags } }, buffers ); + + } catch ( error ) { + + console.error( error ); + + self.postMessage( { type: 'error', id: message.id, error: error.message } ); + + } + + } ); + break; + + } + + } ); + + function init( wasmBinary ) { + + transcoderPending = new Promise( ( resolve ) => { + + BasisModule = { wasmBinary, onRuntimeInitialized: resolve }; + BASIS( BasisModule ); // eslint-disable-line no-undef + + } ).then( () => { + + BasisModule.initializeBasis(); + + if ( BasisModule.KTX2File === undefined ) { + + console.warn( 'THREE.KTX2Loader: Please update Basis Universal transcoder.' ); + + } + + } ); + + } + + function transcode( buffer ) { + + const ktx2File = new BasisModule.KTX2File( new Uint8Array( buffer ) ); + + function cleanup() { + + ktx2File.close(); + ktx2File.delete(); + + } + + if ( ! ktx2File.isValid() ) { + + cleanup(); + throw new Error( 'THREE.KTX2Loader: Invalid or unsupported .ktx2 file' ); + + } + + let basisFormat; + + if ( ktx2File.isUASTC() ) { + + basisFormat = BasisFormat.UASTC; + + } else if ( ktx2File.isETC1S() ) { + + basisFormat = BasisFormat.ETC1S; + + } else if ( ktx2File.isHDR() ) { + + basisFormat = BasisFormat.UASTC_HDR; + + } else { + + throw new Error( 'THREE.KTX2Loader: Unknown Basis encoding' ); + + } + + const width = ktx2File.getWidth(); + const height = ktx2File.getHeight(); + const layerCount = ktx2File.getLayers() || 1; + const levelCount = ktx2File.getLevels(); + const faceCount = ktx2File.getFaces(); + const hasAlpha = ktx2File.getHasAlpha(); + const dfdFlags = ktx2File.getDFDFlags(); + + const { transcoderFormat, engineFormat, engineType } = getTranscoderFormat( basisFormat, width, height, hasAlpha ); + + if ( ! width || ! height || ! levelCount ) { + + cleanup(); + throw new Error( 'THREE.KTX2Loader: Invalid texture' ); + + } + + if ( ! ktx2File.startTranscoding() ) { + + cleanup(); + throw new Error( 'THREE.KTX2Loader: .startTranscoding failed' ); + + } + + const faces = []; + const buffers = []; + + for ( let face = 0; face < faceCount; face ++ ) { + + const mipmaps = []; + + for ( let mip = 0; mip < levelCount; mip ++ ) { + + const layerMips = []; + + let mipWidth, mipHeight; + + for ( let layer = 0; layer < layerCount; layer ++ ) { + + const levelInfo = ktx2File.getImageLevelInfo( mip, layer, face ); + + if ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) { + + console.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' ); + + } + + if ( levelCount > 1 ) { + + mipWidth = levelInfo.origWidth; + mipHeight = levelInfo.origHeight; + + } else { + + // Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with + // mipmaps must use multiple-of-four dimensions, for some texture formats and APIs. + // See mrdoob/three.js#25908. + mipWidth = levelInfo.width; + mipHeight = levelInfo.height; + + } + + let dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) ); + const status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, -1, -1 ); + + if ( engineType === EngineType.HalfFloatType ) { + + dst = new Uint16Array( dst.buffer, dst.byteOffset, dst.byteLength / Uint16Array.BYTES_PER_ELEMENT ); + + } + + if ( ! status ) { + + cleanup(); + throw new Error( 'THREE.KTX2Loader: .transcodeImage failed.' ); + + } + + layerMips.push( dst ); + + } + + const mipData = concat( layerMips ); + + mipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } ); + buffers.push( mipData.buffer ); + + } + + faces.push( { mipmaps, width, height, format: engineFormat, type: engineType } ); + + } + + cleanup(); + + return { faces, buffers, width, height, hasAlpha, dfdFlags, format: engineFormat, type: engineType }; + + } + + // + + // Optimal choice of a transcoder target format depends on the Basis format (ETC1S, UASTC, or + // UASTC HDR), device capabilities, and texture dimensions. The list below ranks the formats + // separately for each format. Currently, priority is assigned based on: + // + // high quality > low quality > uncompressed + // + // Prioritization may be revisited, or exposed for configuration, in the future. + // + // Reference: https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXDeveloperGuide.md + const FORMAT_OPTIONS = [ + { + if: 'astcSupported', + basisFormat: [ BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4 ], + engineFormat: [ EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: Infinity, + priorityUASTC: 1, + needsPowerOfTwo: false, + }, + { + if: 'bptcSupported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5 ], + engineFormat: [ EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 3, + priorityUASTC: 2, + needsPowerOfTwo: false, + }, + { + if: 'dxtSupported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.BC1, TranscoderFormat.BC3 ], + engineFormat: [ EngineFormat.RGBA_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 4, + priorityUASTC: 5, + needsPowerOfTwo: false, + }, + { + if: 'etc2Supported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.ETC1, TranscoderFormat.ETC2 ], + engineFormat: [ EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 1, + priorityUASTC: 3, + needsPowerOfTwo: false, + }, + { + if: 'etc1Supported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.ETC1 ], + engineFormat: [ EngineFormat.RGB_ETC1_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 2, + priorityUASTC: 4, + needsPowerOfTwo: false, + }, + { + if: 'pvrtcSupported', + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA ], + engineFormat: [ EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format ], + engineType: [ EngineType.UnsignedByteType ], + priorityETC1S: 5, + priorityUASTC: 6, + needsPowerOfTwo: true, + }, + { + if: 'bptcSupported', + basisFormat: [ BasisFormat.UASTC_HDR ], + transcoderFormat: [ TranscoderFormat.BC6H ], + engineFormat: [ EngineFormat.RGB_BPTC_UNSIGNED_Format ], + engineType: [ EngineType.HalfFloatType ], + priorityHDR: 1, + needsPowerOfTwo: false, + }, + + // Uncompressed fallbacks. + + { + basisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ], + transcoderFormat: [ TranscoderFormat.RGBA32, TranscoderFormat.RGBA32 ], + engineFormat: [ EngineFormat.RGBAFormat, EngineFormat.RGBAFormat ], + engineType: [ EngineType.UnsignedByteType, EngineType.UnsignedByteType ], + priorityETC1S: 100, + priorityUASTC: 100, + needsPowerOfTwo: false, + }, + { + basisFormat: [ BasisFormat.UASTC_HDR ], + transcoderFormat: [ TranscoderFormat.RGBA_HALF ], + engineFormat: [ EngineFormat.RGBAFormat ], + engineType: [ EngineType.HalfFloatType ], + priorityHDR: 100, + needsPowerOfTwo: false, + } + ]; + + const OPTIONS = { + // TODO: For ETC1S we intentionally sort by _UASTC_ priority, preserving + // a historical accident shown to avoid performance pitfalls for Linux with + // Firefox & AMD GPU (RadeonSI). Further work needed. + // See https://github.com/mrdoob/three.js/pull/29730. + [ BasisFormat.ETC1S ]: FORMAT_OPTIONS + .filter( ( opt ) => opt.basisFormat.includes( BasisFormat.ETC1S ) ) + .sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ), + + [ BasisFormat.UASTC ]: FORMAT_OPTIONS + .filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC ) ) + .sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ), + + [ BasisFormat.UASTC_HDR ]: FORMAT_OPTIONS + .filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC_HDR ) ) + .sort( ( a, b ) => a.priorityHDR - b.priorityHDR ), + }; + + function getTranscoderFormat( basisFormat, width, height, hasAlpha ) { + + const options = OPTIONS[ basisFormat ]; + + for ( let i = 0; i < options.length; i ++ ) { + + const opt = options[ i ]; + + if ( opt.if && ! config[ opt.if ] ) continue; + if ( ! opt.basisFormat.includes( basisFormat ) ) continue; + if ( hasAlpha && opt.transcoderFormat.length < 2 ) continue; + if ( opt.needsPowerOfTwo && ! ( isPowerOfTwo( width ) && isPowerOfTwo( height ) ) ) continue; + + const transcoderFormat = opt.transcoderFormat[ hasAlpha ? 1 : 0 ]; + const engineFormat = opt.engineFormat[ hasAlpha ? 1 : 0 ]; + const engineType = opt.engineType[ 0 ]; + + return { transcoderFormat, engineFormat, engineType }; + + } + + throw new Error( 'THREE.KTX2Loader: Failed to identify transcoding target.' ); + + } + + function isPowerOfTwo( value ) { + + if ( value <= 2 ) return true; + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + } + + /** + * Concatenates N byte arrays. + * + * @param {Uint8Array[]} arrays + * @return {Uint8Array} + */ + function concat( arrays ) { + + if ( arrays.length === 1 ) return arrays[ 0 ]; + + let totalByteLength = 0; + + for ( let i = 0; i < arrays.length; i ++ ) { + + const array = arrays[ i ]; + totalByteLength += array.byteLength; + + } + + const result = new Uint8Array( totalByteLength ); + + let byteOffset = 0; + + for ( let i = 0; i < arrays.length; i ++ ) { + + const array = arrays[ i ]; + result.set( array, byteOffset ); + + byteOffset += array.byteLength; + + } + + return result; + + } + +}; + +// Parsing for non-Basis textures. These textures may have supercompression +// like Zstd, but they do not require transcoding. + +const UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGFormat, RedFormat ] ); + +const FORMAT_MAP = { + + [ Ae ]: RGBAFormat, + [ ge ]: RGBAFormat, + [ Ft ]: RGBAFormat, + [ Ct ]: RGBAFormat, + + [ we ]: RGFormat, + [ ae ]: RGFormat, + [ xt ]: RGFormat, + [ wt ]: RGFormat, + + [ ue ]: RedFormat, + [ te$1 ]: RedFormat, + [ yt ]: RedFormat, + [ ct ]: RedFormat, + + [ pi ]: RGBA_ASTC_4x4_Format, + [ Sn ]: RGBA_ASTC_6x6_Format, + [ In ]: RGBA_ASTC_6x6_Format, + +}; + +const TYPE_MAP = { + + [ Ae ]: FloatType, + [ ge ]: HalfFloatType, + [ Ft ]: UnsignedByteType, + [ Ct ]: UnsignedByteType, + + [ we ]: FloatType, + [ ae ]: HalfFloatType, + [ xt ]: UnsignedByteType, + [ wt ]: UnsignedByteType, + + [ ue ]: FloatType, + [ te$1 ]: HalfFloatType, + [ yt ]: UnsignedByteType, + [ ct ]: UnsignedByteType, + + [ pi ]: HalfFloatType, + [ Sn ]: UnsignedByteType, + [ In ]: UnsignedByteType, + +}; + +async function createRawTexture( container ) { + + const { vkFormat } = container; + + if ( FORMAT_MAP[ vkFormat ] === undefined ) { + + throw new Error( 'THREE.KTX2Loader: Unsupported vkFormat.' ); + + } + + // + + let zstd; + + if ( container.supercompressionScheme === n ) { + + if ( ! _zstd ) { + + _zstd = new Promise( async ( resolve ) => { + + const zstd = new Q(); + await zstd.init(); + resolve( zstd ); + + } ); + + } + + zstd = await _zstd; + + } + + // + + const mipmaps = []; + + + for ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) { + + const levelWidth = Math.max( 1, container.pixelWidth >> levelIndex ); + const levelHeight = Math.max( 1, container.pixelHeight >> levelIndex ); + const levelDepth = container.pixelDepth ? Math.max( 1, container.pixelDepth >> levelIndex ) : 0; + + const level = container.levels[ levelIndex ]; + + let levelData; + + if ( container.supercompressionScheme === t ) { + + levelData = level.levelData; + + } else if ( container.supercompressionScheme === n ) { + + levelData = zstd.decode( level.levelData, level.uncompressedByteLength ); + + } else { + + throw new Error( 'THREE.KTX2Loader: Unsupported supercompressionScheme.' ); + + } + + let data; + + if ( TYPE_MAP[ vkFormat ] === FloatType ) { + + data = new Float32Array( + + levelData.buffer, + levelData.byteOffset, + levelData.byteLength / Float32Array.BYTES_PER_ELEMENT + + ); + + } else if ( TYPE_MAP[ vkFormat ] === HalfFloatType ) { + + data = new Uint16Array( + + levelData.buffer, + levelData.byteOffset, + levelData.byteLength / Uint16Array.BYTES_PER_ELEMENT + + ); + + } else { + + data = levelData; + + } + + mipmaps.push( { + + data: data, + width: levelWidth, + height: levelHeight, + depth: levelDepth, + + } ); + + } + + let texture; + + if ( UNCOMPRESSED_FORMATS.has( FORMAT_MAP[ vkFormat ] ) ) { + + texture = container.pixelDepth === 0 + ? new DataTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight ) + : new Data3DTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight, container.pixelDepth ); + + } else { + + if ( container.pixelDepth > 0 ) throw new Error( 'THREE.KTX2Loader: Unsupported pixelDepth.' ); + + texture = new CompressedTexture( mipmaps, container.pixelWidth, container.pixelHeight ); + + texture.minFilter = mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter; + texture.magFilter = LinearFilter; + + } + + texture.mipmaps = mipmaps; + + texture.type = TYPE_MAP[ vkFormat ]; + texture.format = FORMAT_MAP[ vkFormat ]; + texture.colorSpace = parseColorSpace( container ); + texture.needsUpdate = true; + + // + + return Promise.resolve( texture ); + +} + +function parseColorSpace( container ) { + + const dfd = container.dataFormatDescriptor[ 0 ]; + + if ( dfd.colorPrimaries === C$1 ) { + + return dfd.transferFunction === u ? SRGBColorSpace : LinearSRGBColorSpace; + + } else if ( dfd.colorPrimaries === R ) { + + return dfd.transferFunction === u ? DisplayP3ColorSpace : LinearDisplayP3ColorSpace; + + } else if ( dfd.colorPrimaries === T ) { + + return NoColorSpace; + + } else { + + console.warn( `THREE.KTX2Loader: Unsupported color primaries, "${ dfd.colorPrimaries }"` ); + return NoColorSpace; + + } + +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$9, _b$9; +const $retainerCount = Symbol('retainerCount'); +const $recentlyUsed = Symbol('recentlyUsed'); +const $evict = Symbol('evict'); +const $evictionThreshold = Symbol('evictionThreshold'); +const $cache = Symbol('cache'); +/** + * The CacheEvictionPolicy manages the lifecycle for items in a cache, + * evicting any items outside some threshold bounds in "recently used" order, + * if they are evictable. + * + * Items are considered cached as they are retained. When all retainers + * of an item release it, that item is considered evictable. + */ +class CacheEvictionPolicy { + constructor(cache, evictionThreshold = 5) { + this[_a$9] = new Map(); + this[_b$9] = []; + this[$cache] = cache; + this[$evictionThreshold] = evictionThreshold; + } + /** + * The eviction threshold is the maximum number of items to hold + * in cache indefinitely. Items within the threshold (in recently + * used order) will continue to be cached even if they have zero + * retainers. + */ + set evictionThreshold(value) { + this[$evictionThreshold] = value; + this[$evict](); + } + get evictionThreshold() { + return this[$evictionThreshold]; + } + /** + * A reference to the cache that operates under this policy + */ + get cache() { + return this[$cache]; + } + /** + * Given an item key, returns the number of retainers of that item + */ + retainerCount(key) { + return this[$retainerCount].get(key) || 0; + } + /** + * Resets the internal tracking of cache item retainers. Use only in cases + * where it is certain that all retained cache items have been accounted for! + */ + reset() { + this[$retainerCount].clear(); + this[$recentlyUsed] = []; + } + /** + * Mark a given cache item as retained, where the item is represented + * by its key. An item can have any number of retainers. + */ + retain(key) { + if (!this[$retainerCount].has(key)) { + this[$retainerCount].set(key, 0); + } + this[$retainerCount].set(key, this[$retainerCount].get(key) + 1); + const recentlyUsedIndex = this[$recentlyUsed].indexOf(key); + if (recentlyUsedIndex !== -1) { + this[$recentlyUsed].splice(recentlyUsedIndex, 1); + } + this[$recentlyUsed].unshift(key); + // Evict, in case retaining a new item pushed an evictable item beyond the + // eviction threshold + this[$evict](); + } + /** + * Mark a given cache item as released by one of its retainers, where the item + * is represented by its key. When all retainers of an item have released it, + * the item is considered evictable. + */ + release(key) { + if (this[$retainerCount].has(key)) { + this[$retainerCount].set(key, Math.max(this[$retainerCount].get(key) - 1, 0)); + } + this[$evict](); + } + [(_a$9 = $retainerCount, _b$9 = $recentlyUsed, $evict)]() { + if (this[$recentlyUsed].length < this[$evictionThreshold]) { + return; + } + for (let i = this[$recentlyUsed].length - 1; i >= this[$evictionThreshold]; --i) { + const key = this[$recentlyUsed][i]; + const retainerCount = this[$retainerCount].get(key); + if (retainerCount === 0) { + this[$cache].delete(key); + this[$recentlyUsed].splice(i, 1); + } + } + } +} + +/* @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * KHR_materials_variants specification allows duplicated variant names + * but it makes handling the extension complex. + * We ensure tha names and make it easier. + * If you want to export the extension with the original names + * you are recommended to write GLTFExporter plugin to restore the names. + * + * @param variantNames {Array} + * @return {Array} + */ +const ensureUniqueNames = (variantNames) => { + const uniqueNames = []; + const knownNames = new Set(); + for (const name of variantNames) { + let uniqueName = name; + let suffix = 0; + // @TODO: An easy solution. + // O(N^2) in the worst scenario where N is variantNames.length. + // Fix me if needed. + while (knownNames.has(uniqueName)) { + uniqueName = name + '.' + (++suffix); + } + knownNames.add(uniqueName); + uniqueNames.push(uniqueName); + } + return uniqueNames; +}; +/** + * Convert mappings array to table object to make handling the extension easier. + * + * @param + * extensionDef {glTF.meshes[n].primitive.extensions.KHR_materials_variants} + * @param variantNames {Array} Required to be unique names + * @return {Map} + */ +const mappingsArrayToTable = (extensionDef) => { + const table = new Map(); + for (const mapping of extensionDef.mappings) { + for (const variant of mapping.variants) { + table.set(variant, { material: null, gltfMaterialIndex: mapping.material }); + } + } + return table; +}; +class GLTFMaterialsVariantsExtension { + constructor(parser) { + this.parser = parser; + this.name = 'KHR_materials_variants'; + } + // Note that the following properties will be overridden even if they are + // pre-defined + // - gltf.userData.variants + // - mesh.userData.variantMaterials + afterRoot(gltf) { + const parser = this.parser; + const json = parser.json; + if (json.extensions === undefined || + json.extensions[this.name] === undefined) { + return null; + } + const extensionDef = json.extensions[this.name]; + const variantsDef = extensionDef.variants || []; + const variants = ensureUniqueNames(variantsDef.map((v) => v.name)); + for (const scene of gltf.scenes) { + // Save the variants data under associated mesh.userData + scene.traverse(object => { + const mesh = object; + if (!mesh.material) { + return; + } + const association = parser.associations.get(mesh); + if (association == null || association.meshes == null || + association.primitives == null) { + return; + } + const meshDef = json.meshes[association.meshes]; + const primitivesDef = meshDef.primitives; + const primitiveDef = primitivesDef[association.primitives]; + const extensionsDef = primitiveDef.extensions; + if (!extensionsDef || !extensionsDef[this.name]) { + return; + } + mesh.userData.variantMaterials = + mappingsArrayToTable(extensionsDef[this.name]); + }); + } + gltf.userData.variants = variants; + return Promise.resolve(); + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$8, _b$8; +Texture$1.DEFAULT_ANISOTROPY = 4; +/** + * A helper to Promise-ify a Three.js GLTFLoader + */ +const loadWithLoader = (url, loader, progressCallback = () => { }) => { + const onProgress = (event) => { + const fraction = event.loaded / event.total; + progressCallback(Math.max(0, Math.min(1, isFinite(fraction) ? fraction : 1))); + }; + return new Promise((resolve, reject) => { + loader.load(url, resolve, onProgress, reject); + }); +}; +/** Helper to load a script tag. */ +const fetchScript = (src) => { + return new Promise((resolve, reject) => { + const script = document.createElement('script'); + document.body.appendChild(script); + script.onload = resolve; + script.onerror = reject; + script.async = true; + script.src = src; + }); +}; +const cache = new Map(); +const preloaded = new Map(); +let dracoDecoderLocation; +const dracoLoader = new DRACOLoader(); +let ktx2TranscoderLocation; +const ktx2Loader = new KTX2Loader(); +let meshoptDecoderLocation; +let meshoptDecoder; +const $loader = Symbol('loader'); +const $evictionPolicy = Symbol('evictionPolicy'); +const $GLTFInstance = Symbol('GLTFInstance'); +class CachingGLTFLoader extends EventDispatcher { + static setDRACODecoderLocation(url) { + dracoDecoderLocation = url; + dracoLoader.setDecoderPath(url); + } + static getDRACODecoderLocation() { + return dracoDecoderLocation; + } + static setKTX2TranscoderLocation(url) { + ktx2TranscoderLocation = url; + ktx2Loader.setTranscoderPath(url); + } + static getKTX2TranscoderLocation() { + return ktx2TranscoderLocation; + } + static setMeshoptDecoderLocation(url) { + if (meshoptDecoderLocation !== url) { + meshoptDecoderLocation = url; + meshoptDecoder = fetchScript(url) + .then(() => MeshoptDecoder.ready) + .then(() => MeshoptDecoder); + } + } + static getMeshoptDecoderLocation() { + return meshoptDecoderLocation; + } + static initializeKTX2Loader(renderer) { + ktx2Loader.detectSupport(renderer); + } + static get cache() { + return cache; + } + /** @nocollapse */ + static clearCache() { + cache.forEach((_value, url) => { + this.delete(url); + }); + this[$evictionPolicy].reset(); + } + static has(url) { + return cache.has(url); + } + /** @nocollapse */ + static async delete(url) { + if (!this.has(url)) { + return; + } + const gltfLoads = cache.get(url); + preloaded.delete(url); + cache.delete(url); + const gltf = await gltfLoads; + // Dispose of the cached glTF's materials and geometries: + gltf.dispose(); + } + /** + * Returns true if the model that corresponds to the specified url is + * available in our local cache. + */ + static hasFinishedLoading(url) { + return !!preloaded.get(url); + } + constructor(GLTFInstance) { + super(); + this[_b$8] = new GLTFLoader().register(parser => new GLTFMaterialsVariantsExtension(parser)); + this[$GLTFInstance] = GLTFInstance; + this[$loader].setDRACOLoader(dracoLoader); + this[$loader].setKTX2Loader(ktx2Loader); + } + get [(_a$8 = $evictionPolicy, _b$8 = $loader, $evictionPolicy)]() { + return this.constructor[$evictionPolicy]; + } + /** + * Preloads a glTF, populating the cache. Returns a promise that resolves + * when the cache is populated. + */ + async preload(url, element, progressCallback = () => { }) { + this[$loader].setWithCredentials(element.withCredentials); + this.dispatchEvent({ type: 'preload', element: element, src: url }); + if (!cache.has(url)) { + if (meshoptDecoder != null) { + this[$loader].setMeshoptDecoder(await meshoptDecoder); + } + const rawGLTFLoads = loadWithLoader(url, this[$loader], (progress) => { + progressCallback(progress * 0.8); + }); + const GLTFInstance = this[$GLTFInstance]; + const gltfInstanceLoads = rawGLTFLoads + .then((rawGLTF) => { + return GLTFInstance.prepare(rawGLTF); + }) + .then((preparedGLTF) => { + progressCallback(0.9); + return new GLTFInstance(preparedGLTF); + }) + .catch((reason => { + console.error(reason); + return new GLTFInstance(); + })); + cache.set(url, gltfInstanceLoads); + } + await cache.get(url); + preloaded.set(url, true); + if (progressCallback) { + progressCallback(1.0); + } + } + /** + * Loads a glTF from the specified url and resolves a unique clone of the + * glTF. If the glTF has already been loaded, makes a clone of the cached + * copy. + */ + async load(url, element, progressCallback = () => { }) { + await this.preload(url, element, progressCallback); + const gltf = await cache.get(url); + const clone = await gltf.clone(); + this[$evictionPolicy].retain(url); + // Patch dispose so that we can properly account for instance use + // in the caching layer: + clone.dispose = () => { + this[$evictionPolicy].release(url); + }; + return clone; + } +} +CachingGLTFLoader[_a$8] = new CacheEvictionPolicy(CachingGLTFLoader); + +class CSS2DObject extends Object3D { + + constructor( element = document.createElement( 'div' ) ) { + + super(); + + this.isCSS2DObject = true; + + this.element = element; + + this.element.style.position = 'absolute'; + this.element.style.userSelect = 'none'; + + this.element.setAttribute( 'draggable', false ); + + this.center = new Vector2( 0.5, 0.5 ); // ( 0, 0 ) is the lower left; ( 1, 1 ) is the top right + + this.addEventListener( 'removed', function () { + + this.traverse( function ( object ) { + + if ( + object.element instanceof object.element.ownerDocument.defaultView.Element && + object.element.parentNode !== null + ) { + + object.element.remove(); + + } + + } ); + + } ); + + } + + copy( source, recursive ) { + + super.copy( source, recursive ); + + this.element = source.element.cloneNode( true ); + + this.center = source.center; + + return this; + + } + +} + +// + +const _vector = new Vector3(); +const _viewMatrix = new Matrix4(); +const _viewProjectionMatrix = new Matrix4(); +const _a$7 = new Vector3(); +const _b$7 = new Vector3(); + +class CSS2DRenderer { + + constructor( parameters = {} ) { + + const _this = this; + + let _width, _height; + let _widthHalf, _heightHalf; + + const cache = { + objects: new WeakMap() + }; + + const domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' ); + + domElement.style.overflow = 'hidden'; + + this.domElement = domElement; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.render = function ( scene, camera ) { + + if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld(); + if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld(); + + _viewMatrix.copy( camera.matrixWorldInverse ); + _viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix ); + + renderObject( scene, scene, camera ); + zOrder( scene ); + + }; + + this.setSize = function ( width, height ) { + + _width = width; + _height = height; + + _widthHalf = _width / 2; + _heightHalf = _height / 2; + + domElement.style.width = width + 'px'; + domElement.style.height = height + 'px'; + + }; + + function hideObject( object ) { + + if ( object.isCSS2DObject ) object.element.style.display = 'none'; + + for ( let i = 0, l = object.children.length; i < l; i ++ ) { + + hideObject( object.children[ i ] ); + + } + + } + + function renderObject( object, scene, camera ) { + + if ( object.visible === false ) { + + hideObject( object ); + + return; + + } + + if ( object.isCSS2DObject ) { + + _vector.setFromMatrixPosition( object.matrixWorld ); + _vector.applyMatrix4( _viewProjectionMatrix ); + + const visible = ( _vector.z >= -1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true ); + + const element = object.element; + element.style.display = visible === true ? '' : 'none'; + + if ( visible === true ) { + + object.onBeforeRender( _this, scene, camera ); + + element.style.transform = 'translate(' + ( -100 * object.center.x ) + '%,' + ( -100 * object.center.y ) + '%)' + 'translate(' + ( _vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - _vector.y * _heightHalf + _heightHalf ) + 'px)'; + + if ( element.parentNode !== domElement ) { + + domElement.appendChild( element ); + + } + + object.onAfterRender( _this, scene, camera ); + + } + + const objectData = { + distanceToCameraSquared: getDistanceToSquared( camera, object ) + }; + + cache.objects.set( object, objectData ); + + } + + for ( let i = 0, l = object.children.length; i < l; i ++ ) { + + renderObject( object.children[ i ], scene, camera ); + + } + + } + + function getDistanceToSquared( object1, object2 ) { + + _a$7.setFromMatrixPosition( object1.matrixWorld ); + _b$7.setFromMatrixPosition( object2.matrixWorld ); + + return _a$7.distanceToSquared( _b$7 ); + + } + + function filterAndFlatten( scene ) { + + const result = []; + + scene.traverseVisible( function ( object ) { + + if ( object.isCSS2DObject ) result.push( object ); + + } ); + + return result; + + } + + function zOrder( scene ) { + + const sorted = filterAndFlatten( scene ).sort( function ( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return b.renderOrder - a.renderOrder; + + } + + const distanceA = cache.objects.get( a ).distanceToCameraSquared; + const distanceB = cache.objects.get( b ).distanceToCameraSquared; + + return distanceA - distanceB; + + } ); + + const zMax = sorted.length; + + for ( let i = 0, l = sorted.length; i < l; i ++ ) { + + sorted[ i ].element.style.zIndex = zMax - i; + + } + + } + + } + +} + +function reduceVertices( object, func, initialValue ) { + + let value = initialValue; + const vertex = new Vector3(); + + object.updateWorldMatrix( true, true ); + + object.traverseVisible( ( child ) => { + + const { geometry } = child; + + if ( geometry !== undefined ) { + + const { position } = geometry.attributes; + + if ( position !== undefined ) { + + for ( let i = 0, l = position.count; i < l; i ++ ) { + + if ( child.isMesh ) { + + child.getVertexPosition( i, vertex ); + + } else { + + vertex.fromBufferAttribute( position, i ); + + } + + if ( ! child.isSkinnedMesh ) { + + vertex.applyMatrix4( child.matrixWorld ); + + } + + value = func( value, vertex ); + + } + + } + + } + + } ); + + return value; + +} + +/** + * The KHR_mesh_quantization extension allows these extra attribute component types + * + * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md#extending-mesh-attributes + */ +const KHR_mesh_quantization_ExtraAttrTypes = { + POSITION: [ + 'byte', + 'byte normalized', + 'unsigned byte', + 'unsigned byte normalized', + 'short', + 'short normalized', + 'unsigned short', + 'unsigned short normalized', + ], + NORMAL: [ + 'byte normalized', + 'short normalized', + ], + TANGENT: [ + 'byte normalized', + 'short normalized', + ], + TEXCOORD: [ + 'byte', + 'byte normalized', + 'unsigned byte', + 'short', + 'short normalized', + 'unsigned short', + ], +}; + + +class GLTFExporter { + + constructor() { + + this.textureUtils = null; + + this.pluginCallbacks = []; + + this.register( function ( writer ) { + + return new GLTFLightExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsUnlitExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsTransmissionExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsVolumeExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsIorExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsSpecularExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsClearcoatExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsDispersionExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsIridescenceExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsSheenExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsAnisotropyExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsEmissiveStrengthExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMaterialsBumpExtension( writer ); + + } ); + + this.register( function ( writer ) { + + return new GLTFMeshGpuInstancing( writer ); + + } ); + + } + + register( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) === -1 ) { + + this.pluginCallbacks.push( callback ); + + } + + return this; + + } + + unregister( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) !== -1 ) { + + this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 ); + + } + + return this; + + } + + setTextureUtils( utils ) { + + this.textureUtils = utils; + + return this; + + } + + /** + * Parse scenes and generate GLTF output + * + * @param {Scene|Array} input Scene or Array of THREE.Scenes + * @param {Function} onDone Callback on completed + * @param {Function} onError Callback on errors + * @param {Object} options options + */ + parse( input, onDone, onError, options ) { + + const writer = new GLTFWriter(); + const plugins = []; + + for ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) { + + plugins.push( this.pluginCallbacks[ i ]( writer ) ); + + } + + writer.setPlugins( plugins ); + writer.setTextureUtils( this.textureUtils ); + writer.writeAsync( input, onDone, options ).catch( onError ); + + } + + parseAsync( input, options ) { + + const scope = this; + + return new Promise( function ( resolve, reject ) { + + scope.parse( input, resolve, reject, options ); + + } ); + + } + +} + +//------------------------------------------------------------------------------ +// Constants +//------------------------------------------------------------------------------ + +const WEBGL_CONSTANTS = { + POINTS: 0x0000, + LINES: 0x0001, + LINE_LOOP: 0x0002, + LINE_STRIP: 0x0003, + TRIANGLES: 0x0004, + BYTE: 0x1400, + UNSIGNED_BYTE: 0x1401, + SHORT: 0x1402, + UNSIGNED_SHORT: 0x1403, + INT: 0x1404, + UNSIGNED_INT: 0x1405, + FLOAT: 0x1406, + + ARRAY_BUFFER: 0x8892, + ELEMENT_ARRAY_BUFFER: 0x8893, + + NEAREST: 0x2600, + LINEAR: 0x2601, + NEAREST_MIPMAP_NEAREST: 0x2700, + LINEAR_MIPMAP_NEAREST: 0x2701, + NEAREST_MIPMAP_LINEAR: 0x2702, + LINEAR_MIPMAP_LINEAR: 0x2703, + + CLAMP_TO_EDGE: 33071, + MIRRORED_REPEAT: 33648, + REPEAT: 10497 +}; + +const KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization'; + +const THREE_TO_WEBGL = {}; + +THREE_TO_WEBGL[ NearestFilter ] = WEBGL_CONSTANTS.NEAREST; +THREE_TO_WEBGL[ NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST; +THREE_TO_WEBGL[ NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR; +THREE_TO_WEBGL[ LinearFilter ] = WEBGL_CONSTANTS.LINEAR; +THREE_TO_WEBGL[ LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST; +THREE_TO_WEBGL[ LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR; + +THREE_TO_WEBGL[ ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE; +THREE_TO_WEBGL[ RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT; +THREE_TO_WEBGL[ MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT; + +const PATH_PROPERTIES = { + scale: 'scale', + position: 'translation', + quaternion: 'rotation', + morphTargetInfluences: 'weights' +}; + +const DEFAULT_SPECULAR_COLOR = new Color(); + +// GLB constants +// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification + +const GLB_HEADER_BYTES = 12; +const GLB_HEADER_MAGIC = 0x46546C67; +const GLB_VERSION = 2; + +const GLB_CHUNK_PREFIX_BYTES = 8; +const GLB_CHUNK_TYPE_JSON = 0x4E4F534A; +const GLB_CHUNK_TYPE_BIN = 0x004E4942; + +//------------------------------------------------------------------------------ +// Utility functions +//------------------------------------------------------------------------------ + +/** + * Compare two arrays + * @param {Array} array1 Array 1 to compare + * @param {Array} array2 Array 2 to compare + * @return {boolean} Returns true if both arrays are equal + */ +function equalArray( array1, array2 ) { + + return ( array1.length === array2.length ) && array1.every( function ( element, index ) { + + return element === array2[ index ]; + + } ); + +} + +/** + * Converts a string to an ArrayBuffer. + * @param {string} text + * @return {ArrayBuffer} + */ +function stringToArrayBuffer( text ) { + + return new TextEncoder().encode( text ).buffer; + +} + +/** + * Is identity matrix + * + * @param {Matrix4} matrix + * @returns {boolean} Returns true, if parameter is identity matrix + */ +function isIdentityMatrix( matrix ) { + + return equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] ); + +} + +/** + * Get the min and max vectors from the given attribute + * + * @param {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count + * @param {number} start Start index + * @param {number} count Range to cover + * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components) + */ +function getMinMax( attribute, start, count ) { + + const output = { + + min: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ), + max: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY ) + + }; + + for ( let i = start; i < start + count; i ++ ) { + + for ( let a = 0; a < attribute.itemSize; a ++ ) { + + let value; + + if ( attribute.itemSize > 4 ) { + + // no support for interleaved data for itemSize > 4 + + value = attribute.array[ i * attribute.itemSize + a ]; + + } else { + + if ( a === 0 ) value = attribute.getX( i ); + else if ( a === 1 ) value = attribute.getY( i ); + else if ( a === 2 ) value = attribute.getZ( i ); + else if ( a === 3 ) value = attribute.getW( i ); + + if ( attribute.normalized === true ) { + + value = MathUtils.normalize( value, attribute.array ); + + } + + } + + output.min[ a ] = Math.min( output.min[ a ], value ); + output.max[ a ] = Math.max( output.max[ a ], value ); + + } + + } + + return output; + +} + +/** + * Get the required size + padding for a buffer, rounded to the next 4-byte boundary. + * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment + * + * @param {number} bufferSize The size the original buffer. Should be an integer. + * @returns {number} new buffer size with required padding as an integer. + * + */ +function getPaddedBufferSize( bufferSize ) { + + return Math.ceil( bufferSize / 4 ) * 4; + +} + +/** + * Returns a buffer aligned to 4-byte boundary. + * + * @param {ArrayBuffer} arrayBuffer Buffer to pad + * @param {number} [paddingByte=0] Should be an integer + * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer + */ +function getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) { + + const paddedLength = getPaddedBufferSize( arrayBuffer.byteLength ); + + if ( paddedLength !== arrayBuffer.byteLength ) { + + const array = new Uint8Array( paddedLength ); + array.set( new Uint8Array( arrayBuffer ) ); + + if ( paddingByte !== 0 ) { + + for ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) { + + array[ i ] = paddingByte; + + } + + } + + return array.buffer; + + } + + return arrayBuffer; + +} + +function getCanvas() { + + if ( typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined' ) { + + return new OffscreenCanvas( 1, 1 ); + + } + + return document.createElement( 'canvas' ); + +} + +function getToBlobPromise( canvas, mimeType ) { + + if ( canvas.toBlob !== undefined ) { + + return new Promise( ( resolve ) => canvas.toBlob( resolve, mimeType ) ); + + } + + let quality; + + // Blink's implementation of convertToBlob seems to default to a quality level of 100% + // Use the Blink default quality levels of toBlob instead so that file sizes are comparable. + if ( mimeType === 'image/jpeg' ) { + + quality = 0.92; + + } else if ( mimeType === 'image/webp' ) { + + quality = 0.8; + + } + + return canvas.convertToBlob( { + + type: mimeType, + quality: quality + + } ); + +} + +/** + * Writer + */ +class GLTFWriter { + + constructor() { + + this.plugins = []; + + this.options = {}; + this.pending = []; + this.buffers = []; + + this.byteOffset = 0; + this.buffers = []; + this.nodeMap = new Map(); + this.skins = []; + + this.extensionsUsed = {}; + this.extensionsRequired = {}; + + this.uids = new Map(); + this.uid = 0; + + this.json = { + asset: { + version: '2.0', + generator: 'THREE.GLTFExporter r' + REVISION + } + }; + + this.cache = { + meshes: new Map(), + attributes: new Map(), + attributesNormalized: new Map(), + materials: new Map(), + textures: new Map(), + images: new Map() + }; + + this.textureUtils = null; + + } + + setPlugins( plugins ) { + + this.plugins = plugins; + + } + + setTextureUtils( utils ) { + + this.textureUtils = utils; + + } + + /** + * Parse scenes and generate GLTF output + * + * @param {Scene|Array} input Scene or Array of THREE.Scenes + * @param {Function} onDone Callback on completed + * @param {Object} options options + */ + async writeAsync( input, onDone, options = {} ) { + + this.options = Object.assign( { + // default options + binary: false, + trs: false, + onlyVisible: true, + maxTextureSize: Infinity, + animations: [], + includeCustomExtensions: false + }, options ); + + if ( this.options.animations.length > 0 ) { + + // Only TRS properties, and not matrices, may be targeted by animation. + this.options.trs = true; + + } + + await this.processInputAsync( input ); + + await Promise.all( this.pending ); + + const writer = this; + const buffers = writer.buffers; + const json = writer.json; + options = writer.options; + + const extensionsUsed = writer.extensionsUsed; + const extensionsRequired = writer.extensionsRequired; + + // Merge buffers. + const blob = new Blob( buffers, { type: 'application/octet-stream' } ); + + // Declare extensions. + const extensionsUsedList = Object.keys( extensionsUsed ); + const extensionsRequiredList = Object.keys( extensionsRequired ); + + if ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList; + if ( extensionsRequiredList.length > 0 ) json.extensionsRequired = extensionsRequiredList; + + // Update bytelength of the single buffer. + if ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size; + + if ( options.binary === true ) { + + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification + + const reader = new FileReader(); + reader.readAsArrayBuffer( blob ); + reader.onloadend = function () { + + // Binary chunk. + const binaryChunk = getPaddedArrayBuffer( reader.result ); + const binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) ); + binaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true ); + binaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true ); + + // JSON chunk. + const jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 ); + const jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) ); + jsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true ); + jsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true ); + + // GLB header. + const header = new ArrayBuffer( GLB_HEADER_BYTES ); + const headerView = new DataView( header ); + headerView.setUint32( 0, GLB_HEADER_MAGIC, true ); + headerView.setUint32( 4, GLB_VERSION, true ); + const totalByteLength = GLB_HEADER_BYTES + + jsonChunkPrefix.byteLength + jsonChunk.byteLength + + binaryChunkPrefix.byteLength + binaryChunk.byteLength; + headerView.setUint32( 8, totalByteLength, true ); + + const glbBlob = new Blob( [ + header, + jsonChunkPrefix, + jsonChunk, + binaryChunkPrefix, + binaryChunk + ], { type: 'application/octet-stream' } ); + + const glbReader = new FileReader(); + glbReader.readAsArrayBuffer( glbBlob ); + glbReader.onloadend = function () { + + onDone( glbReader.result ); + + }; + + }; + + } else { + + if ( json.buffers && json.buffers.length > 0 ) { + + const reader = new FileReader(); + reader.readAsDataURL( blob ); + reader.onloadend = function () { + + const base64data = reader.result; + json.buffers[ 0 ].uri = base64data; + onDone( json ); + + }; + + } else { + + onDone( json ); + + } + + } + + + } + + /** + * Serializes a userData. + * + * @param {THREE.Object3D|THREE.Material} object + * @param {Object} objectDef + */ + serializeUserData( object, objectDef ) { + + if ( Object.keys( object.userData ).length === 0 ) return; + + const options = this.options; + const extensionsUsed = this.extensionsUsed; + + try { + + const json = JSON.parse( JSON.stringify( object.userData ) ); + + if ( options.includeCustomExtensions && json.gltfExtensions ) { + + if ( objectDef.extensions === undefined ) objectDef.extensions = {}; + + for ( const extensionName in json.gltfExtensions ) { + + objectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ]; + extensionsUsed[ extensionName ] = true; + + } + + delete json.gltfExtensions; + + } + + if ( Object.keys( json ).length > 0 ) objectDef.extras = json; + + } catch ( error ) { + + console.warn( 'THREE.GLTFExporter: userData of \'' + object.name + '\' ' + + 'won\'t be serialized because of JSON.stringify error - ' + error.message ); + + } + + } + + /** + * Returns ids for buffer attributes. + * + * @param {Object} attribute + * @param {boolean} [isRelativeCopy=false] + * @return {number} An integer + */ + getUID( attribute, isRelativeCopy = false ) { + + if ( this.uids.has( attribute ) === false ) { + + const uids = new Map(); + + uids.set( true, this.uid ++ ); + uids.set( false, this.uid ++ ); + + this.uids.set( attribute, uids ); + + } + + const uids = this.uids.get( attribute ); + + return uids.get( isRelativeCopy ); + + } + + /** + * Checks if normal attribute values are normalized. + * + * @param {BufferAttribute} normal + * @returns {boolean} + */ + isNormalizedNormalAttribute( normal ) { + + const cache = this.cache; + + if ( cache.attributesNormalized.has( normal ) ) return false; + + const v = new Vector3(); + + for ( let i = 0, il = normal.count; i < il; i ++ ) { + + // 0.0005 is from glTF-validator + if ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false; + + } + + return true; + + } + + /** + * Creates normalized normal buffer attribute. + * + * @param {BufferAttribute} normal + * @returns {BufferAttribute} + * + */ + createNormalizedNormalAttribute( normal ) { + + const cache = this.cache; + + if ( cache.attributesNormalized.has( normal ) ) return cache.attributesNormalized.get( normal ); + + const attribute = normal.clone(); + const v = new Vector3(); + + for ( let i = 0, il = attribute.count; i < il; i ++ ) { + + v.fromBufferAttribute( attribute, i ); + + if ( v.x === 0 && v.y === 0 && v.z === 0 ) { + + // if values can't be normalized set (1, 0, 0) + v.setX( 1.0 ); + + } else { + + v.normalize(); + + } + + attribute.setXYZ( i, v.x, v.y, v.z ); + + } + + cache.attributesNormalized.set( normal, attribute ); + + return attribute; + + } + + /** + * Applies a texture transform, if present, to the map definition. Requires + * the KHR_texture_transform extension. + * + * @param {Object} mapDef + * @param {THREE.Texture} texture + */ + applyTextureTransform( mapDef, texture ) { + + let didTransform = false; + const transformDef = {}; + + if ( texture.offset.x !== 0 || texture.offset.y !== 0 ) { + + transformDef.offset = texture.offset.toArray(); + didTransform = true; + + } + + if ( texture.rotation !== 0 ) { + + transformDef.rotation = texture.rotation; + didTransform = true; + + } + + if ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) { + + transformDef.scale = texture.repeat.toArray(); + didTransform = true; + + } + + if ( didTransform ) { + + mapDef.extensions = mapDef.extensions || {}; + mapDef.extensions[ 'KHR_texture_transform' ] = transformDef; + this.extensionsUsed[ 'KHR_texture_transform' ] = true; + + } + + } + + async buildMetalRoughTextureAsync( metalnessMap, roughnessMap ) { + + if ( metalnessMap === roughnessMap ) return metalnessMap; + + function getEncodingConversion( map ) { + + if ( map.colorSpace === SRGBColorSpace ) { + + return function SRGBToLinear( c ) { + + return ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 ); + + }; + + } + + return function LinearToLinear( c ) { + + return c; + + }; + + } + + if ( metalnessMap instanceof CompressedTexture ) { + + metalnessMap = await this.decompressTextureAsync( metalnessMap ); + + } + + if ( roughnessMap instanceof CompressedTexture ) { + + roughnessMap = await this.decompressTextureAsync( roughnessMap ); + + } + + const metalness = metalnessMap ? metalnessMap.image : null; + const roughness = roughnessMap ? roughnessMap.image : null; + + const width = Math.max( metalness ? metalness.width : 0, roughness ? roughness.width : 0 ); + const height = Math.max( metalness ? metalness.height : 0, roughness ? roughness.height : 0 ); + + const canvas = getCanvas(); + canvas.width = width; + canvas.height = height; + + const context = canvas.getContext( '2d', { + willReadFrequently: true, + } ); + context.fillStyle = '#00ffff'; + context.fillRect( 0, 0, width, height ); + + const composite = context.getImageData( 0, 0, width, height ); + + if ( metalness ) { + + context.drawImage( metalness, 0, 0, width, height ); + + const convert = getEncodingConversion( metalnessMap ); + const data = context.getImageData( 0, 0, width, height ).data; + + for ( let i = 2; i < data.length; i += 4 ) { + + composite.data[ i ] = convert( data[ i ] / 256 ) * 256; + + } + + } + + if ( roughness ) { + + context.drawImage( roughness, 0, 0, width, height ); + + const convert = getEncodingConversion( roughnessMap ); + const data = context.getImageData( 0, 0, width, height ).data; + + for ( let i = 1; i < data.length; i += 4 ) { + + composite.data[ i ] = convert( data[ i ] / 256 ) * 256; + + } + + } + + context.putImageData( composite, 0, 0 ); + + // + + const reference = metalnessMap || roughnessMap; + + const texture = reference.clone(); + + texture.source = new Source( canvas ); + texture.colorSpace = NoColorSpace; + texture.channel = ( metalnessMap || roughnessMap ).channel; + + if ( metalnessMap && roughnessMap && metalnessMap.channel !== roughnessMap.channel ) { + + console.warn( 'THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match.' ); + + } + + console.warn( 'THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.' ); + + return texture; + + } + + + async decompressTextureAsync( texture, maxTextureSize = Infinity ) { + + if ( this.textureUtils === null ) { + + throw new Error( 'THREE.GLTFExporter: setTextureUtils() must be called to process compressed textures.' ); + + } + + return await this.textureUtils.decompress( texture, maxTextureSize ); + + } + + /** + * Process a buffer to append to the default one. + * @param {ArrayBuffer} buffer + * @return {0} + */ + processBuffer( buffer ) { + + const json = this.json; + const buffers = this.buffers; + + if ( ! json.buffers ) json.buffers = [ { byteLength: 0 } ]; + + // All buffers are merged before export. + buffers.push( buffer ); + + return 0; + + } + + /** + * Process and generate a BufferView + * @param {BufferAttribute} attribute + * @param {number} componentType + * @param {number} start + * @param {number} count + * @param {?number} target Target usage of the BufferView + * @return {Object} + */ + processBufferView( attribute, componentType, start, count, target ) { + + const json = this.json; + + if ( ! json.bufferViews ) json.bufferViews = []; + + // Create a new dataview and dump the attribute's array into it + + let componentSize; + + switch ( componentType ) { + + case WEBGL_CONSTANTS.BYTE: + case WEBGL_CONSTANTS.UNSIGNED_BYTE: + + componentSize = 1; + + break; + + case WEBGL_CONSTANTS.SHORT: + case WEBGL_CONSTANTS.UNSIGNED_SHORT: + + componentSize = 2; + + break; + + default: + + componentSize = 4; + + } + + let byteStride = attribute.itemSize * componentSize; + + if ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) { + + // Each element of a vertex attribute MUST be aligned to 4-byte boundaries + // inside a bufferView + byteStride = Math.ceil( byteStride / 4 ) * 4; + + } + + const byteLength = getPaddedBufferSize( count * byteStride ); + const dataView = new DataView( new ArrayBuffer( byteLength ) ); + let offset = 0; + + for ( let i = start; i < start + count; i ++ ) { + + for ( let a = 0; a < attribute.itemSize; a ++ ) { + + let value; + + if ( attribute.itemSize > 4 ) { + + // no support for interleaved data for itemSize > 4 + + value = attribute.array[ i * attribute.itemSize + a ]; + + } else { + + if ( a === 0 ) value = attribute.getX( i ); + else if ( a === 1 ) value = attribute.getY( i ); + else if ( a === 2 ) value = attribute.getZ( i ); + else if ( a === 3 ) value = attribute.getW( i ); + + if ( attribute.normalized === true ) { + + value = MathUtils.normalize( value, attribute.array ); + + } + + } + + if ( componentType === WEBGL_CONSTANTS.FLOAT ) { + + dataView.setFloat32( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.INT ) { + + dataView.setInt32( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) { + + dataView.setUint32( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.SHORT ) { + + dataView.setInt16( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) { + + dataView.setUint16( offset, value, true ); + + } else if ( componentType === WEBGL_CONSTANTS.BYTE ) { + + dataView.setInt8( offset, value ); + + } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) { + + dataView.setUint8( offset, value ); + + } + + offset += componentSize; + + } + + if ( ( offset % byteStride ) !== 0 ) { + + offset += byteStride - ( offset % byteStride ); + + } + + } + + const bufferViewDef = { + + buffer: this.processBuffer( dataView.buffer ), + byteOffset: this.byteOffset, + byteLength: byteLength + + }; + + if ( target !== undefined ) bufferViewDef.target = target; + + if ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) { + + // Only define byteStride for vertex attributes. + bufferViewDef.byteStride = byteStride; + + } + + this.byteOffset += byteLength; + + json.bufferViews.push( bufferViewDef ); + + // @TODO Merge bufferViews where possible. + const output = { + + id: json.bufferViews.length - 1, + byteLength: 0 + + }; + + return output; + + } + + /** + * Process and generate a BufferView from an image Blob. + * @param {Blob} blob + * @return {Promise} An integer + */ + processBufferViewImage( blob ) { + + const writer = this; + const json = writer.json; + + if ( ! json.bufferViews ) json.bufferViews = []; + + return new Promise( function ( resolve ) { + + const reader = new FileReader(); + reader.readAsArrayBuffer( blob ); + reader.onloadend = function () { + + const buffer = getPaddedArrayBuffer( reader.result ); + + const bufferViewDef = { + buffer: writer.processBuffer( buffer ), + byteOffset: writer.byteOffset, + byteLength: buffer.byteLength + }; + + writer.byteOffset += buffer.byteLength; + resolve( json.bufferViews.push( bufferViewDef ) - 1 ); + + }; + + } ); + + } + + /** + * Process attribute to generate an accessor + * @param {BufferAttribute} attribute Attribute to process + * @param {?BufferGeometry} geometry Geometry used for truncated draw range + * @param {number} [start=0] + * @param {number} [count=Infinity] + * @return {?number} Index of the processed accessor on the "accessors" array + */ + processAccessor( attribute, geometry, start, count ) { + + const json = this.json; + + const types = { + + 1: 'SCALAR', + 2: 'VEC2', + 3: 'VEC3', + 4: 'VEC4', + 9: 'MAT3', + 16: 'MAT4' + + }; + + let componentType; + + // Detect the component type of the attribute array + if ( attribute.array.constructor === Float32Array ) { + + componentType = WEBGL_CONSTANTS.FLOAT; + + } else if ( attribute.array.constructor === Int32Array ) { + + componentType = WEBGL_CONSTANTS.INT; + + } else if ( attribute.array.constructor === Uint32Array ) { + + componentType = WEBGL_CONSTANTS.UNSIGNED_INT; + + } else if ( attribute.array.constructor === Int16Array ) { + + componentType = WEBGL_CONSTANTS.SHORT; + + } else if ( attribute.array.constructor === Uint16Array ) { + + componentType = WEBGL_CONSTANTS.UNSIGNED_SHORT; + + } else if ( attribute.array.constructor === Int8Array ) { + + componentType = WEBGL_CONSTANTS.BYTE; + + } else if ( attribute.array.constructor === Uint8Array ) { + + componentType = WEBGL_CONSTANTS.UNSIGNED_BYTE; + + } else { + + throw new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type: ' + attribute.array.constructor.name ); + + } + + if ( start === undefined ) start = 0; + if ( count === undefined || count === Infinity ) count = attribute.count; + + // Skip creating an accessor if the attribute doesn't have data to export + if ( count === 0 ) return null; + + const minMax = getMinMax( attribute, start, count ); + let bufferViewTarget; + + // If geometry isn't provided, don't infer the target usage of the bufferView. For + // animation samplers, target must not be set. + if ( geometry !== undefined ) { + + bufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER; + + } + + const bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget ); + + const accessorDef = { + + bufferView: bufferView.id, + byteOffset: bufferView.byteOffset, + componentType: componentType, + count: count, + max: minMax.max, + min: minMax.min, + type: types[ attribute.itemSize ] + + }; + + if ( attribute.normalized === true ) accessorDef.normalized = true; + if ( ! json.accessors ) json.accessors = []; + + return json.accessors.push( accessorDef ) - 1; + + } + + /** + * Process image + * @param {Image} image to process + * @param {number} format Identifier of the format (RGBAFormat) + * @param {boolean} flipY before writing out the image + * @param {string} mimeType export format + * @return {number} Index of the processed texture in the "images" array + */ + processImage( image, format, flipY, mimeType = 'image/png' ) { + + if ( image !== null ) { + + const writer = this; + const cache = writer.cache; + const json = writer.json; + const options = writer.options; + const pending = writer.pending; + + if ( ! cache.images.has( image ) ) cache.images.set( image, {} ); + + const cachedImages = cache.images.get( image ); + + const key = mimeType + ':flipY/' + flipY.toString(); + + if ( cachedImages[ key ] !== undefined ) return cachedImages[ key ]; + + if ( ! json.images ) json.images = []; + + const imageDef = { mimeType: mimeType }; + + const canvas = getCanvas(); + + canvas.width = Math.min( image.width, options.maxTextureSize ); + canvas.height = Math.min( image.height, options.maxTextureSize ); + + const ctx = canvas.getContext( '2d', { + willReadFrequently: true, + } ); + + if ( flipY === true ) { + + ctx.translate( 0, canvas.height ); + ctx.scale( 1, -1 ); + + } + + if ( image.data !== undefined ) { // THREE.DataTexture + + if ( format !== RGBAFormat ) { + + console.error( 'GLTFExporter: Only RGBAFormat is supported.', format ); + + } + + if ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) { + + console.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image ); + + } + + const data = new Uint8ClampedArray( image.height * image.width * 4 ); + + for ( let i = 0; i < data.length; i += 4 ) { + + data[ i + 0 ] = image.data[ i + 0 ]; + data[ i + 1 ] = image.data[ i + 1 ]; + data[ i + 2 ] = image.data[ i + 2 ]; + data[ i + 3 ] = image.data[ i + 3 ]; + + } + + ctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 ); + + } else { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) || + ( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ) { + + ctx.drawImage( image, 0, 0, canvas.width, canvas.height ); + + } else { + + throw new Error( 'THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.' ); + + } + + } + + if ( options.binary === true ) { + + pending.push( + + getToBlobPromise( canvas, mimeType ) + .then( blob => writer.processBufferViewImage( blob ) ) + .then( bufferViewIndex => { + + imageDef.bufferView = bufferViewIndex; + + } ) + + ); + + } else { + + if ( canvas.toDataURL !== undefined ) { + + imageDef.uri = canvas.toDataURL( mimeType ); + + } else { + + pending.push( + + getToBlobPromise( canvas, mimeType ) + .then( blob => new FileReader().readAsDataURL( blob ) ) + .then( dataURL => { + + imageDef.uri = dataURL; + + } ) + + ); + + } + + } + + const index = json.images.push( imageDef ) - 1; + cachedImages[ key ] = index; + return index; + + } else { + + throw new Error( 'THREE.GLTFExporter: No valid image data found. Unable to process texture.' ); + + } + + } + + /** + * Process sampler + * @param {Texture} map Texture to process + * @return {number} Index of the processed texture in the "samplers" array + */ + processSampler( map ) { + + const json = this.json; + + if ( ! json.samplers ) json.samplers = []; + + const samplerDef = { + magFilter: THREE_TO_WEBGL[ map.magFilter ], + minFilter: THREE_TO_WEBGL[ map.minFilter ], + wrapS: THREE_TO_WEBGL[ map.wrapS ], + wrapT: THREE_TO_WEBGL[ map.wrapT ] + }; + + return json.samplers.push( samplerDef ) - 1; + + } + + /** + * Process texture + * @param {Texture} map Map to process + * @return {Promise} Index of the processed texture in the "textures" array + */ + async processTextureAsync( map ) { + + const writer = this; + const options = writer.options; + const cache = this.cache; + const json = this.json; + + if ( cache.textures.has( map ) ) return cache.textures.get( map ); + + if ( ! json.textures ) json.textures = []; + + // make non-readable textures (e.g. CompressedTexture) readable by blitting them into a new texture + if ( map instanceof CompressedTexture ) { + + map = await this.decompressTextureAsync( map, options.maxTextureSize ); + + } + + let mimeType = map.userData.mimeType; + + if ( mimeType === 'image/webp' ) mimeType = 'image/png'; + + const textureDef = { + sampler: this.processSampler( map ), + source: this.processImage( map.image, map.format, map.flipY, mimeType ) + }; + + if ( map.name ) textureDef.name = map.name; + + await this._invokeAllAsync( async function ( ext ) { + + ext.writeTexture && await ext.writeTexture( map, textureDef ); + + } ); + + const index = json.textures.push( textureDef ) - 1; + cache.textures.set( map, index ); + return index; + + } + + /** + * Process material + * @param {THREE.Material} material Material to process + * @return {Promise} Index of the processed material in the "materials" array + */ + async processMaterialAsync( material ) { + + const cache = this.cache; + const json = this.json; + + if ( cache.materials.has( material ) ) return cache.materials.get( material ); + + if ( material.isShaderMaterial ) { + + console.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' ); + return null; + + } + + if ( ! json.materials ) json.materials = []; + + // @QUESTION Should we avoid including any attribute that has the default value? + const materialDef = { pbrMetallicRoughness: {} }; + + if ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) { + + console.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' ); + + } + + // pbrMetallicRoughness.baseColorFactor + const color = material.color.toArray().concat( [ material.opacity ] ); + + if ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) { + + materialDef.pbrMetallicRoughness.baseColorFactor = color; + + } + + if ( material.isMeshStandardMaterial ) { + + materialDef.pbrMetallicRoughness.metallicFactor = material.metalness; + materialDef.pbrMetallicRoughness.roughnessFactor = material.roughness; + + } else { + + materialDef.pbrMetallicRoughness.metallicFactor = 0; + materialDef.pbrMetallicRoughness.roughnessFactor = 1; + + } + + // pbrMetallicRoughness.metallicRoughnessTexture + if ( material.metalnessMap || material.roughnessMap ) { + + const metalRoughTexture = await this.buildMetalRoughTextureAsync( material.metalnessMap, material.roughnessMap ); + + const metalRoughMapDef = { + index: await this.processTextureAsync( metalRoughTexture ), + texCoord: metalRoughTexture.channel + }; + this.applyTextureTransform( metalRoughMapDef, metalRoughTexture ); + materialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef; + + } + + // pbrMetallicRoughness.baseColorTexture + if ( material.map ) { + + const baseColorMapDef = { + index: await this.processTextureAsync( material.map ), + texCoord: material.map.channel + }; + this.applyTextureTransform( baseColorMapDef, material.map ); + materialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef; + + } + + if ( material.emissive ) { + + const emissive = material.emissive; + const maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b ); + + if ( maxEmissiveComponent > 0 ) { + + materialDef.emissiveFactor = material.emissive.toArray(); + + } + + // emissiveTexture + if ( material.emissiveMap ) { + + const emissiveMapDef = { + index: await this.processTextureAsync( material.emissiveMap ), + texCoord: material.emissiveMap.channel + }; + this.applyTextureTransform( emissiveMapDef, material.emissiveMap ); + materialDef.emissiveTexture = emissiveMapDef; + + } + + } + + // normalTexture + if ( material.normalMap ) { + + const normalMapDef = { + index: await this.processTextureAsync( material.normalMap ), + texCoord: material.normalMap.channel + }; + + if ( material.normalScale && material.normalScale.x !== 1 ) { + + // glTF normal scale is univariate. Ignore `y`, which may be flipped. + // Context: https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 + normalMapDef.scale = material.normalScale.x; + + } + + this.applyTextureTransform( normalMapDef, material.normalMap ); + materialDef.normalTexture = normalMapDef; + + } + + // occlusionTexture + if ( material.aoMap ) { + + const occlusionMapDef = { + index: await this.processTextureAsync( material.aoMap ), + texCoord: material.aoMap.channel + }; + + if ( material.aoMapIntensity !== 1.0 ) { + + occlusionMapDef.strength = material.aoMapIntensity; + + } + + this.applyTextureTransform( occlusionMapDef, material.aoMap ); + materialDef.occlusionTexture = occlusionMapDef; + + } + + // alphaMode + if ( material.transparent ) { + + materialDef.alphaMode = 'BLEND'; + + } else { + + if ( material.alphaTest > 0.0 ) { + + materialDef.alphaMode = 'MASK'; + materialDef.alphaCutoff = material.alphaTest; + + } + + } + + // doubleSided + if ( material.side === DoubleSide ) materialDef.doubleSided = true; + if ( material.name !== '' ) materialDef.name = material.name; + + this.serializeUserData( material, materialDef ); + + await this._invokeAllAsync( async function ( ext ) { + + ext.writeMaterialAsync && await ext.writeMaterialAsync( material, materialDef ); + + } ); + + const index = json.materials.push( materialDef ) - 1; + cache.materials.set( material, index ); + return index; + + } + + /** + * Process mesh + * @param {THREE.Mesh} mesh Mesh to process + * @return {Promise} Index of the processed mesh in the "meshes" array + */ + async processMeshAsync( mesh ) { + + const cache = this.cache; + const json = this.json; + + const meshCacheKeyParts = [ mesh.geometry.uuid ]; + + if ( Array.isArray( mesh.material ) ) { + + for ( let i = 0, l = mesh.material.length; i < l; i ++ ) { + + meshCacheKeyParts.push( mesh.material[ i ].uuid ); + + } + + } else { + + meshCacheKeyParts.push( mesh.material.uuid ); + + } + + const meshCacheKey = meshCacheKeyParts.join( ':' ); + + if ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey ); + + const geometry = mesh.geometry; + + let mode; + + // Use the correct mode + if ( mesh.isLineSegments ) { + + mode = WEBGL_CONSTANTS.LINES; + + } else if ( mesh.isLineLoop ) { + + mode = WEBGL_CONSTANTS.LINE_LOOP; + + } else if ( mesh.isLine ) { + + mode = WEBGL_CONSTANTS.LINE_STRIP; + + } else if ( mesh.isPoints ) { + + mode = WEBGL_CONSTANTS.POINTS; + + } else { + + mode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES; + + } + + const meshDef = {}; + const attributes = {}; + const primitives = []; + const targets = []; + + // Conversion between attributes names in threejs and gltf spec + const nameConversion = { + uv: 'TEXCOORD_0', + uv1: 'TEXCOORD_1', + uv2: 'TEXCOORD_2', + uv3: 'TEXCOORD_3', + color: 'COLOR_0', + skinWeight: 'WEIGHTS_0', + skinIndex: 'JOINTS_0' + }; + + const originalNormal = geometry.getAttribute( 'normal' ); + + if ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) { + + console.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' ); + + geometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) ); + + } + + // @QUESTION Detect if .vertexColors = true? + // For every attribute create an accessor + let modifiedAttribute = null; + + for ( let attributeName in geometry.attributes ) { + + // Ignore morph target attributes, which are exported later. + if ( attributeName.slice( 0, 5 ) === 'morph' ) continue; + + const attribute = geometry.attributes[ attributeName ]; + attributeName = nameConversion[ attributeName ] || attributeName.toUpperCase(); + + // Prefix all geometry attributes except the ones specifically + // listed in the spec; non-spec attributes are considered custom. + const validVertexAttributes = + /^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/; + + if ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName; + + if ( cache.attributes.has( this.getUID( attribute ) ) ) { + + attributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) ); + continue; + + } + + // Enforce glTF vertex attribute requirements: + // - JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT + // - Only custom attributes may be INT or UNSIGNED_INT + modifiedAttribute = null; + const array = attribute.array; + + if ( attributeName === 'JOINTS_0' && + ! ( array instanceof Uint16Array ) && + ! ( array instanceof Uint8Array ) ) { + + console.warn( 'GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.' ); + modifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized ); + + } else if ( ( array instanceof Uint32Array || array instanceof Int32Array ) && ! attributeName.startsWith( '_' ) ) { + + console.warn( `GLTFExporter: Attribute "${ attributeName }" converted to type FLOAT.` ); + modifiedAttribute = GLTFExporter.Utils.toFloat32BufferAttribute( attribute ); + + } + + const accessor = this.processAccessor( modifiedAttribute || attribute, geometry ); + + if ( accessor !== null ) { + + if ( ! attributeName.startsWith( '_' ) ) { + + this.detectMeshQuantization( attributeName, attribute ); + + } + + attributes[ attributeName ] = accessor; + cache.attributes.set( this.getUID( attribute ), accessor ); + + } + + } + + if ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal ); + + // Skip if no exportable attributes found + if ( Object.keys( attributes ).length === 0 ) return null; + + // Morph targets + if ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) { + + const weights = []; + const targetNames = []; + const reverseDictionary = {}; + + if ( mesh.morphTargetDictionary !== undefined ) { + + for ( const key in mesh.morphTargetDictionary ) { + + reverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key; + + } + + } + + for ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) { + + const target = {}; + let warned = false; + + for ( const attributeName in geometry.morphAttributes ) { + + // glTF 2.0 morph supports only POSITION/NORMAL/TANGENT. + // Three.js doesn't support TANGENT yet. + + if ( attributeName !== 'position' && attributeName !== 'normal' ) { + + if ( ! warned ) { + + console.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' ); + warned = true; + + } + + continue; + + } + + const attribute = geometry.morphAttributes[ attributeName ][ i ]; + const gltfAttributeName = attributeName.toUpperCase(); + + // Three.js morph attribute has absolute values while the one of glTF has relative values. + // + // glTF 2.0 Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets + + const baseAttribute = geometry.attributes[ attributeName ]; + + if ( cache.attributes.has( this.getUID( attribute, true ) ) ) { + + target[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute, true ) ); + continue; + + } + + // Clones attribute not to override + const relativeAttribute = attribute.clone(); + + if ( ! geometry.morphTargetsRelative ) { + + for ( let j = 0, jl = attribute.count; j < jl; j ++ ) { + + for ( let a = 0; a < attribute.itemSize; a ++ ) { + + if ( a === 0 ) relativeAttribute.setX( j, attribute.getX( j ) - baseAttribute.getX( j ) ); + if ( a === 1 ) relativeAttribute.setY( j, attribute.getY( j ) - baseAttribute.getY( j ) ); + if ( a === 2 ) relativeAttribute.setZ( j, attribute.getZ( j ) - baseAttribute.getZ( j ) ); + if ( a === 3 ) relativeAttribute.setW( j, attribute.getW( j ) - baseAttribute.getW( j ) ); + + } + + } + + } + + target[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry ); + cache.attributes.set( this.getUID( baseAttribute, true ), target[ gltfAttributeName ] ); + + } + + targets.push( target ); + + weights.push( mesh.morphTargetInfluences[ i ] ); + + if ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] ); + + } + + meshDef.weights = weights; + + if ( targetNames.length > 0 ) { + + meshDef.extras = {}; + meshDef.extras.targetNames = targetNames; + + } + + } + + const isMultiMaterial = Array.isArray( mesh.material ); + + if ( isMultiMaterial && geometry.groups.length === 0 ) return null; + + let didForceIndices = false; + + if ( isMultiMaterial && geometry.index === null ) { + + const indices = []; + + for ( let i = 0, il = geometry.attributes.position.count; i < il; i ++ ) { + + indices[ i ] = i; + + } + + geometry.setIndex( indices ); + + didForceIndices = true; + + } + + const materials = isMultiMaterial ? mesh.material : [ mesh.material ]; + const groups = isMultiMaterial ? geometry.groups : [ { materialIndex: 0, start: undefined, count: undefined } ]; + + for ( let i = 0, il = groups.length; i < il; i ++ ) { + + const primitive = { + mode: mode, + attributes: attributes, + }; + + this.serializeUserData( geometry, primitive ); + + if ( targets.length > 0 ) primitive.targets = targets; + + if ( geometry.index !== null ) { + + let cacheKey = this.getUID( geometry.index ); + + if ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) { + + cacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count; + + } + + if ( cache.attributes.has( cacheKey ) ) { + + primitive.indices = cache.attributes.get( cacheKey ); + + } else { + + primitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count ); + cache.attributes.set( cacheKey, primitive.indices ); + + } + + if ( primitive.indices === null ) delete primitive.indices; + + } + + const material = await this.processMaterialAsync( materials[ groups[ i ].materialIndex ] ); + + if ( material !== null ) primitive.material = material; + + primitives.push( primitive ); + + } + + if ( didForceIndices === true ) { + + geometry.setIndex( null ); + + } + + meshDef.primitives = primitives; + + if ( ! json.meshes ) json.meshes = []; + + await this._invokeAllAsync( function ( ext ) { + + ext.writeMesh && ext.writeMesh( mesh, meshDef ); + + } ); + + const index = json.meshes.push( meshDef ) - 1; + cache.meshes.set( meshCacheKey, index ); + return index; + + } + + /** + * If a vertex attribute with a + * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview) + * is used, it is checked whether it is a valid data type according to the + * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md) + * extension. + * In this case the extension is automatically added to the list of used extensions. + * + * @param {string} attributeName + * @param {THREE.BufferAttribute} attribute + */ + detectMeshQuantization( attributeName, attribute ) { + + if ( this.extensionsUsed[ KHR_MESH_QUANTIZATION ] ) return; + + let attrType = undefined; + + switch ( attribute.array.constructor ) { + + case Int8Array: + + attrType = 'byte'; + + break; + + case Uint8Array: + + attrType = 'unsigned byte'; + + break; + + case Int16Array: + + attrType = 'short'; + + break; + + case Uint16Array: + + attrType = 'unsigned short'; + + break; + + default: + + return; + + } + + if ( attribute.normalized ) attrType += ' normalized'; + + const attrNamePrefix = attributeName.split( '_', 1 )[ 0 ]; + + if ( KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ] && KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ].includes( attrType ) ) { + + this.extensionsUsed[ KHR_MESH_QUANTIZATION ] = true; + this.extensionsRequired[ KHR_MESH_QUANTIZATION ] = true; + + } + + } + + /** + * Process camera + * @param {THREE.Camera} camera Camera to process + * @return {number} Index of the processed mesh in the "camera" array + */ + processCamera( camera ) { + + const json = this.json; + + if ( ! json.cameras ) json.cameras = []; + + const isOrtho = camera.isOrthographicCamera; + + const cameraDef = { + type: isOrtho ? 'orthographic' : 'perspective' + }; + + if ( isOrtho ) { + + cameraDef.orthographic = { + xmag: camera.right * 2, + ymag: camera.top * 2, + zfar: camera.far <= 0 ? 0.001 : camera.far, + znear: camera.near < 0 ? 0 : camera.near + }; + + } else { + + cameraDef.perspective = { + aspectRatio: camera.aspect, + yfov: MathUtils.degToRad( camera.fov ), + zfar: camera.far <= 0 ? 0.001 : camera.far, + znear: camera.near < 0 ? 0 : camera.near + }; + + } + + // Question: Is saving "type" as name intentional? + if ( camera.name !== '' ) cameraDef.name = camera.type; + + return json.cameras.push( cameraDef ) - 1; + + } + + /** + * Creates glTF animation entry from AnimationClip object. + * + * Status: + * - Only properties listed in PATH_PROPERTIES may be animated. + * + * @param {THREE.AnimationClip} clip + * @param {THREE.Object3D} root + * @return {number|null} + */ + processAnimation( clip, root ) { + + const json = this.json; + const nodeMap = this.nodeMap; + + if ( ! json.animations ) json.animations = []; + + clip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root ); + + const tracks = clip.tracks; + const channels = []; + const samplers = []; + + for ( let i = 0; i < tracks.length; ++ i ) { + + const track = tracks[ i ]; + const trackBinding = PropertyBinding.parseTrackName( track.name ); + let trackNode = PropertyBinding.findNode( root, trackBinding.nodeName ); + const trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ]; + + if ( trackBinding.objectName === 'bones' ) { + + if ( trackNode.isSkinnedMesh === true ) { + + trackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex ); + + } else { + + trackNode = undefined; + + } + + } + + if ( ! trackNode || ! trackProperty ) { + + console.warn( 'THREE.GLTFExporter: Could not export animation track "%s".', track.name ); + continue; + + } + + const inputItemSize = 1; + let outputItemSize = track.values.length / track.times.length; + + if ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) { + + outputItemSize /= trackNode.morphTargetInfluences.length; + + } + + let interpolation; + + // @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE + + // Detecting glTF cubic spline interpolant by checking factory method's special property + // GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return + // valid value from .getInterpolation(). + if ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) { + + interpolation = 'CUBICSPLINE'; + + // itemSize of CUBICSPLINE keyframe is 9 + // (VEC3 * 3: inTangent, splineVertex, and outTangent) + // but needs to be stored as VEC3 so dividing by 3 here. + outputItemSize /= 3; + + } else if ( track.getInterpolation() === InterpolateDiscrete ) { + + interpolation = 'STEP'; + + } else { + + interpolation = 'LINEAR'; + + } + + samplers.push( { + input: this.processAccessor( new BufferAttribute( track.times, inputItemSize ) ), + output: this.processAccessor( new BufferAttribute( track.values, outputItemSize ) ), + interpolation: interpolation + } ); + + channels.push( { + sampler: samplers.length - 1, + target: { + node: nodeMap.get( trackNode ), + path: trackProperty + } + } ); + + } + + json.animations.push( { + name: clip.name || 'clip_' + json.animations.length, + samplers: samplers, + channels: channels + } ); + + return json.animations.length - 1; + + } + + /** + * @param {THREE.Object3D} object + * @return {number|null} + */ + processSkin( object ) { + + const json = this.json; + const nodeMap = this.nodeMap; + + const node = json.nodes[ nodeMap.get( object ) ]; + + const skeleton = object.skeleton; + + if ( skeleton === undefined ) return null; + + const rootJoint = object.skeleton.bones[ 0 ]; + + if ( rootJoint === undefined ) return null; + + const joints = []; + const inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 ); + const temporaryBoneInverse = new Matrix4(); + + for ( let i = 0; i < skeleton.bones.length; ++ i ) { + + joints.push( nodeMap.get( skeleton.bones[ i ] ) ); + temporaryBoneInverse.copy( skeleton.boneInverses[ i ] ); + temporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 ); + + } + + if ( json.skins === undefined ) json.skins = []; + + json.skins.push( { + inverseBindMatrices: this.processAccessor( new BufferAttribute( inverseBindMatrices, 16 ) ), + joints: joints, + skeleton: nodeMap.get( rootJoint ) + } ); + + const skinIndex = node.skin = json.skins.length - 1; + + return skinIndex; + + } + + /** + * Process Object3D node + * @param {THREE.Object3D} object Object3D to processNodeAsync + * @return {Promise} Index of the node in the nodes list + */ + async processNodeAsync( object ) { + + const json = this.json; + const options = this.options; + const nodeMap = this.nodeMap; + + if ( ! json.nodes ) json.nodes = []; + + const nodeDef = {}; + + if ( options.trs ) { + + const rotation = object.quaternion.toArray(); + const position = object.position.toArray(); + const scale = object.scale.toArray(); + + if ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) { + + nodeDef.rotation = rotation; + + } + + if ( ! equalArray( position, [ 0, 0, 0 ] ) ) { + + nodeDef.translation = position; + + } + + if ( ! equalArray( scale, [ 1, 1, 1 ] ) ) { + + nodeDef.scale = scale; + + } + + } else { + + if ( object.matrixAutoUpdate ) { + + object.updateMatrix(); + + } + + if ( isIdentityMatrix( object.matrix ) === false ) { + + nodeDef.matrix = object.matrix.elements; + + } + + } + + // We don't export empty strings name because it represents no-name in Three.js. + if ( object.name !== '' ) nodeDef.name = String( object.name ); + + this.serializeUserData( object, nodeDef ); + + if ( object.isMesh || object.isLine || object.isPoints ) { + + const meshIndex = await this.processMeshAsync( object ); + + if ( meshIndex !== null ) nodeDef.mesh = meshIndex; + + } else if ( object.isCamera ) { + + nodeDef.camera = this.processCamera( object ); + + } + + if ( object.isSkinnedMesh ) this.skins.push( object ); + + if ( object.children.length > 0 ) { + + const children = []; + + for ( let i = 0, l = object.children.length; i < l; i ++ ) { + + const child = object.children[ i ]; + + if ( child.visible || options.onlyVisible === false ) { + + const nodeIndex = await this.processNodeAsync( child ); + + if ( nodeIndex !== null ) children.push( nodeIndex ); + + } + + } + + if ( children.length > 0 ) nodeDef.children = children; + + } + + await this._invokeAllAsync( function ( ext ) { + + ext.writeNode && ext.writeNode( object, nodeDef ); + + } ); + + const nodeIndex = json.nodes.push( nodeDef ) - 1; + nodeMap.set( object, nodeIndex ); + return nodeIndex; + + } + + /** + * Process Scene + * @param {Scene} scene Scene to process + */ + async processSceneAsync( scene ) { + + const json = this.json; + const options = this.options; + + if ( ! json.scenes ) { + + json.scenes = []; + json.scene = 0; + + } + + const sceneDef = {}; + + if ( scene.name !== '' ) sceneDef.name = scene.name; + + json.scenes.push( sceneDef ); + + const nodes = []; + + for ( let i = 0, l = scene.children.length; i < l; i ++ ) { + + const child = scene.children[ i ]; + + if ( child.visible || options.onlyVisible === false ) { + + const nodeIndex = await this.processNodeAsync( child ); + + if ( nodeIndex !== null ) nodes.push( nodeIndex ); + + } + + } + + if ( nodes.length > 0 ) sceneDef.nodes = nodes; + + this.serializeUserData( scene, sceneDef ); + + } + + /** + * Creates a Scene to hold a list of objects and parse it + * @param {Array} objects List of objects to process + */ + async processObjectsAsync( objects ) { + + const scene = new Scene(); + scene.name = 'AuxScene'; + + for ( let i = 0; i < objects.length; i ++ ) { + + // We push directly to children instead of calling `add` to prevent + // modify the .parent and break its original scene and hierarchy + scene.children.push( objects[ i ] ); + + } + + await this.processSceneAsync( scene ); + + } + + /** + * @param {THREE.Object3D|Array} input + */ + async processInputAsync( input ) { + + const options = this.options; + + input = input instanceof Array ? input : [ input ]; + + await this._invokeAllAsync( function ( ext ) { + + ext.beforeParse && ext.beforeParse( input ); + + } ); + + const objectsWithoutScene = []; + + for ( let i = 0; i < input.length; i ++ ) { + + if ( input[ i ] instanceof Scene ) { + + await this.processSceneAsync( input[ i ] ); + + } else { + + objectsWithoutScene.push( input[ i ] ); + + } + + } + + if ( objectsWithoutScene.length > 0 ) { + + await this.processObjectsAsync( objectsWithoutScene ); + + } + + for ( let i = 0; i < this.skins.length; ++ i ) { + + this.processSkin( this.skins[ i ] ); + + } + + for ( let i = 0; i < options.animations.length; ++ i ) { + + this.processAnimation( options.animations[ i ], input[ 0 ] ); + + } + + await this._invokeAllAsync( function ( ext ) { + + ext.afterParse && ext.afterParse( input ); + + } ); + + } + + async _invokeAllAsync( func ) { + + for ( let i = 0, il = this.plugins.length; i < il; i ++ ) { + + await func( this.plugins[ i ] ); + + } + + } + +} + +/** + * Punctual Lights Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual + */ +class GLTFLightExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_lights_punctual'; + + } + + writeNode( light, nodeDef ) { + + if ( ! light.isLight ) return; + + if ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) { + + console.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light ); + return; + + } + + const writer = this.writer; + const json = writer.json; + const extensionsUsed = writer.extensionsUsed; + + const lightDef = {}; + + if ( light.name ) lightDef.name = light.name; + + lightDef.color = light.color.toArray(); + + lightDef.intensity = light.intensity; + + if ( light.isDirectionalLight ) { + + lightDef.type = 'directional'; + + } else if ( light.isPointLight ) { + + lightDef.type = 'point'; + + if ( light.distance > 0 ) lightDef.range = light.distance; + + } else if ( light.isSpotLight ) { + + lightDef.type = 'spot'; + + if ( light.distance > 0 ) lightDef.range = light.distance; + + lightDef.spot = {}; + lightDef.spot.innerConeAngle = ( 1.0 - light.penumbra ) * light.angle; + lightDef.spot.outerConeAngle = light.angle; + + } + + if ( light.decay !== undefined && light.decay !== 2 ) { + + console.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, ' + + 'and expects light.decay=2.' ); + + } + + if ( light.target + && ( light.target.parent !== light + || light.target.position.x !== 0 + || light.target.position.y !== 0 + || light.target.position.z !== -1 ) ) { + + console.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, ' + + 'make light.target a child of the light with position 0,0,-1.' ); + + } + + if ( ! extensionsUsed[ this.name ] ) { + + json.extensions = json.extensions || {}; + json.extensions[ this.name ] = { lights: [] }; + extensionsUsed[ this.name ] = true; + + } + + const lights = json.extensions[ this.name ].lights; + lights.push( lightDef ); + + nodeDef.extensions = nodeDef.extensions || {}; + nodeDef.extensions[ this.name ] = { light: lights.length - 1 }; + + } + +} + +/** + * Unlit Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit + */ +class GLTFMaterialsUnlitExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_unlit'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshBasicMaterial ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = {}; + + extensionsUsed[ this.name ] = true; + + materialDef.pbrMetallicRoughness.metallicFactor = 0.0; + materialDef.pbrMetallicRoughness.roughnessFactor = 0.9; + + } + +} + +/** + * Clearcoat Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat + */ +class GLTFMaterialsClearcoatExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_clearcoat'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.clearcoat === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.clearcoatFactor = material.clearcoat; + + if ( material.clearcoatMap ) { + + const clearcoatMapDef = { + index: await writer.processTextureAsync( material.clearcoatMap ), + texCoord: material.clearcoatMap.channel + }; + writer.applyTextureTransform( clearcoatMapDef, material.clearcoatMap ); + extensionDef.clearcoatTexture = clearcoatMapDef; + + } + + extensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness; + + if ( material.clearcoatRoughnessMap ) { + + const clearcoatRoughnessMapDef = { + index: await writer.processTextureAsync( material.clearcoatRoughnessMap ), + texCoord: material.clearcoatRoughnessMap.channel + }; + writer.applyTextureTransform( clearcoatRoughnessMapDef, material.clearcoatRoughnessMap ); + extensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef; + + } + + if ( material.clearcoatNormalMap ) { + + const clearcoatNormalMapDef = { + index: await writer.processTextureAsync( material.clearcoatNormalMap ), + texCoord: material.clearcoatNormalMap.channel + }; + + if ( material.clearcoatNormalScale.x !== 1 ) clearcoatNormalMapDef.scale = material.clearcoatNormalScale.x; + + writer.applyTextureTransform( clearcoatNormalMapDef, material.clearcoatNormalMap ); + extensionDef.clearcoatNormalTexture = clearcoatNormalMapDef; + + } + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + + } + +} + +/** + * Materials dispersion Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_dispersion + */ +class GLTFMaterialsDispersionExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_dispersion'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.dispersion === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.dispersion = material.dispersion; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Iridescence Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence + */ +class GLTFMaterialsIridescenceExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_iridescence'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.iridescence === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.iridescenceFactor = material.iridescence; + + if ( material.iridescenceMap ) { + + const iridescenceMapDef = { + index: await writer.processTextureAsync( material.iridescenceMap ), + texCoord: material.iridescenceMap.channel + }; + writer.applyTextureTransform( iridescenceMapDef, material.iridescenceMap ); + extensionDef.iridescenceTexture = iridescenceMapDef; + + } + + extensionDef.iridescenceIor = material.iridescenceIOR; + extensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[ 0 ]; + extensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[ 1 ]; + + if ( material.iridescenceThicknessMap ) { + + const iridescenceThicknessMapDef = { + index: await writer.processTextureAsync( material.iridescenceThicknessMap ), + texCoord: material.iridescenceThicknessMap.channel + }; + writer.applyTextureTransform( iridescenceThicknessMapDef, material.iridescenceThicknessMap ); + extensionDef.iridescenceThicknessTexture = iridescenceThicknessMapDef; + + } + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Transmission Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission + */ +class GLTFMaterialsTransmissionExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_transmission'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.transmissionFactor = material.transmission; + + if ( material.transmissionMap ) { + + const transmissionMapDef = { + index: await writer.processTextureAsync( material.transmissionMap ), + texCoord: material.transmissionMap.channel + }; + writer.applyTextureTransform( transmissionMapDef, material.transmissionMap ); + extensionDef.transmissionTexture = transmissionMapDef; + + } + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Materials Volume Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume + */ +class GLTFMaterialsVolumeExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_volume'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.thicknessFactor = material.thickness; + + if ( material.thicknessMap ) { + + const thicknessMapDef = { + index: await writer.processTextureAsync( material.thicknessMap ), + texCoord: material.thicknessMap.channel + }; + writer.applyTextureTransform( thicknessMapDef, material.thicknessMap ); + extensionDef.thicknessTexture = thicknessMapDef; + + } + + if ( material.attenuationDistance !== Infinity ) { + + extensionDef.attenuationDistance = material.attenuationDistance; + + } + + extensionDef.attenuationColor = material.attenuationColor.toArray(); + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Materials ior Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior + */ +class GLTFMaterialsIorExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_ior'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.ior === 1.5 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.ior = material.ior; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Materials specular Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular + */ +class GLTFMaterialsSpecularExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_specular'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || ( material.specularIntensity === 1.0 && + material.specularColor.equals( DEFAULT_SPECULAR_COLOR ) && + ! material.specularIntensityMap && ! material.specularColorMap ) ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + if ( material.specularIntensityMap ) { + + const specularIntensityMapDef = { + index: await writer.processTextureAsync( material.specularIntensityMap ), + texCoord: material.specularIntensityMap.channel + }; + writer.applyTextureTransform( specularIntensityMapDef, material.specularIntensityMap ); + extensionDef.specularTexture = specularIntensityMapDef; + + } + + if ( material.specularColorMap ) { + + const specularColorMapDef = { + index: await writer.processTextureAsync( material.specularColorMap ), + texCoord: material.specularColorMap.channel + }; + writer.applyTextureTransform( specularColorMapDef, material.specularColorMap ); + extensionDef.specularColorTexture = specularColorMapDef; + + } + + extensionDef.specularFactor = material.specularIntensity; + extensionDef.specularColorFactor = material.specularColor.toArray(); + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Sheen Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen + */ +class GLTFMaterialsSheenExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_sheen'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.sheen == 0.0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + if ( material.sheenRoughnessMap ) { + + const sheenRoughnessMapDef = { + index: await writer.processTextureAsync( material.sheenRoughnessMap ), + texCoord: material.sheenRoughnessMap.channel + }; + writer.applyTextureTransform( sheenRoughnessMapDef, material.sheenRoughnessMap ); + extensionDef.sheenRoughnessTexture = sheenRoughnessMapDef; + + } + + if ( material.sheenColorMap ) { + + const sheenColorMapDef = { + index: await writer.processTextureAsync( material.sheenColorMap ), + texCoord: material.sheenColorMap.channel + }; + writer.applyTextureTransform( sheenColorMapDef, material.sheenColorMap ); + extensionDef.sheenColorTexture = sheenColorMapDef; + + } + + extensionDef.sheenRoughnessFactor = material.sheenRoughness; + extensionDef.sheenColorFactor = material.sheenColor.toArray(); + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Anisotropy Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy + */ +class GLTFMaterialsAnisotropyExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_anisotropy'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshPhysicalMaterial || material.anisotropy == 0.0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + if ( material.anisotropyMap ) { + + const anisotropyMapDef = { index: await writer.processTextureAsync( material.anisotropyMap ) }; + writer.applyTextureTransform( anisotropyMapDef, material.anisotropyMap ); + extensionDef.anisotropyTexture = anisotropyMapDef; + + } + + extensionDef.anisotropyStrength = material.anisotropy; + extensionDef.anisotropyRotation = material.anisotropyRotation; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * Materials Emissive Strength Extension + * + * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md + */ +class GLTFMaterialsEmissiveStrengthExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'KHR_materials_emissive_strength'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshStandardMaterial || material.emissiveIntensity === 1.0 ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + extensionDef.emissiveStrength = material.emissiveIntensity; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + + +/** + * Materials bump Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump + */ +class GLTFMaterialsBumpExtension { + + constructor( writer ) { + + this.writer = writer; + this.name = 'EXT_materials_bump'; + + } + + async writeMaterialAsync( material, materialDef ) { + + if ( ! material.isMeshStandardMaterial || ( + material.bumpScale === 1 && + ! material.bumpMap ) ) return; + + const writer = this.writer; + const extensionsUsed = writer.extensionsUsed; + + const extensionDef = {}; + + if ( material.bumpMap ) { + + const bumpMapDef = { + index: await writer.processTextureAsync( material.bumpMap ), + texCoord: material.bumpMap.channel + }; + writer.applyTextureTransform( bumpMapDef, material.bumpMap ); + extensionDef.bumpTexture = bumpMapDef; + + } + + extensionDef.bumpFactor = material.bumpScale; + + materialDef.extensions = materialDef.extensions || {}; + materialDef.extensions[ this.name ] = extensionDef; + + extensionsUsed[ this.name ] = true; + + } + +} + +/** + * GPU Instancing Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing + */ +class GLTFMeshGpuInstancing { + + constructor( writer ) { + + this.writer = writer; + this.name = 'EXT_mesh_gpu_instancing'; + + } + + writeNode( object, nodeDef ) { + + if ( ! object.isInstancedMesh ) return; + + const writer = this.writer; + + const mesh = object; + + const translationAttr = new Float32Array( mesh.count * 3 ); + const rotationAttr = new Float32Array( mesh.count * 4 ); + const scaleAttr = new Float32Array( mesh.count * 3 ); + + const matrix = new Matrix4(); + const position = new Vector3(); + const quaternion = new Quaternion(); + const scale = new Vector3(); + + for ( let i = 0; i < mesh.count; i ++ ) { + + mesh.getMatrixAt( i, matrix ); + matrix.decompose( position, quaternion, scale ); + + position.toArray( translationAttr, i * 3 ); + quaternion.toArray( rotationAttr, i * 4 ); + scale.toArray( scaleAttr, i * 3 ); + + } + + const attributes = { + TRANSLATION: writer.processAccessor( new BufferAttribute( translationAttr, 3 ) ), + ROTATION: writer.processAccessor( new BufferAttribute( rotationAttr, 4 ) ), + SCALE: writer.processAccessor( new BufferAttribute( scaleAttr, 3 ) ), + }; + + if ( mesh.instanceColor ) + attributes._COLOR_0 = writer.processAccessor( mesh.instanceColor ); + + nodeDef.extensions = nodeDef.extensions || {}; + nodeDef.extensions[ this.name ] = { attributes }; + + writer.extensionsUsed[ this.name ] = true; + writer.extensionsRequired[ this.name ] = true; + + } + +} + +/** + * Static utility functions + */ +GLTFExporter.Utils = { + + insertKeyframe: function ( track, time ) { + + const tolerance = 0.001; // 1ms + const valueSize = track.getValueSize(); + + const times = new track.TimeBufferType( track.times.length + 1 ); + const values = new track.ValueBufferType( track.values.length + valueSize ); + const interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) ); + + let index; + + if ( track.times.length === 0 ) { + + times[ 0 ] = time; + + for ( let i = 0; i < valueSize; i ++ ) { + + values[ i ] = 0; + + } + + index = 0; + + } else if ( time < track.times[ 0 ] ) { + + if ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0; + + times[ 0 ] = time; + times.set( track.times, 1 ); + + values.set( interpolant.evaluate( time ), 0 ); + values.set( track.values, valueSize ); + + index = 0; + + } else if ( time > track.times[ track.times.length - 1 ] ) { + + if ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) { + + return track.times.length - 1; + + } + + times[ times.length - 1 ] = time; + times.set( track.times, 0 ); + + values.set( track.values, 0 ); + values.set( interpolant.evaluate( time ), track.values.length ); + + index = times.length - 1; + + } else { + + for ( let i = 0; i < track.times.length; i ++ ) { + + if ( Math.abs( track.times[ i ] - time ) < tolerance ) return i; + + if ( track.times[ i ] < time && track.times[ i + 1 ] > time ) { + + times.set( track.times.slice( 0, i + 1 ), 0 ); + times[ i + 1 ] = time; + times.set( track.times.slice( i + 1 ), i + 2 ); + + values.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 ); + values.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize ); + values.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize ); + + index = i + 1; + + break; + + } + + } + + } + + track.times = times; + track.values = values; + + return index; + + }, + + mergeMorphTargetTracks: function ( clip, root ) { + + const tracks = []; + const mergedTracks = {}; + const sourceTracks = clip.tracks; + + for ( let i = 0; i < sourceTracks.length; ++ i ) { + + let sourceTrack = sourceTracks[ i ]; + const sourceTrackBinding = PropertyBinding.parseTrackName( sourceTrack.name ); + const sourceTrackNode = PropertyBinding.findNode( root, sourceTrackBinding.nodeName ); + + if ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) { + + // Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is. + tracks.push( sourceTrack ); + continue; + + } + + if ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete + && sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) { + + if ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) { + + // This should never happen, because glTF morph target animations + // affect all targets already. + throw new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' ); + + } + + console.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' ); + + sourceTrack = sourceTrack.clone(); + sourceTrack.setInterpolation( InterpolateLinear ); + + } + + const targetCount = sourceTrackNode.morphTargetInfluences.length; + const targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ]; + + if ( targetIndex === undefined ) { + + throw new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex ); + + } + + let mergedTrack; + + // If this is the first time we've seen this object, create a new + // track to store merged keyframe data for each morph target. + if ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) { + + mergedTrack = sourceTrack.clone(); + + const values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length ); + + for ( let j = 0; j < mergedTrack.times.length; j ++ ) { + + values[ j * targetCount + targetIndex ] = mergedTrack.values[ j ]; + + } + + // We need to take into consideration the intended target node + // of our original un-merged morphTarget animation. + mergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences'; + mergedTrack.values = values; + + mergedTracks[ sourceTrackNode.uuid ] = mergedTrack; + tracks.push( mergedTrack ); + + continue; + + } + + const sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) ); + + mergedTrack = mergedTracks[ sourceTrackNode.uuid ]; + + // For every existing keyframe of the merged track, write a (possibly + // interpolated) value from the source track. + for ( let j = 0; j < mergedTrack.times.length; j ++ ) { + + mergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] ); + + } + + // For every existing keyframe of the source track, write a (possibly + // new) keyframe to the merged track. Values from the previous loop may + // be written again, but keyframes are de-duplicated. + for ( let j = 0; j < sourceTrack.times.length; j ++ ) { + + const keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] ); + mergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ]; + + } + + } + + clip.tracks = tracks; + + return clip; + + }, + + toFloat32BufferAttribute: function ( srcAttribute ) { + + const dstAttribute = new BufferAttribute( new Float32Array( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false ); + + if ( ! srcAttribute.normalized && ! srcAttribute.isInterleavedBufferAttribute ) { + + dstAttribute.array.set( srcAttribute.array ); + + return dstAttribute; + + } + + for ( let i = 0, il = srcAttribute.count; i < il; i ++ ) { + + for ( let j = 0; j < srcAttribute.itemSize; j ++ ) { + + dstAttribute.setComponent( i, j, srcAttribute.getComponent( i, j ) ); + + } + + } + + return dstAttribute; + + } + +}; + +/* @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @param object {THREE.Object3D} + * @return {boolean} + */ +const compatibleObject = (object) => { + // @TODO: Need properer variantMaterials format validation? + return object.material !== + undefined && // easier than (!object.isMesh && !object.isLine && + // !object.isPoints) + object.userData && // just in case + object.userData.variantMaterials && + // Is this line costly? + !!Array + .from(object.userData.variantMaterials + .values()) + .filter(m => compatibleMaterial(m.material)); +}; +/** + * @param material {THREE.Material} + * @return {boolean} + */ +const compatibleMaterial = (material) => { + // @TODO: support multi materials? + return material && material.isMaterial && !Array.isArray(material); +}; +class GLTFExporterMaterialsVariantsExtension { + constructor(writer) { + this.writer = writer; + this.name = 'KHR_materials_variants'; + this.variantNames = []; + } + beforeParse(objects) { + // Find all variant names and store them to the table + const variantNameSet = new Set(); + const addVariantNames = (o) => { + if (!compatibleObject(o)) { + return; + } + const variantMaterials = o.userData.variantMaterials; + const variantDataMap = o.userData.variantData; + for (const [variantName, variantData] of variantDataMap) { + const variantMaterial = variantMaterials.get(variantData.index); + // Ignore unloaded variant materials + if (variantMaterial && compatibleMaterial(variantMaterial.material)) { + variantNameSet.add(variantName); + } + } + }; + if (Array.isArray(objects)) { + for (const object of objects) { + object.traverse(addVariantNames); + } + } + else { + objects.traverse(addVariantNames); + } + // We may want to sort? + variantNameSet.forEach(name => this.variantNames.push(name)); + } + async writeMesh(mesh, meshDef) { + if (!compatibleObject(mesh)) { + return; + } + const userData = mesh.userData; + const variantMaterials = userData.variantMaterials; + const variantDataMap = userData.variantData; + const mappingTable = new Map(); + // Removes gaps in the variant indices list (caused by deleting variants). + const reIndexedVariants = new Map(); + const variants = Array.from(variantDataMap.values()).sort((a, b) => { + return a.index - b.index; + }); + for (const [i, variantData] of variants.entries()) { + reIndexedVariants.set(variantData.index, i); + } + for (const variantData of variantDataMap.values()) { + const variantInstance = variantMaterials.get(variantData.index); + if (!variantInstance || !compatibleMaterial(variantInstance.material)) { + continue; + } + const materialIndex = await this.writer.processMaterialAsync(variantInstance.material); + if (!mappingTable.has(materialIndex)) { + mappingTable.set(materialIndex, { material: materialIndex, variants: [] }); + } + mappingTable.get(materialIndex).variants.push(reIndexedVariants.get(variantData.index)); + } + const mappingsDef = Array.from(mappingTable.values()) + .map((m => { return m.variants.sort((a, b) => a - b) && m; })) + .sort((a, b) => a.material - b.material); + if (mappingsDef.length === 0) { + return; + } + const originalMaterialIndex = compatibleMaterial(userData.originalMaterial) ? + await this.writer.processMaterialAsync(userData.originalMaterial) : + -1; + for (const primitiveDef of meshDef.primitives) { + // Override primitiveDef.material with original material. + if (originalMaterialIndex >= 0) { + primitiveDef.material = originalMaterialIndex; + } + primitiveDef.extensions = primitiveDef.extensions || {}; + primitiveDef.extensions[this.name] = { mappings: mappingsDef }; + } + } + afterParse() { + if (this.variantNames.length === 0) { + return; + } + const root = this.writer.json; + root.extensions = root.extensions || {}; + const variantsDef = this.variantNames.map(n => { + return { name: n }; + }); + root.extensions[this.name] = { variants: variantsDef }; + this.writer.extensionsUsed[this.name] = true; + } +} + +class SessionLightProbe { + + constructor( xrLight, renderer, lightProbe, environmentEstimation, estimationStartCallback ) { + + this.xrLight = xrLight; + this.renderer = renderer; + this.lightProbe = lightProbe; + this.xrWebGLBinding = null; + this.estimationStartCallback = estimationStartCallback; + this.frameCallback = this.onXRFrame.bind( this ); + + const session = renderer.xr.getSession(); + + // If the XRWebGLBinding class is available then we can also query an + // estimated reflection cube map. + if ( environmentEstimation && 'XRWebGLBinding' in window ) { + + // This is the simplest way I know of to initialize a WebGL cubemap in Three. + const cubeRenderTarget = new WebGLCubeRenderTarget( 16 ); + xrLight.environment = cubeRenderTarget.texture; + + const gl = renderer.getContext(); + + // Ensure that we have any extensions needed to use the preferred cube map format. + switch ( session.preferredReflectionFormat ) { + + case 'srgba8': + gl.getExtension( 'EXT_sRGB' ); + break; + + case 'rgba16f': + gl.getExtension( 'OES_texture_half_float' ); + break; + + } + + this.xrWebGLBinding = new XRWebGLBinding( session, gl ); + + this.lightProbe.addEventListener( 'reflectionchange', () => { + + this.updateReflection(); + + } ); + + } + + // Start monitoring the XR animation frame loop to look for lighting + // estimation changes. + session.requestAnimationFrame( this.frameCallback ); + + } + + updateReflection() { + + const textureProperties = this.renderer.properties.get( this.xrLight.environment ); + + if ( textureProperties ) { + + const cubeMap = this.xrWebGLBinding.getReflectionCubeMap( this.lightProbe ); + + if ( cubeMap ) { + + textureProperties.__webglTexture = cubeMap; + + this.xrLight.environment.needsPMREMUpdate = true; + + } + + } + + } + + onXRFrame( time, xrFrame ) { + + // If either this object or the XREstimatedLight has been destroyed, stop + // running the frame loop. + if ( ! this.xrLight ) { + + return; + + } + + const session = xrFrame.session; + session.requestAnimationFrame( this.frameCallback ); + + const lightEstimate = xrFrame.getLightEstimate( this.lightProbe ); + if ( lightEstimate ) { + + // We can copy the estimate's spherical harmonics array directly into the light probe. + this.xrLight.lightProbe.sh.fromArray( lightEstimate.sphericalHarmonicsCoefficients ); + this.xrLight.lightProbe.intensity = 1.0; + + // For the directional light we have to normalize the color and set the scalar as the + // intensity, since WebXR can return color values that exceed 1.0. + const intensityScalar = Math.max( 1.0, + Math.max( lightEstimate.primaryLightIntensity.x, + Math.max( lightEstimate.primaryLightIntensity.y, + lightEstimate.primaryLightIntensity.z ) ) ); + + this.xrLight.directionalLight.color.setRGB( + lightEstimate.primaryLightIntensity.x / intensityScalar, + lightEstimate.primaryLightIntensity.y / intensityScalar, + lightEstimate.primaryLightIntensity.z / intensityScalar ); + this.xrLight.directionalLight.intensity = intensityScalar; + this.xrLight.directionalLight.position.copy( lightEstimate.primaryLightDirection ); + + if ( this.estimationStartCallback ) { + + this.estimationStartCallback(); + this.estimationStartCallback = null; + + } + + } + + } + + dispose() { + + this.xrLight = null; + this.renderer = null; + this.lightProbe = null; + this.xrWebGLBinding = null; + + } + +} + +class XREstimatedLight extends Group { + + constructor( renderer, environmentEstimation = true ) { + + super(); + + this.lightProbe = new LightProbe(); + this.lightProbe.intensity = 0; + this.add( this.lightProbe ); + + this.directionalLight = new DirectionalLight(); + this.directionalLight.intensity = 0; + this.add( this.directionalLight ); + + // Will be set to a cube map in the SessionLightProbe if environment estimation is + // available and requested. + this.environment = null; + + let sessionLightProbe = null; + let estimationStarted = false; + renderer.xr.addEventListener( 'sessionstart', () => { + + const session = renderer.xr.getSession(); + + if ( 'requestLightProbe' in session ) { + + session.requestLightProbe( { + + reflectionFormat: session.preferredReflectionFormat + + } ).then( ( probe ) => { + + sessionLightProbe = new SessionLightProbe( this, renderer, probe, environmentEstimation, () => { + + estimationStarted = true; + + // Fired to indicate that the estimated lighting values are now being updated. + this.dispatchEvent( { type: 'estimationstart' } ); + + } ); + + } ); + + } + + } ); + + renderer.xr.addEventListener( 'sessionend', () => { + + if ( sessionLightProbe ) { + + sessionLightProbe.dispose(); + sessionLightProbe = null; + + } + + if ( estimationStarted ) { + + // Fired to indicate that the estimated lighting values are no longer being updated. + this.dispatchEvent( { type: 'estimationend' } ); + + } + + } ); + + // Done inline to provide access to sessionLightProbe. + this.dispose = () => { + + if ( sessionLightProbe ) { + + sessionLightProbe.dispose(); + sessionLightProbe = null; + + } + + this.remove( this.lightProbe ); + this.lightProbe = null; + + this.remove( this.directionalLight ); + this.directionalLight = null; + + this.environment = null; + + }; + + } + +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const SETTLING_TIME = 10000; // plenty long enough +const MIN_DECAY_MILLISECONDS = 0.001; +const DECAY_MILLISECONDS = 50; +/** + * The Damper class is a generic second-order critically damped system that does + * one linear step of the desired length of time. The only parameter is + * DECAY_MILLISECONDS. This common parameter makes all states converge at the + * same rate regardless of scale. xNormalization is a number to provide the + * rough scale of x, such that NIL_SPEED clamping also happens at roughly the + * same convergence for all states. + */ +class Damper { + constructor(decayMilliseconds = DECAY_MILLISECONDS) { + this.velocity = 0; + this.naturalFrequency = 0; + this.setDecayTime(decayMilliseconds); + } + setDecayTime(decayMilliseconds) { + this.naturalFrequency = + 1 / Math.max(MIN_DECAY_MILLISECONDS, decayMilliseconds); + } + update(x, xGoal, timeStepMilliseconds, xNormalization) { + const nilSpeed = 0.0002 * this.naturalFrequency; + if (x == null || xNormalization === 0) { + return xGoal; + } + if (x === xGoal && this.velocity === 0) { + return xGoal; + } + if (timeStepMilliseconds < 0) { + return x; + } + // Exact solution to a critically damped second-order system, where: + // acceleration = this.naturalFrequency * this.naturalFrequency * (xGoal + // - x) - 2 * this.naturalFrequency * this.velocity; + const deltaX = (x - xGoal); + const intermediateVelocity = this.velocity + this.naturalFrequency * deltaX; + const intermediateX = deltaX + timeStepMilliseconds * intermediateVelocity; + const decay = Math.exp(-this.naturalFrequency * timeStepMilliseconds); + const newVelocity = (intermediateVelocity - this.naturalFrequency * intermediateX) * decay; + const acceleration = -this.naturalFrequency * (newVelocity + intermediateVelocity * decay); + if (Math.abs(newVelocity) < nilSpeed * Math.abs(xNormalization) && + acceleration * deltaX >= 0) { + // This ensures the controls settle and stop calling this function instead + // of asymptotically approaching their goal. + this.velocity = 0; + return xGoal; + } + else { + this.velocity = newVelocity; + return xGoal + intermediateX * decay; + } + } +} + +/* @license +* Copyright 2020 Google LLC. All Rights Reserved. +* Licensed under the Apache License, Version 2.0 (the 'License'); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an 'AS IS' BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +// Enhanced configuration for dynamic sizing and visual design +const CONFIG = { + // Dynamic sizing - slightly bigger + MIN_TOUCH_AREA: 0.05, // minimum touch area + BASE_RADIUS: 0.15, // base radius + LINE_WIDTH: 0.02, // line width + SEGMENTS: 16, // segments for smoother curves + DELTA_PHI: Math.PI / (2 * 16), + // Enhanced visual design with more vibrant colors + COLORS: { + EDGE_FALLOFF: new Color(0.98, 0.98, 0.98), // Brighter light gray + EDGE_CUTOFF: new Color(0.8, 0.8, 0.8), // Brighter medium gray + FILL_FALLOFF: new Color(0.4, 0.4, 0.4), // Brighter dark gray + FILL_CUTOFF: new Color(0.4, 0.4, 0.4), // Brighter dark gray + ACTIVE_EDGE: new Color(1.0, 1.0, 1.0), // Pure white when active + ACTIVE_FILL: new Color(0.6, 0.6, 0.6), // Brighter fill when active + }, + // Opacity settings - now configurable + MAX_OPACITY: 0.75, + FILL_OPACITY_MULTIPLIER: 0.5, // Fill opacity relative to edge opacity + INTERACTIVE_OPACITY_MULTIPLIER: 1.2, // Edge opacity multiplier when interactive + // Distance-based scaling (similar to Footprint) + MIN_DISTANCE: 0.5, + MAX_DISTANCE: 10.0, + BASE_SCALE: 1.0, + DISTANCE_SCALE_FACTOR: 0.3, + COLOR_LERP_FACTOR: 0.15, // Color transition speed + // Screen space scaling - now configurable + SCREEN_SPACE_SCALE: 1.2, // Scale factor for screen space mode + // Performance optimization thresholds + SIZE_UPDATE_THRESHOLD: 0.001, // Minimum size change to trigger geometry update + GEOMETRY_UPDATE_DEBOUNCE: 100, // ms to debounce geometry updates +}; +const vector2$1 = new Vector2(); +/** +* Adds a quarter-annulus of vertices to the array, centered on cornerX, +* cornerY. +*/ +const addCorner = (vertices, cornerX, cornerY, radius, lineWidth) => { + let phi = cornerX > 0 ? (cornerY > 0 ? 0 : -Math.PI / 2) : + (cornerY > 0 ? Math.PI / 2 : Math.PI); + for (let i = 0; i <= CONFIG.SEGMENTS; ++i) { + vertices.push(cornerX + (radius - lineWidth) * Math.cos(phi), cornerY + (radius - lineWidth) * Math.sin(phi), 0, cornerX + radius * Math.cos(phi), cornerY + radius * Math.sin(phi), 0); + phi += CONFIG.DELTA_PHI; + } +}; +/** +* Enhanced PlacementBox that dynamically updates based on model size changes +* and features improved visual design inspired by Footprint. +*/ +class PlacementBox extends Mesh { + constructor(scene, side) { + const geometry = new BufferGeometry(); + super(geometry); + this.shadowHeight = 0; + // Visual state + this.isActive = false; + this.isHovered = false; + // Performance optimization + this.lastGeometryUpdateTime = 0; + this.needsGeometryUpdate = false; + this.scene = scene; + this.side = side; + this.currentSize = new Vector3(); + this.goalSize = new Vector3(); + this.sizeDamper = new Damper(); + // Initialize with current scene size + this.updateSizeFromScene(); + // Create enhanced materials with better visual properties + this.edgeMaterial = new MeshBasicMaterial({ + color: CONFIG.COLORS.EDGE_FALLOFF, + transparent: true, + opacity: 0, + side: DoubleSide, + depthWrite: false, // Better transparency handling + blending: AdditiveBlending // Subtle glow effect + }); + this.fillMaterial = new MeshBasicMaterial({ + color: CONFIG.COLORS.FILL_FALLOFF, + transparent: true, + opacity: 0, + side: DoubleSide, + depthWrite: false, // Better transparency handling + blending: NormalBlending + }); + this.material = this.edgeMaterial; + this.goalOpacity = 0; + this.opacityDamper = new Damper(); + // Create hit testing meshes + this.createHitMeshes(); + // Position based on scene + this.updatePositionFromScene(); + // Add to scene + scene.target.add(this); + scene.target.add(this.hitBox); + this.offsetHeight = 0; + } + updateSizeFromScene() { + const { size } = this.scene; + this.goalSize.copy(size); + // Apply proportional minimum size constraints + // For small models, use a smaller minimum size + const modelDiagonal = Math.sqrt(size.x * size.x + size.z * size.z); + const proportionalMinSize = Math.max(CONFIG.MIN_TOUCH_AREA, modelDiagonal * 0.4); // Increased from 0.3 to 0.4 + // Only apply minimum size if the model is very small + if (this.goalSize.x < proportionalMinSize) { + this.goalSize.x = proportionalMinSize; + } + if (this.goalSize.z < proportionalMinSize) { + this.goalSize.z = proportionalMinSize; + } + // Update geometry with new size + this.updateGeometry(); + } + updateGeometry() { + const geometry = this.geometry; + const triangles = []; + const vertices = []; + const x = this.goalSize.x / 2; + const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2; + // Use dynamic radius based on size - slightly bigger for better visibility + const modelSize = Math.min(x, y); + const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2); // Increased multipliers + const lineWidth = Math.max(CONFIG.LINE_WIDTH * 0.7, modelSize * 0.025); // Increased line width + addCorner(vertices, x, y, radius, lineWidth); + addCorner(vertices, -x, y, radius, lineWidth); + addCorner(vertices, -x, -y, radius, lineWidth); + addCorner(vertices, x, -y, radius, lineWidth); + const numVertices = vertices.length / 3; + for (let i = 0; i < numVertices - 2; i += 2) { + triangles.push(i, i + 1, i + 3, i, i + 3, i + 2); + } + const i = numVertices - 2; + triangles.push(i, i + 1, 1, i, 1, 0); + geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3)); + geometry.setIndex(triangles); + geometry.computeBoundingSphere(); + } + createHitMeshes() { + const x = this.goalSize.x / 2; + const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2; + const modelSize = Math.min(x, y); + const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2); + this.hitPlane = new Mesh(new PlaneGeometry(2 * (x + radius), 2 * (y + radius))); + this.hitPlane.visible = false; + this.hitPlane.material.side = DoubleSide; + this.add(this.hitPlane); + this.hitBox = new Mesh(new BoxGeometry(this.goalSize.x + 2 * radius, this.goalSize.y + radius, this.goalSize.z + 2 * radius)); + this.hitBox.visible = false; + this.hitBox.material.side = DoubleSide; + this.add(this.hitBox); + } + updatePositionFromScene() { + const { boundingBox } = this.scene; + boundingBox.getCenter(this.position); + // Reset rotation to ensure proper orientation + this.rotation.set(0, 0, 0); + switch (this.side) { + case 'bottom': + // Ensure the placement box is horizontal for floor placement + this.rotateX(-Math.PI / 2); + this.shadowHeight = boundingBox.min.y; + this.position.y = this.shadowHeight; + break; + case 'back': + // For wall placement, keep it vertical but ensure proper orientation + this.shadowHeight = boundingBox.min.z; + this.position.z = this.shadowHeight; + break; + case 'top': + // move placement box to the top of the model + this.rotateX(-Math.PI / 2); + this.shadowHeight = boundingBox.max.y; + this.position.y = this.shadowHeight; + break; + } + // Update hit box position with proper offset + if (this.hitBox) { + const offset = this.side === 'back' ? + (this.goalSize.y + CONFIG.BASE_RADIUS) / 2 : + (this.goalSize.y + CONFIG.BASE_RADIUS) / 2; + this.hitBox.position.y = offset + boundingBox.min.y; + } + } + /** + * Update the placement box when model size changes + * Optimized to batch updates and reduce performance impact + */ + updateFromModelChanges() { + this.updateSizeFromScene(); + this.updatePositionFromScene(); + // Force immediate geometry update for model changes + this.updateGeometry(); + this.updateHitMeshes(); + this.ensureProperOrientation(); + // Reset performance tracking + this.needsGeometryUpdate = false; + this.lastGeometryUpdateTime = performance.now(); + } + /** + * Ensure the placement box is properly oriented for the current mode + */ + ensureProperOrientation() { + // Force proper orientation based on side + if (this.side === 'bottom') { + // For floor placement, ensure it's horizontal + this.rotation.x = -Math.PI / 2; + this.rotation.y = 0; + this.rotation.z = 0; + } + else if (this.side === 'back') { + // For wall placement, ensure it's vertical + this.rotation.x = 0; + this.rotation.y = 0; + this.rotation.z = 0; + } + } + /** + * Set screen space mode to adjust positioning for mobile AR + */ + setScreenSpaceMode(isScreenSpace) { + if (isScreenSpace) { + // In screen space mode, ensure the placement box is more visible + // and properly positioned for touch interaction + this.scale.set(CONFIG.SCREEN_SPACE_SCALE, CONFIG.SCREEN_SPACE_SCALE, CONFIG.SCREEN_SPACE_SCALE); + } + else { + // Reset scale for world space mode + this.scale.set(1.0, 1.0, 1.0); + } + } + updateHitMeshes() { + if (this.hitPlane && this.hitBox) { + const x = this.goalSize.x / 2; + const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2; + const modelSize = Math.min(x, y); + const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2); + // Update hit plane geometry + const hitPlaneGeometry = new PlaneGeometry(2 * (x + radius), 2 * (y + radius)); + this.hitPlane.geometry.dispose(); + this.hitPlane.geometry = hitPlaneGeometry; + // Update hit box geometry + const hitBoxGeometry = new BoxGeometry(this.goalSize.x + 2 * radius, this.goalSize.y + radius, this.goalSize.z + 2 * radius); + this.hitBox.geometry.dispose(); + this.hitBox.geometry = hitBoxGeometry; + } + } + /** + * Set interaction state for visual feedback + */ + setInteractionState(isActive, isHovered = false) { + this.isActive = isActive; + this.isHovered = isHovered; + this.updateVisualState(); + } + updateVisualState() { + let targetColor; + let targetFillColor; + if (this.isActive) { + targetColor = CONFIG.COLORS.ACTIVE_EDGE; + targetFillColor = CONFIG.COLORS.ACTIVE_FILL; + } + else if (this.isHovered) { + targetColor = CONFIG.COLORS.EDGE_FALLOFF; + targetFillColor = CONFIG.COLORS.FILL_FALLOFF; + } + else { + targetColor = CONFIG.COLORS.EDGE_CUTOFF; + targetFillColor = CONFIG.COLORS.FILL_CUTOFF; + } + // Smoothly transition colors with configurable response speed + this.edgeMaterial.color.lerp(targetColor, CONFIG.COLOR_LERP_FACTOR); + this.fillMaterial.color.lerp(targetFillColor, CONFIG.COLOR_LERP_FACTOR); + } + /** + * Apply distance-based scaling + */ + applyDistanceScaling(cameraPosition) { + const distanceToCamera = cameraPosition.distanceTo(this.position); + const clampedDistance = Math.max(CONFIG.MIN_DISTANCE, Math.min(CONFIG.MAX_DISTANCE, distanceToCamera)); + const scaleFactor = CONFIG.BASE_SCALE + + (clampedDistance - CONFIG.MIN_DISTANCE) * CONFIG.DISTANCE_SCALE_FACTOR; + this.scale.set(scaleFactor, scaleFactor, scaleFactor); + } + /** + * Get the world hit position if the touch coordinates hit the box, and null + * otherwise. Pass the scene in to get access to its raycaster. + */ + getHit(scene, screenX, screenY) { + vector2$1.set(screenX, -screenY); + this.hitPlane.visible = true; + const hitResult = scene.positionAndNormalFromPoint(vector2$1, this.hitPlane); + this.hitPlane.visible = false; + return hitResult == null ? null : hitResult.position; + } + getExpandedHit(scene, screenX, screenY) { + this.hitPlane.scale.set(1000, 1000, 1000); + this.hitPlane.updateMatrixWorld(); + const hitResult = this.getHit(scene, screenX, screenY); + this.hitPlane.scale.set(1, 1, 1); + return hitResult; + } + controllerIntersection(scene, controller) { + this.hitBox.visible = true; + const hitResult = scene.hitFromController(controller, this.hitBox); + this.hitBox.visible = false; + return hitResult; + } + /** + * Offset the height of the box relative to the bottom of the scene. Positive + * is up, so generally only negative values are used. + */ + set offsetHeight(offset) { + offset -= 0.001; // push 1 mm below shadow to avoid z-fighting + if (this.side === 'back') { + this.position.z = this.shadowHeight + offset; + } + else { + this.position.y = this.shadowHeight + offset; + } + } + get offsetHeight() { + if (this.side === 'back') { + return this.position.z - this.shadowHeight; + } + else { + return this.position.y - this.shadowHeight; + } + } + /** + * Set the box's visibility; it will fade in and out. + */ + set show(visible) { + this.goalOpacity = visible ? CONFIG.MAX_OPACITY : 0; + } + /** + * Call on each frame with the frame delta to fade the box. + */ + updateOpacity(delta) { + const material = this.material; + const newOpacity = this.opacityDamper.update(material.opacity, this.goalOpacity, delta, 1); + // Update both edge and fill materials with configurable visibility + this.edgeMaterial.opacity = newOpacity; + this.fillMaterial.opacity = newOpacity * CONFIG.FILL_OPACITY_MULTIPLIER; + // Add subtle glow effect when active or hovered + if (this.isActive || this.isHovered) { + this.edgeMaterial.opacity = newOpacity * CONFIG.INTERACTIVE_OPACITY_MULTIPLIER; + } + this.visible = newOpacity > 0; + } + /** + * Update method to be called each frame for smooth transitions + * Optimized to reduce frequent geometry updates for better performance + */ + update(delta, cameraPosition) { + // Update opacity + this.updateOpacity(delta); + // Update size transitions with performance optimization + if (!this.currentSize.equals(this.goalSize)) { + const newSize = new Vector3(); + newSize.x = this.sizeDamper.update(this.currentSize.x, this.goalSize.x, delta, 1); + newSize.y = this.sizeDamper.update(this.currentSize.y, this.goalSize.y, delta, 1); + newSize.z = this.sizeDamper.update(this.currentSize.z, this.goalSize.z, delta, 1); + // Check if size change is significant enough to warrant geometry update + const sizeChange = newSize.distanceTo(this.currentSize); + if (sizeChange > CONFIG.SIZE_UPDATE_THRESHOLD) { + this.currentSize.copy(newSize); + this.needsGeometryUpdate = true; + } + } + // Debounce geometry updates to prevent excessive updates + const now = performance.now(); + if (this.needsGeometryUpdate && + (now - this.lastGeometryUpdateTime) > CONFIG.GEOMETRY_UPDATE_DEBOUNCE) { + this.updateGeometry(); + this.updateHitMeshes(); + this.needsGeometryUpdate = false; + this.lastGeometryUpdateTime = now; + } + // Apply distance scaling if camera position is provided + if (cameraPosition) { + this.applyDistanceScaling(cameraPosition); + } + // Update visual state + this.updateVisualState(); + } + /** + * Get the current size of the placement box + */ + getSize() { + return this.goalSize.clone(); + } + /** + * Call this to clean up Three's cache when you remove the box. + */ + dispose() { + const { geometry, material } = this.hitPlane; + geometry.dispose(); + material.dispose(); + this.hitBox.geometry.dispose(); + this.hitBox.material.dispose(); + this.geometry.dispose(); + this.edgeMaterial.dispose(); + this.fillMaterial.dispose(); + this.hitBox.removeFromParent(); + this.removeFromParent(); + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const numberNode = (value, unit) => ({ type: 'number', number: value, unit }); +/** + * Given a string representing a comma-separated set of CSS-like expressions, + * parses and returns an array of ASTs that correspond to those expressions. + * + * Currently supported syntax includes: + * + * - functions (top-level and nested) + * - calc() arithmetic operators + * - numbers with units + * - hexadecimal-encoded colors in 3, 6 or 8 digit form + * - idents + * + * All syntax is intended to match the parsing rules and semantics of the actual + * CSS spec as closely as possible. + * + * @see https://www.w3.org/TR/CSS2/ + * @see https://www.w3.org/TR/css-values-3/ + */ +const parseExpressions = (() => { + const cache = {}; + const MAX_PARSE_ITERATIONS = 1000; // Arbitrarily large + return (inputString) => { + const cacheKey = inputString; + if (cacheKey in cache) { + return cache[cacheKey]; + } + const expressions = []; + let parseIterations = 0; + while (inputString) { + if (++parseIterations > MAX_PARSE_ITERATIONS) { + // Avoid a potentially infinite loop due to typos: + inputString = ''; + break; + } + const expressionParseResult = parseExpression(inputString); + const expression = expressionParseResult.nodes[0]; + if (expression == null || expression.terms.length === 0) { + break; + } + expressions.push(expression); + inputString = expressionParseResult.remainingInput; + } + return cache[cacheKey] = expressions; + }; +})(); +/** + * Parse a single expression. For the purposes of our supported syntax, an + * expression is the set of semantically meaningful terms that appear before the + * next comma, or between the parens of a function invocation. + */ +const parseExpression = (() => { + const IS_IDENT_RE = /^(\-\-|[a-z\u0240-\uffff])/i; + const IS_OPERATOR_RE = /^([\*\+\/]|[\-]\s)/i; + const IS_EXPRESSION_END_RE = /^[\),]/; + const FUNCTION_ARGUMENTS_FIRST_TOKEN = '('; + const HEX_FIRST_TOKEN = '#'; + return (inputString) => { + const terms = []; + while (inputString.length) { + inputString = inputString.trim(); + if (IS_EXPRESSION_END_RE.test(inputString)) { + break; + } + else if (inputString[0] === FUNCTION_ARGUMENTS_FIRST_TOKEN) { + const { nodes, remainingInput } = parseFunctionArguments(inputString); + inputString = remainingInput; + terms.push({ + type: 'function', + name: { type: 'ident', value: 'calc' }, + arguments: nodes + }); + } + else if (IS_IDENT_RE.test(inputString)) { + const identParseResult = parseIdent(inputString); + const identNode = identParseResult.nodes[0]; + inputString = identParseResult.remainingInput; + if (inputString[0] === FUNCTION_ARGUMENTS_FIRST_TOKEN) { + const { nodes, remainingInput } = parseFunctionArguments(inputString); + terms.push({ type: 'function', name: identNode, arguments: nodes }); + inputString = remainingInput; + } + else { + terms.push(identNode); + } + } + else if (IS_OPERATOR_RE.test(inputString)) { + // Operators are always a single character, so just pluck them out: + terms.push({ type: 'operator', value: inputString[0] }); + inputString = inputString.slice(1); + } + else { + const { nodes, remainingInput } = inputString[0] === HEX_FIRST_TOKEN ? + parseHex(inputString) : + parseNumber(inputString); + // The remaining string may not have had any meaningful content. Exit + // early if this is the case: + if (nodes.length === 0) { + break; + } + terms.push(nodes[0]); + inputString = remainingInput; + } + } + return { nodes: [{ type: 'expression', terms }], remainingInput: inputString }; + }; +})(); +/** + * An ident is something like a function name or the keyword "auto". + */ +const parseIdent = (() => { + const NOT_IDENT_RE = /[^a-z0-9_\-\u0240-\uffff]/i; + return (inputString) => { + const match = inputString.match(NOT_IDENT_RE); + const ident = match == null ? inputString : inputString.substr(0, match.index); + const remainingInput = match == null ? '' : inputString.substr(match.index); + return { nodes: [{ type: 'ident', value: ident }], remainingInput }; + }; +})(); +/** + * Parses a number. A number value can be expressed with an integer or + * non-integer syntax, and usually includes a unit (but does not strictly + * require one for our purposes). + */ +const parseNumber = (() => { + // @see https://www.w3.org/TR/css-syntax/#number-token-diagram + const VALUE_RE = /[\+\-]?(\d+[\.]\d+|\d+|[\.]\d+)([eE][\+\-]?\d+)?/; + const UNIT_RE = /^[a-z%]+/i; + const ALLOWED_UNITS = /^(m|mm|cm|rad|deg|[%])$/; + return (inputString) => { + const valueMatch = inputString.match(VALUE_RE); + const value = valueMatch == null ? '0' : valueMatch[0]; + inputString = value == null ? inputString : inputString.slice(value.length); + const unitMatch = inputString.match(UNIT_RE); + let unit = unitMatch != null && unitMatch[0] !== '' ? unitMatch[0] : null; + const remainingInput = unitMatch == null ? inputString : inputString.slice(unit.length); + if (unit != null && !ALLOWED_UNITS.test(unit)) { + unit = null; + } + return { + nodes: [{ + type: 'number', + number: parseFloat(value) || 0, + unit: unit + }], + remainingInput + }; + }; +})(); +/** + * Parses a hexadecimal-encoded color in 3, 6 or 8 digit form. + */ +const parseHex = (() => { + // TODO(cdata): right now we don't actually enforce the number of digits + const HEX_RE = /^[a-f0-9]*/i; + return (inputString) => { + inputString = inputString.slice(1).trim(); + const hexMatch = inputString.match(HEX_RE); + const nodes = hexMatch == null ? [] : [{ type: 'hex', value: hexMatch[0] }]; + return { + nodes, + remainingInput: hexMatch == null ? inputString : + inputString.slice(hexMatch[0].length) + }; + }; +})(); +/** + * Parses arguments passed to a function invocation (e.g., the expressions + * within a matched set of parens). + */ +const parseFunctionArguments = (inputString) => { + const expressionNodes = []; + // Consume the opening paren + inputString = inputString.slice(1).trim(); + while (inputString.length) { + const expressionParseResult = parseExpression(inputString); + expressionNodes.push(expressionParseResult.nodes[0]); + inputString = expressionParseResult.remainingInput.trim(); + if (inputString[0] === ',') { + inputString = inputString.slice(1).trim(); + } + else if (inputString[0] === ')') { + // Consume the closing paren and stop parsing + inputString = inputString.slice(1); + break; + } + } + return { nodes: expressionNodes, remainingInput: inputString }; +}; +const $visitedTypes = Symbol('visitedTypes'); +/** + * An ASTWalker walks an array of ASTs such as the type produced by + * parseExpressions and invokes a callback for a configured set of nodes that + * the user wishes to "visit" during the walk. + */ +class ASTWalker { + constructor(visitedTypes) { + this[$visitedTypes] = visitedTypes; + } + /** + * Walk the given set of ASTs, and invoke the provided callback for nodes that + * match the filtered set that the ASTWalker was constructed with. + */ + walk(ast, callback) { + const remaining = ast.slice(); + while (remaining.length) { + const next = remaining.shift(); + if (this[$visitedTypes].indexOf(next.type) > -1) { + callback(next); + } + switch (next.type) { + case 'expression': + remaining.unshift(...next.terms); + break; + case 'function': + remaining.unshift(next.name, ...next.arguments); + break; + } + } + } +} +const ZERO = Object.freeze({ type: 'number', number: 0, unit: null }); + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Ensures that a given number is expressed in radians. If the number is already + * in radians, does nothing. If the value is in degrees, converts it to radians. + * If the value has no specified unit, the unit is assumed to be radians. If the + * value is not in radians or degrees, the value is resolved as 0 radians. + * + * Also accepts a second argument that is a default value to use if the input + * numberNode number is NaN or Infinity. + */ +const degreesToRadians = (numberNode, fallbackRadianValue = 0) => { + let { number, unit } = numberNode; + if (!isFinite(number)) { + number = fallbackRadianValue; + unit = 'rad'; + } + else if (numberNode.unit === 'rad' || numberNode.unit == null) { + return numberNode; + } + const valueIsDegrees = unit === 'deg' && number != null; + const value = valueIsDegrees ? number : 0; + const radians = value * Math.PI / 180; + return { type: 'number', number: radians, unit: 'rad' }; +}; +/** + * Converts a given length to meters. Currently supported input units are + * meters, centimeters and millimeters. + * + * Also accepts a second argument that is a default value to use if the input + * numberNode number is NaN or Infinity. + */ +const lengthToBaseMeters = (numberNode, fallbackMeterValue = 0) => { + let { number, unit } = numberNode; + if (!isFinite(number)) { + number = fallbackMeterValue; + unit = 'm'; + } + else if (numberNode.unit === 'm') { + return numberNode; + } + let scale; + switch (unit) { + default: + scale = 1; + break; + case 'cm': + scale = 1 / 100; + break; + case 'mm': + scale = 1 / 1000; + break; + } + const value = scale * number; + return { type: 'number', number: value, unit: 'm' }; +}; +/** + * Normalizes the unit of a given input number so that it is expressed in a + * preferred unit. For length nodes, the return value will be expressed in + * meters. For angle nodes, the return value will be expressed in radians. + * + * Also takes a fallback number that is used when the number value is not a + * valid number or when the unit of the given number cannot be normalized. + */ +const normalizeUnit = (() => { + const identity = (node) => node; + const unitNormalizers = { + 'rad': identity, + 'deg': degreesToRadians, + 'm': identity, + 'mm': lengthToBaseMeters, + 'cm': lengthToBaseMeters + }; + return (node, fallback = ZERO) => { + if (!isFinite(node.number)) { + node.number = fallback.number; + node.unit = fallback.unit; + } + const { unit } = node; + if (unit == null) { + return node; + } + const normalize = unitNormalizers[unit]; + if (normalize == null) { + return fallback; + } + return normalize(node); + }; +})(); + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$6, _b$6, _c$4; +const $evaluate = Symbol('evaluate'); +const $lastValue = Symbol('lastValue'); +/** + * An Evaluator is used to derive a computed style from part (or all) of a CSS + * expression AST. This construct is particularly useful for complex ASTs + * containing function calls such as calc, var and env. Such styles could be + * costly to re-evaluate on every frame (and in some cases we may try to do + * that). The Evaluator construct allows us to mark sub-trees of the AST as + * constant, so that only the dynamic parts are re-evaluated. It also separates + * one-time AST preparation work from work that necessarily has to happen upon + * each evaluation. + */ +class Evaluator { + constructor() { + this[_a$6] = null; + } + /** + * An Evaluatable is a NumberNode or an Evaluator that evaluates a NumberNode + * as the result of invoking its evaluate method. This is mainly used to + * ensure that CSS function nodes are cast to the corresponding Evaluators + * that will resolve the result of the function, but is also used to ensure + * that a percentage nested at arbitrary depth in the expression will always + * be evaluated against the correct basis. + */ + static evaluatableFor(node, basis = ZERO) { + if (node instanceof Evaluator) { + return node; + } + if (node.type === 'number') { + if (node.unit === '%') { + return new PercentageEvaluator(node, basis); + } + return node; + } + switch (node.name.value) { + case 'calc': + return new CalcEvaluator(node, basis); + case 'env': + return new EnvEvaluator(node); + } + return ZERO; + } + /** + * If the input is an Evaluator, returns the result of evaluating it. + * Otherwise, returns the input. + * + * This is a helper to aide in resolving a NumberNode without conditionally + * checking if the Evaluatable is an Evaluator everywhere. + */ + static evaluate(evaluatable) { + if (evaluatable instanceof Evaluator) { + return evaluatable.evaluate(); + } + return evaluatable; + } + /** + * If the input is an Evaluator, returns the value of its isConstant property. + * Returns true for all other input values. + */ + static isConstant(evaluatable) { + if (evaluatable instanceof Evaluator) { + return evaluatable.isConstant; + } + return true; + } + /** + * This method applies a set of structured intrinsic metadata to an evaluated + * result from a parsed CSS-like string of expressions. Intrinsics provide + * sufficient metadata (e.g., basis values, analogs for keywords) such that + * omitted values in the input string can be backfilled, and keywords can be + * converted to concrete numbers. + * + * The result of applying intrinsics is a tuple of NumberNode values whose + * units match the units used by the basis of the intrinsics. + * + * The following is a high-level description of how intrinsics are applied: + * + * 1. Determine the value of 'auto' for the current term + * 2. If there is no corresponding input value for this term, substitute the + * 'auto' value. + * 3. If the term is an IdentNode, treat it as a keyword and perform the + * appropriate substitution. + * 4. If the term is still null, fallback to the 'auto' value + * 5. If the term is a percentage, apply it to the basis and return that + * value + * 6. Normalize the unit of the term + * 7. If the term's unit does not match the basis unit, return the basis + * value + * 8. Return the term as is + */ + static applyIntrinsics(evaluated, intrinsics) { + const { basis, keywords } = intrinsics; + const { auto } = keywords; + return basis.map((basisNode, index) => { + // Use an auto value if we have it, otherwise the auto value is the basis: + const autoSubstituteNode = auto[index] == null ? basisNode : auto[index]; + // If the evaluated nodes do not have a node at the current + // index, fallback to the "auto" substitute right away: + let evaluatedNode = evaluated[index] ? evaluated[index] : autoSubstituteNode; + // Any ident node is considered a keyword: + if (evaluatedNode.type === 'ident') { + const keyword = evaluatedNode.value; + // Substitute any keywords for concrete values first: + if (keyword in keywords) { + evaluatedNode = keywords[keyword][index]; + } + } + // If we don't have a NumberNode at this point, fall back to whatever + // is specified for auto: + if (evaluatedNode == null || evaluatedNode.type === 'ident') { + evaluatedNode = autoSubstituteNode; + } + // For percentages, we always apply the percentage to the basis value: + if (evaluatedNode.unit === '%') { + return numberNode(evaluatedNode.number / 100 * basisNode.number, basisNode.unit); + } + // Otherwise, normalize whatever we have: + evaluatedNode = normalizeUnit(evaluatedNode, basisNode); + // If the normalized units do not match, return the basis as a fallback: + if (evaluatedNode.unit !== basisNode.unit) { + return basisNode; + } + // Finally, return the evaluated node with intrinsics applied: + return evaluatedNode; + }); + } + /** + * If true, the Evaluator will only evaluate its AST one time. If false, the + * Evaluator will re-evaluate the AST each time that the public evaluate + * method is invoked. + */ + get isConstant() { + return false; + } + /** + * Evaluate the Evaluator and return the result. If the Evaluator is constant, + * the corresponding AST will only be evaluated once, and the result of + * evaluating it the first time will be returned on all subsequent + * evaluations. + */ + evaluate() { + if (!this.isConstant || this[$lastValue] == null) { + this[$lastValue] = this[$evaluate](); + } + return this[$lastValue]; + } +} +_a$6 = $lastValue; +const $percentage = Symbol('percentage'); +const $basis = Symbol('basis'); +/** + * A PercentageEvaluator scales a given basis value by a given percentage value. + * The evaluated result is always considered to be constant. + */ +class PercentageEvaluator extends Evaluator { + constructor(percentage, basis) { + super(); + this[$percentage] = percentage; + this[$basis] = basis; + } + get isConstant() { + return true; + } + [$evaluate]() { + return numberNode(this[$percentage].number / 100 * this[$basis].number, this[$basis].unit); + } +} +const $identNode = Symbol('identNode'); +/** + * Evaluator for CSS-like env() functions. Currently, only one environment + * variable is accepted as an argument for such functions: window-scroll-y. + * + * The env() Evaluator is explicitly dynamic because it always refers to + * external state that changes as the user scrolls, so it should always be + * re-evaluated to ensure we get the most recent value. + * + * Some important notes about this feature include: + * + * - There is no such thing as a "window-scroll-y" CSS environment variable in + * any stable browser at the time that this comment is being written. + * - The actual CSS env() function accepts a second argument as a fallback for + * the case that the specified first argument isn't set; our syntax does not + * support this second argument. + * + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/env + */ +class EnvEvaluator extends Evaluator { + constructor(envFunction) { + super(); + this[_b$6] = null; + const identNode = envFunction.arguments.length ? envFunction.arguments[0].terms[0] : null; + if (identNode != null && identNode.type === 'ident') { + this[$identNode] = identNode; + } + } + get isConstant() { + return false; + } + ; + [(_b$6 = $identNode, $evaluate)]() { + if (this[$identNode] != null) { + switch (this[$identNode].value) { + case 'window-scroll-y': + const verticalScrollPosition = window.pageYOffset; + const verticalScrollMax = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight); + const scrollY = verticalScrollPosition / + (verticalScrollMax - window.innerHeight) || + 0; + return { type: 'number', number: scrollY, unit: null }; + } + } + return ZERO; + } +} +const IS_MULTIPLICATION_RE = /[\*\/]/; +const $evaluator = Symbol('evaluator'); +/** + * Evaluator for CSS-like calc() functions. Our implementation of calc() + * evaluation currently support nested function calls, an unlimited number of + * terms, and all four algebraic operators (+, -, * and /). + * + * The Evaluator is marked as constant unless the calc expression contains an + * internal env expression at any depth, in which case it will be marked as + * dynamic. + * + * @see https://www.w3.org/TR/css-values-3/#calc-syntax + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/calc + */ +class CalcEvaluator extends Evaluator { + constructor(calcFunction, basis = ZERO) { + super(); + this[_c$4] = null; + if (calcFunction.arguments.length !== 1) { + return; + } + const terms = calcFunction.arguments[0].terms.slice(); + const secondOrderTerms = []; + while (terms.length) { + const term = terms.shift(); + if (secondOrderTerms.length > 0) { + const previousTerm = secondOrderTerms[secondOrderTerms.length - 1]; + if (previousTerm.type === 'operator' && + IS_MULTIPLICATION_RE.test(previousTerm.value)) { + const operator = secondOrderTerms.pop(); + const leftValue = secondOrderTerms.pop(); + if (leftValue == null) { + return; + } + secondOrderTerms.push(new OperatorEvaluator(operator, Evaluator.evaluatableFor(leftValue, basis), Evaluator.evaluatableFor(term, basis))); + continue; + } + } + secondOrderTerms.push(term.type === 'operator' ? term : + Evaluator.evaluatableFor(term, basis)); + } + while (secondOrderTerms.length > 2) { + const [left, operator, right] = secondOrderTerms.splice(0, 3); + if (operator.type !== 'operator') { + return; + } + secondOrderTerms.unshift(new OperatorEvaluator(operator, Evaluator.evaluatableFor(left, basis), Evaluator.evaluatableFor(right, basis))); + } + // There should only be one combined evaluator at this point: + if (secondOrderTerms.length === 1) { + this[$evaluator] = secondOrderTerms[0]; + } + } + get isConstant() { + return this[$evaluator] == null || Evaluator.isConstant(this[$evaluator]); + } + [(_c$4 = $evaluator, $evaluate)]() { + return this[$evaluator] != null ? Evaluator.evaluate(this[$evaluator]) : + ZERO; + } +} +const $operator = Symbol('operator'); +const $left = Symbol('left'); +const $right = Symbol('right'); +/** + * An Evaluator for the operators found inside CSS calc() functions. + * The evaluator accepts an operator and left/right operands. The operands can + * be any valid expression term typically allowed inside a CSS calc function. + * + * As detail of this implementation, the only supported unit types are angles + * expressed as radians or degrees, and lengths expressed as meters, centimeters + * or millimeters. + * + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/calc + */ +class OperatorEvaluator extends Evaluator { + constructor(operator, left, right) { + super(); + this[$operator] = operator; + this[$left] = left; + this[$right] = right; + } + get isConstant() { + return Evaluator.isConstant(this[$left]) && + Evaluator.isConstant(this[$right]); + } + [$evaluate]() { + const leftNode = normalizeUnit(Evaluator.evaluate(this[$left])); + const rightNode = normalizeUnit(Evaluator.evaluate(this[$right])); + const { number: leftValue, unit: leftUnit } = leftNode; + const { number: rightValue, unit: rightUnit } = rightNode; + // Disallow operations for mismatched normalized units e.g., m and rad: + if (rightUnit != null && leftUnit != null && rightUnit != leftUnit) { + return ZERO; + } + // NOTE(cdata): rules for calc type checking are defined here + // https://drafts.csswg.org/css-values-3/#calc-type-checking + // This is a simplification and may not hold up once we begin to support + // additional unit types: + const unit = leftUnit || rightUnit; + let value; + switch (this[$operator].value) { + case '+': + value = leftValue + rightValue; + break; + case '-': + value = leftValue - rightValue; + break; + case '/': + value = leftValue / rightValue; + break; + case '*': + value = leftValue * rightValue; + break; + default: + return ZERO; + } + return { type: 'number', number: value, unit }; + } +} +const $evaluatables = Symbol('evaluatables'); +const $intrinsics = Symbol('intrinsics'); +/** + * A VectorEvaluator evaluates a series of numeric terms that usually represent + * a data structure such as a multi-dimensional vector or a spherical + * + * The form of the evaluator's result is determined by the Intrinsics that are + * given to it when it is constructed. For example, spherical intrinsics would + * establish two angle terms and a length term, so the result of evaluating the + * evaluator that is configured with spherical intrinsics is a three element + * array where the first two elements represent angles in radians and the third + * element representing a length in meters. + */ +class StyleEvaluator extends Evaluator { + constructor(expressions, intrinsics) { + super(); + this[$intrinsics] = intrinsics; + const firstExpression = expressions[0]; + const terms = firstExpression != null ? firstExpression.terms : []; + this[$evaluatables] = + intrinsics.basis.map((basisNode, index) => { + const term = terms[index]; + if (term == null) { + return { type: 'ident', value: 'auto' }; + } + if (term.type === 'ident') { + return term; + } + return Evaluator.evaluatableFor(term, basisNode); + }); + } + get isConstant() { + for (const evaluatable of this[$evaluatables]) { + if (!Evaluator.isConstant(evaluatable)) { + return false; + } + } + return true; + } + [$evaluate]() { + const evaluated = this[$evaluatables].map(evaluatable => Evaluator.evaluate(evaluatable)); + return Evaluator.applyIntrinsics(evaluated, this[$intrinsics]) + .map(numberNode => numberNode.number); + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$5, _b$5, _c$3, _d$2; +const $instances = Symbol('instances'); +const $activateListener = Symbol('activateListener'); +const $deactivateListener = Symbol('deactivateListener'); +const $notifyInstances = Symbol('notifyInstances'); +const $notify = Symbol('notify'); +const $scrollCallback = Symbol('callback'); +/** + * This internal helper is intended to work as a reference-counting manager of + * scroll event listeners. Only one scroll listener is ever registered for all + * instances of the class, and when the last ScrollObserver "disconnects", that + * event listener is removed. This spares us from thrashing + * the {add,remove}EventListener API (the binding cost of these methods has been + * known to show up in performance analyses) as well as potential memory leaks. + */ +class ScrollObserver { + static [$notifyInstances]() { + for (const instance of ScrollObserver[$instances]) { + instance[$notify](); + } + } + static [(_a$5 = $instances, $activateListener)]() { + window.addEventListener('scroll', this[$notifyInstances], { passive: true }); + } + static [$deactivateListener]() { + window.removeEventListener('scroll', this[$notifyInstances]); + } + constructor(callback) { + this[$scrollCallback] = callback; + } + /** + * Listen for scroll events. The configured callback (passed to the + * constructor) will be invoked for subsequent global scroll events. + */ + observe() { + if (ScrollObserver[$instances].size === 0) { + ScrollObserver[$activateListener](); + } + ScrollObserver[$instances].add(this); + } + /** + * Stop listening for scroll events. + */ + disconnect() { + ScrollObserver[$instances].delete(this); + if (ScrollObserver[$instances].size === 0) { + ScrollObserver[$deactivateListener](); + } + } + [$notify]() { + this[$scrollCallback](); + } + ; +} +ScrollObserver[_a$5] = new Set(); +const $computeStyleCallback = Symbol('computeStyleCallback'); +const $astWalker = Symbol('astWalker'); +const $dependencies = Symbol('dependencies'); +const $onScroll = Symbol('onScroll'); +/** + * The StyleEffector is configured with a callback that will be invoked at the + * optimal time that some array of CSS expression ASTs ought to be evaluated. + * + * For example, our CSS-like expression syntax supports usage of the env() + * function to incorporate the current top-level scroll position into a CSS + * expression: env(window-scroll-y). + * + * This "environment variable" will change dynamically as the user scrolls the + * page. If an AST contains such a usage of env(), we would have to evaluate the + * AST on every frame in order to be sure that the computed style stays up to + * date. + * + * The StyleEffector spares us from evaluating the expressions on every frame by + * correlating specific parts of an AST with observers of the external effects + * that they refer to (if any). So, if the AST contains env(window-scroll-y), + * the StyleEffector manages the lifetime of a global scroll event listener and + * notifies the user at the optimal time to evaluate the computed style. + */ +class StyleEffector { + constructor(callback) { + this[_b$5] = {}; + this[_c$3] = new ASTWalker(['function']); + this[_d$2] = () => { + this[$computeStyleCallback]({ relatedState: 'window-scroll' }); + }; + this[$computeStyleCallback] = callback; + } + /** + * Sets the expressions that govern when the StyleEffector callback will be + * invoked. + */ + observeEffectsFor(ast) { + const newDependencies = {}; + const oldDependencies = this[$dependencies]; + this[$astWalker].walk(ast, functionNode => { + const { name } = functionNode; + const firstArgument = functionNode.arguments[0]; + const firstTerm = firstArgument.terms[0]; + if (name.value !== 'env' || firstTerm == null || + firstTerm.type !== 'ident') { + return; + } + switch (firstTerm.value) { + case 'window-scroll-y': + if (newDependencies['window-scroll'] == null) { + const observer = 'window-scroll' in oldDependencies ? + oldDependencies['window-scroll'] : + new ScrollObserver(this[$onScroll]); + observer.observe(); + delete oldDependencies['window-scroll']; + newDependencies['window-scroll'] = observer; + } + break; + } + }); + for (const environmentState in oldDependencies) { + const observer = oldDependencies[environmentState]; + observer.disconnect(); + } + this[$dependencies] = newDependencies; + } + /** + * Disposes of the StyleEffector by disconnecting all observers of external + * effects. + */ + dispose() { + for (const environmentState in this[$dependencies]) { + const observer = this[$dependencies][environmentState]; + observer.disconnect(); + } + } +} +_b$5 = $dependencies, _c$3 = $astWalker, _d$2 = $onScroll; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * The @style decorator is responsible for coordinating the conversion of a + * CSS-like string property value into numbers that can be applied to + * lower-level constructs. It also can optionally manage the lifecycle of a + * StyleEffector which allows automatic updates for styles that use env() or + * var() functions. + * + * The decorator is configured with Intrinsics and the property key for a + * method that handles updates. The named update handler is invoked with the + * result of parsing and evaluating the raw property string value. The format of + * the evaluated result is derived from the basis of the configured Intrinsics, + * and is always an array of numbers of fixed length. + * + * NOTE: This decorator depends on the property updating mechanism defined by + * UpdatingElement as exported by the lit-element module. That means it *must* + * be used in conjunction with the @property decorator, or equivalent + * JavaScript. + * + * Supported configurations are: + * + * - `intrinsics`: An Intrinsics struct that describes how to interpret a + * serialized style attribute. For more detail on intrinsics see + * ./styles/evaluators.ts + * - `updateHandler`: A string or Symbol that is the key of a method to be + * invoked with the result of parsing and evaluating a serialized style string. + * - `observeEffects`: Optional, if set to true then styles that use env() will + * cause their update handlers to be invoked every time the corresponding + * environment variable changes (even if the style attribute itself remains + * static). + */ +const style = (config) => { + const observeEffects = config.observeEffects || false; + const getIntrinsics = config.intrinsics instanceof Function ? + config.intrinsics : + (() => config.intrinsics); + return (proto, propertyName) => { + const originalUpdated = proto.updated; + const originalConnectedCallback = proto.connectedCallback; + const originalDisconnectedCallback = proto.disconnectedCallback; + const $styleEffector = Symbol(`${propertyName}StyleEffector`); + const $styleEvaluator = Symbol(`${propertyName}StyleEvaluator`); + const $updateEvaluator = Symbol(`${propertyName}UpdateEvaluator`); + const $evaluateAndSync = Symbol(`${propertyName}EvaluateAndSync`); + Object.defineProperties(proto, { + [$styleEffector]: { value: null, writable: true }, + [$styleEvaluator]: { value: null, writable: true }, + [$updateEvaluator]: { + value: function () { + const ast = parseExpressions(this[propertyName]); + this[$styleEvaluator] = + new StyleEvaluator(ast, getIntrinsics(this)); + if (this[$styleEffector] == null && observeEffects) { + this[$styleEffector] = + new StyleEffector(() => this[$evaluateAndSync]()); + } + if (this[$styleEffector] != null) { + this[$styleEffector].observeEffectsFor(ast); + } + } + }, + [$evaluateAndSync]: { + value: function () { + if (this[$styleEvaluator] == null) { + return; + } + const result = this[$styleEvaluator].evaluate(); + // @see https://github.com/microsoft/TypeScript/pull/30769 + // @see https://github.com/Microsoft/TypeScript/issues/1863 + this[config.updateHandler](result); + } + }, + updated: { + value: function (changedProperties) { + // Always invoke updates to styles first. This gives a class that + // uses this decorator the opportunity to override the effect, or + // respond to it, in its own implementation of `updated`. + if (changedProperties.has(propertyName)) { + this[$updateEvaluator](); + this[$evaluateAndSync](); + } + originalUpdated.call(this, changedProperties); + } + }, + connectedCallback: { + value: function () { + originalConnectedCallback.call(this); + this.requestUpdate(propertyName, this[propertyName]); + } + }, + disconnectedCallback: { + value: function () { + originalDisconnectedCallback.call(this); + if (this[$styleEffector] != null) { + this[$styleEffector].dispose(); + this[$styleEffector] = null; + } + } + } + }); + }; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Adapted from https://gist.github.com/gre/1650294 +const easeInOutQuad = (t) => t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t; +/** + * Creates a TimingFunction that uses a given ease to interpolate between + * two configured number values. + */ +const interpolate = (start, end, ease = easeInOutQuad) => (time) => start + (end - start) * ease(time); +/** + * Creates a TimingFunction that interpolates through a weighted list + * of other TimingFunctions ("tracks"). Tracks are interpolated in order, and + * allocated a percentage of the total time based on their relative weight. + */ +const sequence = (tracks, weights) => { + const cumulativeSum = ((sum) => (value) => sum += value); + const times = weights.map(cumulativeSum(0)); + return (time) => { + time = clamp(time, 0, 1); + time *= times[times.length - 1]; + const i = times.findIndex((val) => val >= time); + const start = i < 1 ? 0 : times[i - 1]; + const end = times[i]; + return tracks[i]((time - start) / (end - start)); + }; +}; +/** + * Creates a "timeline" TimingFunction out of an initial value and a series of + * Keyframes. The timeline function accepts value from 0-1 and returns the + * current value based on keyframe interpolation across the total number of + * frames. Frames are only used to indicate the relative length of each keyframe + * transition, so interpolated values will be computed for fractional frames. + */ +const timeline = (path) => { + const tracks = []; + const weights = []; + let lastValue = path.initialValue; + for (let i = 0; i < path.keyframes.length; ++i) { + const keyframe = path.keyframes[i]; + const { value, frames } = keyframe; + const ease = keyframe.ease || easeInOutQuad; + const track = interpolate(lastValue, value, ease); + tracks.push(track); + weights.push(frames); + lastValue = value; + } + return sequence(tracks, weights); +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$6 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +// NOTE(cdata): The following "animation" timing functions are deliberately +// being used in favor of CSS animations. In Safari 12.1 and 13, CSS animations +// would cause the interaction prompt to glitch unexpectedly +// @see https://github.com/google/model-viewer/issues/839 +const PROMPT_ANIMATION_TIME = 5000; +// For timing purposes, a "frame" is a timing agnostic relative unit of time +// and a "value" is a target value for the Frame. +const wiggle = timeline({ + initialValue: 0, + keyframes: [ + { frames: 5, value: -1 }, + { frames: 1, value: -1 }, + { frames: 8, value: 1 }, + { frames: 1, value: 1 }, + { frames: 5, value: 0 }, + { frames: 18, value: 0 } + ] +}); +const fade = timeline({ + initialValue: 0, + keyframes: [ + { frames: 1, value: 1 }, + { frames: 5, value: 1 }, + { frames: 1, value: 0 }, + { frames: 6, value: 0 } + ] +}); +const DEFAULT_FOV_DEG = 30; +const DEFAULT_MIN_FOV_DEG = 12; +const DEFAULT_CAMERA_ORBIT = '0deg 75deg 105%'; +const DEFAULT_CAMERA_TARGET = 'auto auto auto'; +const DEFAULT_FIELD_OF_VIEW = 'auto'; +const MINIMUM_RADIUS_RATIO = 2.2; +const AZIMUTHAL_QUADRANT_LABELS = ['front', 'right', 'back', 'left']; +const POLAR_TRIENT_LABELS = ['upper-', '', 'lower-']; +const DEFAULT_INTERACTION_PROMPT_THRESHOLD = 3000; +const INTERACTION_PROMPT = '. Use mouse, touch or arrow keys to move.'; +const InteractionPromptStrategy = { + AUTO: 'auto'}; +const InteractionPromptStyle = { + BASIC: 'basic', + WIGGLE: 'wiggle' +}; +const TouchAction = { + NONE: 'none' +}; +const fieldOfViewIntrinsics = () => { + return { + basis: [degreesToRadians(numberNode(DEFAULT_FOV_DEG, 'deg'))], + keywords: { auto: [null] } + }; +}; +const minFieldOfViewIntrinsics = () => { + return { + basis: [degreesToRadians(numberNode(DEFAULT_MIN_FOV_DEG, 'deg'))], + keywords: { auto: [null] } + }; +}; +const cameraOrbitIntrinsics = (() => { + const defaultTerms = parseExpressions(DEFAULT_CAMERA_ORBIT)[0] + .terms; + const theta = normalizeUnit(defaultTerms[0]); + const phi = normalizeUnit(defaultTerms[1]); + return (element) => { + const radius = element[$scene].idealCameraDistance(); + return { + basis: [theta, phi, numberNode(radius, 'm')], + keywords: { auto: [null, null, numberNode(105, '%')] } + }; + }; +})(); +const minCameraOrbitIntrinsics = (element) => { + const radius = MINIMUM_RADIUS_RATIO * element[$scene].boundingSphere.radius; + return { + basis: [ + numberNode(-Infinity, 'rad'), + numberNode(0, 'rad'), + numberNode(radius, 'm') + ], + keywords: { auto: [null, null, null] } + }; +}; +const maxCameraOrbitIntrinsics = (element) => { + const orbitIntrinsics = cameraOrbitIntrinsics(element); + const evaluator = new StyleEvaluator([], orbitIntrinsics); + const defaultRadius = evaluator.evaluate()[2]; + return { + basis: [ + numberNode(Infinity, 'rad'), + numberNode(Math.PI, 'rad'), + numberNode(defaultRadius, 'm') + ], + keywords: { auto: [null, null, null] } + }; +}; +const cameraTargetIntrinsics = (element) => { + const center = element[$scene].boundingBox.getCenter(new Vector3()); + return { + basis: [ + numberNode(center.x, 'm'), + numberNode(center.y, 'm'), + numberNode(center.z, 'm') + ], + keywords: { auto: [null, null, null] } + }; +}; +const HALF_PI = Math.PI / 2.0; +const THIRD_PI = Math.PI / 3.0; +const QUARTER_PI = HALF_PI / 2.0; +const TAU = 2.0 * Math.PI; +const $controls = Symbol('controls'); +const $panElement = Symbol('panElement'); +const $promptElement = Symbol('promptElement'); +const $promptAnimatedContainer = Symbol('promptAnimatedContainer'); +const $fingerAnimatedContainers = Symbol('fingerAnimatedContainers'); +const $deferInteractionPrompt = Symbol('deferInteractionPrompt'); +const $updateAria = Symbol('updateAria'); +const $a11y = Symbol('a11y'); +const $updateA11y = Symbol('updateA11y'); +const $updateCameraForRadius = Symbol('updateCameraForRadius'); +const $cancelPrompts = Symbol('cancelPrompts'); +const $onChange = Symbol('onChange'); +const $onPointerChange = Symbol('onPointerChange'); +const $waitingToPromptUser = Symbol('waitingToPromptUser'); +const $userHasInteracted = Symbol('userHasInteracted'); +const $promptElementVisibleTime = Symbol('promptElementVisibleTime'); +const $lastPromptOffset = Symbol('lastPromptOffset'); +const $cancellationSource = Symbol('cancellationSource'); +const $lastSpherical = Symbol('lastSpherical'); +const $jumpCamera = Symbol('jumpCamera'); +const $initialized = Symbol('initialized'); +const $maintainThetaPhi = Symbol('maintainThetaPhi'); +const $syncCameraOrbit = Symbol('syncCameraOrbit'); +const $syncFieldOfView = Symbol('syncFieldOfView'); +const $syncCameraTarget = Symbol('syncCameraTarget'); +const $syncMinCameraOrbit = Symbol('syncMinCameraOrbit'); +const $syncMaxCameraOrbit = Symbol('syncMaxCameraOrbit'); +const $syncMinFieldOfView = Symbol('syncMinFieldOfView'); +const $syncMaxFieldOfView = Symbol('syncMaxFieldOfView'); +const ControlsMixin = (ModelViewerElement) => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t; + class ControlsModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this.cameraControls = false; + this.cameraOrbit = DEFAULT_CAMERA_ORBIT; + this.cameraTarget = DEFAULT_CAMERA_TARGET; + this.fieldOfView = DEFAULT_FIELD_OF_VIEW; + this.minCameraOrbit = 'auto'; + this.maxCameraOrbit = 'auto'; + this.minFieldOfView = 'auto'; + this.maxFieldOfView = 'auto'; + this.interactionPromptThreshold = DEFAULT_INTERACTION_PROMPT_THRESHOLD; + this.interactionPrompt = InteractionPromptStrategy.AUTO; + this.interactionPromptStyle = InteractionPromptStyle.WIGGLE; + this.orbitSensitivity = 1; + this.zoomSensitivity = 1; + this.panSensitivity = 1; + this.touchAction = TouchAction.NONE; + this.disableZoom = false; + this.disablePan = false; + this.disableTap = false; + this.interpolationDecay = DECAY_MILLISECONDS; + this.a11y = null; + this[_a] = this.shadowRoot.querySelector('.interaction-prompt'); + this[_b] = this.shadowRoot.querySelector('#prompt'); + this[_c] = [ + this.shadowRoot.querySelector('#finger0'), + this.shadowRoot.querySelector('#finger1') + ]; + this[_d] = this.shadowRoot.querySelector('.pan-target'); + this[_e] = 0; + this[_f] = Infinity; + this[_g] = false; + this[_h] = false; + this[_j] = ChangeSource.AUTOMATIC; + this[_k] = new SmoothControls(this[$scene].camera, this[$userInputElement], this[$scene]); + this[_l] = new Spherical(); + this[_m] = false; + this[_o] = false; + this[_p] = false; + this[_q] = {}; + this[_r] = () => { + const source = this[$controls].changeSource; + this[$cancellationSource] = source; + if (source === ChangeSource.USER_INTERACTION) { + this[$userHasInteracted] = true; + this[$deferInteractionPrompt](); + } + }; + this[_s] = () => { + this[$updateAria](); + this[$needsRender](); + const source = this[$controls].changeSource; + this.dispatchEvent(new CustomEvent('camera-change', { detail: { source } })); + }; + this[_t] = (event) => { + this[$container].classList.toggle('pointer-tumbling', event.type === 'pointer-change-start'); + }; + } + get inputSensitivity() { + return this[$controls].inputSensitivity; + } + set inputSensitivity(value) { + this[$controls].inputSensitivity = value; + } + getCameraOrbit() { + const { theta, phi, radius } = this[$lastSpherical]; + return { + theta, + phi, + radius, + toString() { + return `${this.theta}rad ${this.phi}rad ${this.radius}m`; + } + }; + } + getCameraTarget() { + return toVector3D(this[$renderer].isPresenting ? this[$renderer].arRenderer.target : + this[$scene].getDynamicTarget()); + } + getFieldOfView() { + return this[$controls].getFieldOfView(); + } + // Provided so user code does not have to parse these from attributes. + getMinimumFieldOfView() { + return this[$controls].options.minimumFieldOfView; + } + getMaximumFieldOfView() { + return this[$controls].options.maximumFieldOfView; + } + getIdealAspect() { + return this[$scene].idealAspect; + } + jumpCameraToGoal() { + this[$jumpCamera] = true; + this.requestUpdate($jumpCamera, false); + } + resetInteractionPrompt() { + this[$lastPromptOffset] = 0; + this[$promptElementVisibleTime] = Infinity; + this[$userHasInteracted] = false; + this[$waitingToPromptUser] = + this.interactionPrompt === InteractionPromptStrategy.AUTO && + this.cameraControls; + } + zoom(keyPresses) { + const event = new WheelEvent('wheel', { deltaY: -30 * keyPresses }); + this[$userInputElement].dispatchEvent(event); + } + connectedCallback() { + super.connectedCallback(); + this[$controls].addEventListener('user-interaction', this[$cancelPrompts]); + this[$controls].addEventListener('pointer-change-start', this[$onPointerChange]); + this[$controls].addEventListener('pointer-change-end', this[$onPointerChange]); + } + disconnectedCallback() { + super.disconnectedCallback(); + this[$controls].removeEventListener('user-interaction', this[$cancelPrompts]); + this[$controls].removeEventListener('pointer-change-start', this[$onPointerChange]); + this[$controls].removeEventListener('pointer-change-end', this[$onPointerChange]); + } + updated(changedProperties) { + super.updated(changedProperties); + const controls = this[$controls]; + const scene = this[$scene]; + if (changedProperties.has('cameraControls')) { + if (this.cameraControls) { + controls.enableInteraction(); + if (this.interactionPrompt === InteractionPromptStrategy.AUTO) { + this[$waitingToPromptUser] = true; + } + } + else { + controls.disableInteraction(); + this[$deferInteractionPrompt](); + } + this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]); + } + if (changedProperties.has('disableZoom')) { + controls.disableZoom = this.disableZoom; + } + if (changedProperties.has('disablePan')) { + controls.enablePan = !this.disablePan; + } + if (changedProperties.has('disableTap')) { + controls.enableTap = !this.disableTap; + } + if (changedProperties.has('interactionPrompt') || + changedProperties.has('cameraControls') || + changedProperties.has('src')) { + if (this.interactionPrompt === InteractionPromptStrategy.AUTO && + this.cameraControls && !this[$userHasInteracted]) { + this[$waitingToPromptUser] = true; + } + else { + this[$deferInteractionPrompt](); + } + } + if (changedProperties.has('interactionPromptStyle')) { + this[$promptAnimatedContainer].style.opacity = + this.interactionPromptStyle == InteractionPromptStyle.BASIC ? '1' : + '0'; + } + if (changedProperties.has('touchAction')) { + const touchAction = this.touchAction; + controls.applyOptions({ touchAction }); + controls.updateTouchActionStyle(); + } + if (changedProperties.has('orbitSensitivity')) { + controls.orbitSensitivity = this.orbitSensitivity; + } + if (changedProperties.has('zoomSensitivity')) { + controls.zoomSensitivity = this.zoomSensitivity; + } + if (changedProperties.has('panSensitivity')) { + controls.panSensitivity = this.panSensitivity; + } + if (changedProperties.has('interpolationDecay')) { + controls.setDamperDecayTime(this.interpolationDecay); + scene.setTargetDamperDecayTime(this.interpolationDecay); + } + if (changedProperties.has('a11y')) { + this[$updateA11y](); + } + if (this[$jumpCamera] === true) { + Promise.resolve().then(() => { + controls.jumpToGoal(); + scene.jumpToGoal(); + this[$onChange](); + this[$jumpCamera] = false; + }); + } + } + async updateFraming() { + const scene = this[$scene]; + const oldFramedFoV = scene.adjustedFoV(scene.framedFoVDeg); + await scene.updateFraming(); + const newFramedFoV = scene.adjustedFoV(scene.framedFoVDeg); + const zoom = this[$controls].getFieldOfView() / oldFramedFoV; + this[$controls].setFieldOfView(newFramedFoV * zoom); + this[$maintainThetaPhi] = true; + this.requestUpdate('maxFieldOfView'); + this.requestUpdate('fieldOfView'); + this.requestUpdate('minCameraOrbit'); + this.requestUpdate('maxCameraOrbit'); + this.requestUpdate('cameraOrbit'); + await this.updateComplete; + } + interact(duration, finger0, finger1) { + const inputElement = this[$userInputElement]; + const fingerElements = this[$fingerAnimatedContainers]; + if (fingerElements[0].style.opacity === '1') { + console.warn('interact() failed because an existing interaction is running.'); + return; + } + const xy = new Array(); + xy.push({ x: timeline(finger0.x), y: timeline(finger0.y) }); + const positions = [{ x: xy[0].x(0), y: xy[0].y(0) }]; + if (finger1 != null) { + xy.push({ x: timeline(finger1.x), y: timeline(finger1.y) }); + positions.push({ x: xy[1].x(0), y: xy[1].y(0) }); + } + let startTime = performance.now(); + const { width, height } = this[$scene]; + const rect = this.getBoundingClientRect(); + const dispatchTouches = (type) => { + for (const [i, position] of positions.entries()) { + const { style } = fingerElements[i]; + style.transform = `translateX(${width * position.x}px) translateY(${height * position.y}px)`; + if (type === 'pointerdown') { + style.opacity = '1'; + } + else if (type === 'pointerup') { + style.opacity = '0'; + } + const init = { + pointerId: i - 5678, // help ensure uniqueness + pointerType: 'touch', + target: inputElement, + clientX: width * position.x + rect.x, + clientY: height * position.y + rect.y, + altKey: true // flag that this is not a user interaction + }; + inputElement.dispatchEvent(new PointerEvent(type, init)); + } + }; + const moveTouches = () => { + // Cancel interaction if something else moves the camera or input is + // removed from the DOM. + const changeSource = this[$cancellationSource]; + if (changeSource !== ChangeSource.AUTOMATIC || + !inputElement.isConnected) { + for (const fingerElement of this[$fingerAnimatedContainers]) { + fingerElement.style.opacity = '0'; + } + dispatchTouches('pointercancel'); + this.dispatchEvent(new CustomEvent('interact-stopped', { detail: { source: changeSource } })); + document.removeEventListener('visibilitychange', onVisibilityChange); + return; + } + const time = Math.min(1, (performance.now() - startTime) / duration); + for (const [i, position] of positions.entries()) { + position.x = xy[i].x(time); + position.y = xy[i].y(time); + } + dispatchTouches('pointermove'); + if (time < 1) { + requestAnimationFrame(moveTouches); + } + else { + dispatchTouches('pointerup'); + this.dispatchEvent(new CustomEvent('interact-stopped', { detail: { source: ChangeSource.AUTOMATIC } })); + document.removeEventListener('visibilitychange', onVisibilityChange); + } + }; + const onVisibilityChange = () => { + let elapsed = 0; + if (document.visibilityState === 'hidden') { + elapsed = performance.now() - startTime; + } + else { + startTime = performance.now() - elapsed; + } + }; + document.addEventListener('visibilitychange', onVisibilityChange); + dispatchTouches('pointerdown'); + this[$cancellationSource] = ChangeSource.AUTOMATIC; + requestAnimationFrame(moveTouches); + } + [(_a = $promptElement, _b = $promptAnimatedContainer, _c = $fingerAnimatedContainers, _d = $panElement, _e = $lastPromptOffset, _f = $promptElementVisibleTime, _g = $userHasInteracted, _h = $waitingToPromptUser, _j = $cancellationSource, _k = $controls, _l = $lastSpherical, _m = $jumpCamera, _o = $initialized, _p = $maintainThetaPhi, _q = $a11y, $syncFieldOfView)](style) { + const controls = this[$controls]; + const scene = this[$scene]; + scene.framedFoVDeg = style[0] * 180 / Math.PI; + controls.changeSource = ChangeSource.NONE; + controls.setFieldOfView(scene.adjustedFoV(scene.framedFoVDeg)); + this[$cancelPrompts](); + } + [$syncCameraOrbit](style) { + const controls = this[$controls]; + if (this[$maintainThetaPhi]) { + const { theta, phi } = this.getCameraOrbit(); + style[0] = theta; + style[1] = phi; + this[$maintainThetaPhi] = false; + } + controls.changeSource = ChangeSource.NONE; + controls.setOrbit(style[0], style[1], style[2]); + this[$cancelPrompts](); + } + [$syncMinCameraOrbit](style) { + this[$controls].applyOptions({ + minimumAzimuthalAngle: style[0], + minimumPolarAngle: style[1], + minimumRadius: style[2] + }); + this.jumpCameraToGoal(); + } + [$syncMaxCameraOrbit](style) { + this[$controls].applyOptions({ + maximumAzimuthalAngle: style[0], + maximumPolarAngle: style[1], + maximumRadius: style[2] + }); + this[$updateCameraForRadius](style[2]); + this.jumpCameraToGoal(); + } + [$syncMinFieldOfView](style) { + this[$controls].applyOptions({ minimumFieldOfView: style[0] * 180 / Math.PI }); + this.jumpCameraToGoal(); + } + [$syncMaxFieldOfView](style) { + const fov = this[$scene].adjustedFoV(style[0] * 180 / Math.PI); + this[$controls].applyOptions({ maximumFieldOfView: fov }); + this.jumpCameraToGoal(); + } + [$syncCameraTarget](style) { + const [x, y, z] = style; + if (!this[$renderer].arRenderer.isPresenting) { + this[$scene].setTarget(x, y, z); + } + this[$controls].changeSource = ChangeSource.NONE; + this[$renderer].arRenderer.updateTarget(); + this[$cancelPrompts](); + } + [$tick](time, delta) { + super[$tick](time, delta); + if (this[$renderer].isPresenting || !this[$getModelIsVisible]()) { + return; + } + const controls = this[$controls]; + const scene = this[$scene]; + const now = performance.now(); + if (this[$waitingToPromptUser]) { + if (this.loaded && + now > this[$loadedTime] + this.interactionPromptThreshold) { + this[$waitingToPromptUser] = false; + this[$promptElementVisibleTime] = now; + this[$promptElement].classList.add('visible'); + } + } + if (isFinite(this[$promptElementVisibleTime]) && + this.interactionPromptStyle === InteractionPromptStyle.WIGGLE) { + const animationTime = ((now - this[$promptElementVisibleTime]) / PROMPT_ANIMATION_TIME) % + 1; + const offset = wiggle(animationTime); + const opacity = fade(animationTime); + this[$promptAnimatedContainer].style.opacity = `${opacity}`; + if (offset !== this[$lastPromptOffset]) { + const xOffset = offset * scene.width * 0.05; + const deltaTheta = (offset - this[$lastPromptOffset]) * Math.PI / 16; + this[$promptAnimatedContainer].style.transform = + `translateX(${xOffset}px)`; + controls.changeSource = ChangeSource.AUTOMATIC; + controls.adjustOrbit(deltaTheta, 0, 0); + this[$lastPromptOffset] = offset; + } + } + const cameraMoved = controls.update(time, delta); + const targetMoved = scene.updateTarget(delta); + if (cameraMoved || targetMoved) { + this[$onChange](); + } + } + [$deferInteractionPrompt]() { + // Effectively cancel the timer waiting for user interaction: + this[$waitingToPromptUser] = false; + this[$promptElement].classList.remove('visible'); + this[$promptElementVisibleTime] = Infinity; + } + /** + * Updates the camera's near and far planes to enclose the scene when + * orbiting at the supplied radius. + */ + [$updateCameraForRadius](radius) { + const maximumRadius = Math.max(this[$scene].farRadius(), radius); + const near = 0; + const far = Math.abs(2 * maximumRadius); + this[$controls].updateNearFar(near, far); + } + [$updateAria]() { + const { theta, phi } = this[$controls].getCameraSpherical(this[$lastSpherical]); + const azimuthalQuadrant = (4 + Math.floor(((theta % TAU) + QUARTER_PI) / HALF_PI)) % 4; + const polarTrient = Math.floor(phi / THIRD_PI); + const azimuthalQuadrantLabel = AZIMUTHAL_QUADRANT_LABELS[azimuthalQuadrant]; + const polarTrientLabel = POLAR_TRIENT_LABELS[polarTrient]; + const position = `${polarTrientLabel}${azimuthalQuadrantLabel}`; + const key = position; + if (key in this[$a11y]) { + this[$updateStatus](this[$a11y][key]); + } + else { + this[$updateStatus](`View from stage ${position}`); + } + } + get [$ariaLabel]() { + let interactionPrompt = INTERACTION_PROMPT; + if ('interaction-prompt' in this[$a11y]) { + interactionPrompt = `. ${this[$a11y]['interaction-prompt']}`; + } + return super[$ariaLabel].replace(/\.$/, '') + + (this.cameraControls ? interactionPrompt : ''); + } + async [$onResize](event) { + const controls = this[$controls]; + const scene = this[$scene]; + const oldFramedFoV = scene.adjustedFoV(scene.framedFoVDeg); + // The super of $onResize may update the scene's adjustedFoV, so we + // compare the before and after to calculate the proper zoom. + super[$onResize](event); + const fovRatio = scene.adjustedFoV(scene.framedFoVDeg) / oldFramedFoV; + const fov = controls.getFieldOfView() * (isFinite(fovRatio) ? fovRatio : 1); + controls.updateAspect(this[$scene].aspect); + this.requestUpdate('maxFieldOfView', this.maxFieldOfView); + await this.updateComplete; + this[$controls].setFieldOfView(fov); + this.jumpCameraToGoal(); + } + [$onModelLoad]() { + super[$onModelLoad](); + if (this[$initialized]) { + this[$maintainThetaPhi] = true; + } + else { + this[$initialized] = true; + } + this.requestUpdate('maxFieldOfView', this.maxFieldOfView); + this.requestUpdate('fieldOfView', this.fieldOfView); + this.requestUpdate('minCameraOrbit', this.minCameraOrbit); + this.requestUpdate('maxCameraOrbit', this.maxCameraOrbit); + this.requestUpdate('cameraOrbit', this.cameraOrbit); + this.requestUpdate('cameraTarget', this.cameraTarget); + this.jumpCameraToGoal(); + } + [(_r = $cancelPrompts, _s = $onChange, _t = $onPointerChange, $updateA11y)]() { + if (typeof this.a11y === 'string') { + if (this.a11y.startsWith('{')) { + try { + this[$a11y] = JSON.parse(this.a11y); + } + catch (error) { + console.warn('Error parsing a11y JSON:', error); + } + } + else if (this.a11y.length > 0) { + console.warn('Error not supported format, should be a JSON string:', this.a11y); + } + else { + this[$a11y] = {}; + } + } + else if (typeof this.a11y === 'object' && this.a11y != null) { + this[$a11y] = Object.assign({}, this.a11y); + } + else { + this[$a11y] = {}; + } + this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]); + } + } + __decorate$6([ + property({ type: Boolean, attribute: 'camera-controls' }) + ], ControlsModelViewerElement.prototype, "cameraControls", void 0); + __decorate$6([ + style({ + intrinsics: cameraOrbitIntrinsics, + observeEffects: true, + updateHandler: $syncCameraOrbit + }), + property({ type: String, attribute: 'camera-orbit', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "cameraOrbit", void 0); + __decorate$6([ + style({ + intrinsics: cameraTargetIntrinsics, + observeEffects: true, + updateHandler: $syncCameraTarget + }), + property({ type: String, attribute: 'camera-target', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "cameraTarget", void 0); + __decorate$6([ + style({ + intrinsics: fieldOfViewIntrinsics, + observeEffects: true, + updateHandler: $syncFieldOfView + }), + property({ type: String, attribute: 'field-of-view', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "fieldOfView", void 0); + __decorate$6([ + style({ + intrinsics: minCameraOrbitIntrinsics, + updateHandler: $syncMinCameraOrbit + }), + property({ type: String, attribute: 'min-camera-orbit', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "minCameraOrbit", void 0); + __decorate$6([ + style({ + intrinsics: maxCameraOrbitIntrinsics, + updateHandler: $syncMaxCameraOrbit + }), + property({ type: String, attribute: 'max-camera-orbit', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "maxCameraOrbit", void 0); + __decorate$6([ + style({ + intrinsics: minFieldOfViewIntrinsics, + updateHandler: $syncMinFieldOfView + }), + property({ type: String, attribute: 'min-field-of-view', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "minFieldOfView", void 0); + __decorate$6([ + style({ intrinsics: fieldOfViewIntrinsics, updateHandler: $syncMaxFieldOfView }), + property({ type: String, attribute: 'max-field-of-view', hasChanged: () => true }) + ], ControlsModelViewerElement.prototype, "maxFieldOfView", void 0); + __decorate$6([ + property({ type: Number, attribute: 'interaction-prompt-threshold' }) + ], ControlsModelViewerElement.prototype, "interactionPromptThreshold", void 0); + __decorate$6([ + property({ type: String, attribute: 'interaction-prompt' }) + ], ControlsModelViewerElement.prototype, "interactionPrompt", void 0); + __decorate$6([ + property({ type: String, attribute: 'interaction-prompt-style' }) + ], ControlsModelViewerElement.prototype, "interactionPromptStyle", void 0); + __decorate$6([ + property({ type: Number, attribute: 'orbit-sensitivity' }) + ], ControlsModelViewerElement.prototype, "orbitSensitivity", void 0); + __decorate$6([ + property({ type: Number, attribute: 'zoom-sensitivity' }) + ], ControlsModelViewerElement.prototype, "zoomSensitivity", void 0); + __decorate$6([ + property({ type: Number, attribute: 'pan-sensitivity' }) + ], ControlsModelViewerElement.prototype, "panSensitivity", void 0); + __decorate$6([ + property({ type: String, attribute: 'touch-action' }) + ], ControlsModelViewerElement.prototype, "touchAction", void 0); + __decorate$6([ + property({ type: Boolean, attribute: 'disable-zoom' }) + ], ControlsModelViewerElement.prototype, "disableZoom", void 0); + __decorate$6([ + property({ type: Boolean, attribute: 'disable-pan' }) + ], ControlsModelViewerElement.prototype, "disablePan", void 0); + __decorate$6([ + property({ type: Boolean, attribute: 'disable-tap' }) + ], ControlsModelViewerElement.prototype, "disableTap", void 0); + __decorate$6([ + property({ type: Number, attribute: 'interpolation-decay' }) + ], ControlsModelViewerElement.prototype, "interpolationDecay", void 0); + __decorate$6([ + property() + ], ControlsModelViewerElement.prototype, "a11y", void 0); + return ControlsModelViewerElement; +}; + +/* @license + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const PAN_SENSITIVITY = 0.018; +const TAP_DISTANCE = 2; +const TAP_MS = 300; +const vector2 = new Vector2(); +const vector3$2 = new Vector3(); +const DEFAULT_OPTIONS = Object.freeze({ + minimumRadius: 0, + maximumRadius: Infinity, + minimumPolarAngle: 0, + maximumPolarAngle: Math.PI, + minimumAzimuthalAngle: -Infinity, + maximumAzimuthalAngle: Infinity, + minimumFieldOfView: 10, + maximumFieldOfView: 45, + touchAction: 'none' +}); +// Constants +const KEYBOARD_ORBIT_INCREMENT = Math.PI / 8; +const ZOOM_SENSITIVITY = 0.04; +// The move size on pan key event +const PAN_KEY_INCREMENT = 10; +const ChangeSource = { + USER_INTERACTION: 'user-interaction', + NONE: 'none', + AUTOMATIC: 'automatic' +}; +/** + * SmoothControls is a Three.js helper for adding delightful pointer and + * keyboard-based input to a staged Three.js scene. Its API is very similar to + * OrbitControls, but it offers more opinionated (subjectively more delightful) + * defaults, easy extensibility and subjectively better out-of-the-box keyboard + * support. + * + * One important change compared to OrbitControls is that the `update` method + * of SmoothControls must be invoked on every frame, otherwise the controls + * will not have an effect. + * + * Another notable difference compared to OrbitControls is that SmoothControls + * does not currently support panning (but probably will in a future revision). + * + * Like OrbitControls, SmoothControls assumes that the orientation of the camera + * has been set in terms of position, rotation and scale, so it is important to + * ensure that the camera's matrixWorld is in sync before using SmoothControls. + */ +class SmoothControls extends EventDispatcher { + constructor(camera, element, scene) { + super(); + this.camera = camera; + this.element = element; + this.scene = scene; + this.orbitSensitivity = 1; + this.zoomSensitivity = 1; + this.panSensitivity = 1; + this.inputSensitivity = 1; + this.changeSource = ChangeSource.NONE; + this._interactionEnabled = false; + this._disableZoom = false; + this.isUserPointing = false; + // Pan state + this.enablePan = true; + this.enableTap = true; + this.panProjection = new Matrix3(); + this.panPerPixel = 0; + // Internal orbital position state + this.spherical = new Spherical(); + this.goalSpherical = new Spherical(); + this.thetaDamper = new Damper(); + this.phiDamper = new Damper(); + this.radiusDamper = new Damper(); + this.logFov = Math.log(DEFAULT_OPTIONS.maximumFieldOfView); + this.goalLogFov = this.logFov; + this.fovDamper = new Damper(); + // Pointer state + this.touchMode = null; + this.pointers = []; + this.startTime = 0; + this.startPointerPosition = { clientX: 0, clientY: 0 }; + this.lastSeparation = 0; + this.touchDecided = false; + this.onContext = (event) => { + if (this.enablePan) { + event.preventDefault(); + } + else { + for (const pointer of this.pointers) { + // Required because of a common browser bug where the context menu never + // fires a pointercancel event. + this.onPointerUp(new PointerEvent('pointercancel', Object.assign(Object.assign({}, this.startPointerPosition), { pointerId: pointer.id }))); + } + } + }; + this.touchModeZoom = (dx, dy) => { + if (!this._disableZoom) { + const touchDistance = this.twoTouchDistance(this.pointers[0], this.pointers[1]); + const deltaZoom = ZOOM_SENSITIVITY * this.zoomSensitivity * + (this.lastSeparation - touchDistance) * 50 / this.scene.height; + this.lastSeparation = touchDistance; + this.userAdjustOrbit(0, 0, deltaZoom); + } + if (this.panPerPixel > 0) { + this.movePan(dx, dy); + } + }; + // We implement our own version of the browser's CSS touch-action, enforced by + // this function, because the iOS implementation of pan-y is bad and doesn't + // match Android. Specifically, even if a touch gesture begins by panning X, + // iOS will switch to scrolling as soon as the gesture moves in the Y, rather + // than staying in the same mode until the end of the gesture. + this.disableScroll = (event) => { + event.preventDefault(); + }; + this.touchModeRotate = (dx, dy) => { + const { touchAction } = this._options; + if (!this.touchDecided && touchAction !== 'none') { + this.touchDecided = true; + const dxMag = Math.abs(dx); + const dyMag = Math.abs(dy); + // If motion is mostly vertical, assume scrolling is the intent. + if (this.changeSource === ChangeSource.USER_INTERACTION && + ((touchAction === 'pan-y' && dyMag > dxMag) || + (touchAction === 'pan-x' && dxMag > dyMag))) { + this.touchMode = null; + return; + } + else { + this.element.addEventListener('touchmove', this.disableScroll, { passive: false }); + } + } + this.handleSinglePointerMove(dx, dy); + }; + this.onPointerDown = (event) => { + if (this.pointers.length > 2) { + return; + } + const { element } = this; + if (this.pointers.length === 0) { + element.addEventListener('pointermove', this.onPointerMove); + element.addEventListener('pointerup', this.onPointerUp); + this.touchMode = null; + this.touchDecided = false; + this.startPointerPosition.clientX = event.clientX; + this.startPointerPosition.clientY = event.clientY; + this.startTime = performance.now(); + } + try { + element.setPointerCapture(event.pointerId); + } + catch (_a) { + } + this.pointers.push({ clientX: event.clientX, clientY: event.clientY, id: event.pointerId }); + this.isUserPointing = false; + if (event.pointerType === 'touch') { + this.changeSource = event.altKey ? // set by interact() in controls.ts + ChangeSource.AUTOMATIC : + ChangeSource.USER_INTERACTION; + this.onTouchChange(event); + } + else { + this.changeSource = ChangeSource.USER_INTERACTION; + this.onMouseDown(event); + } + if (this.changeSource === ChangeSource.USER_INTERACTION) { + this.dispatchEvent({ type: 'user-interaction' }); + } + }; + this.onPointerMove = (event) => { + const pointer = this.pointers.find((pointer) => pointer.id === event.pointerId); + if (pointer == null) { + return; + } + // In case no one gave us a pointerup or pointercancel event. + if (event.pointerType === 'mouse' && event.buttons === 0) { + this.onPointerUp(event); + return; + } + const numTouches = this.pointers.length; + const dx = (event.clientX - pointer.clientX) / numTouches; + const dy = (event.clientY - pointer.clientY) / numTouches; + if (dx === 0 && dy === 0) { + return; + } + pointer.clientX = event.clientX; + pointer.clientY = event.clientY; + if (event.pointerType === 'touch') { + this.changeSource = event.altKey ? // set by interact() in controls.ts + ChangeSource.AUTOMATIC : + ChangeSource.USER_INTERACTION; + if (this.touchMode !== null) { + this.touchMode(dx, dy); + } + } + else { + this.changeSource = ChangeSource.USER_INTERACTION; + if (this.panPerPixel > 0) { + this.movePan(dx, dy); + } + else { + this.handleSinglePointerMove(dx, dy); + } + } + }; + this.onPointerUp = (event) => { + const { element } = this; + const index = this.pointers.findIndex((pointer) => pointer.id === event.pointerId); + if (index !== -1) { + this.pointers.splice(index, 1); + } + // altKey indicates an interaction prompt; don't reset radius in this case + // as it will cause the camera to drift. + if (this.panPerPixel > 0 && !event.altKey) { + this.resetRadius(); + } + if (this.pointers.length === 0) { + element.removeEventListener('pointermove', this.onPointerMove); + element.removeEventListener('pointerup', this.onPointerUp); + element.removeEventListener('touchmove', this.disableScroll); + if (this.enablePan && this.enableTap) { + this.recenter(event); + } + } + else if (this.touchMode !== null) { + this.onTouchChange(event); + } + this.scene.element[$panElement].style.opacity = 0; + element.style.cursor = 'grab'; + this.panPerPixel = 0; + if (this.isUserPointing) { + this.dispatchEvent({ type: 'pointer-change-end' }); + } + }; + this.onWheel = (event) => { + this.changeSource = ChangeSource.USER_INTERACTION; + const deltaZoom = event.deltaY * + (event.deltaMode == 1 ? 18 : 1) * ZOOM_SENSITIVITY * + this.zoomSensitivity / 30; + this.userAdjustOrbit(0, 0, deltaZoom); + event.preventDefault(); + this.dispatchEvent({ type: 'user-interaction' }); + }; + this.onKeyDown = (event) => { + // We track if the key is actually one we respond to, so as not to + // accidentally clobber unrelated key inputs when the has + // focus. + const { changeSource } = this; + this.changeSource = ChangeSource.USER_INTERACTION; + const relevantKey = (event.shiftKey && this.enablePan) ? + this.panKeyCodeHandler(event) : + this.orbitZoomKeyCodeHandler(event); + if (relevantKey) { + event.preventDefault(); + this.dispatchEvent({ type: 'user-interaction' }); + } + else { + this.changeSource = changeSource; + } + }; + this._options = Object.assign({}, DEFAULT_OPTIONS); + this.setOrbit(0, Math.PI / 2, 1); + this.setFieldOfView(100); + this.jumpToGoal(); + } + get interactionEnabled() { + return this._interactionEnabled; + } + enableInteraction() { + if (this._interactionEnabled === false) { + const { element } = this; + element.addEventListener('pointerdown', this.onPointerDown); + element.addEventListener('pointercancel', this.onPointerUp); + if (!this._disableZoom) { + element.addEventListener('wheel', this.onWheel); + } + element.addEventListener('keydown', this.onKeyDown); + // This little beauty is to work around a WebKit bug that otherwise makes + // touch events randomly not cancelable. + element.addEventListener('touchmove', () => { }, { passive: false }); + element.addEventListener('contextmenu', this.onContext); + this.element.style.cursor = 'grab'; + this._interactionEnabled = true; + this.updateTouchActionStyle(); + } + } + disableInteraction() { + if (this._interactionEnabled === true) { + const { element } = this; + element.removeEventListener('pointerdown', this.onPointerDown); + element.removeEventListener('pointermove', this.onPointerMove); + element.removeEventListener('pointerup', this.onPointerUp); + element.removeEventListener('pointercancel', this.onPointerUp); + element.removeEventListener('wheel', this.onWheel); + element.removeEventListener('keydown', this.onKeyDown); + element.removeEventListener('contextmenu', this.onContext); + element.style.cursor = ''; + this.touchMode = null; + this._interactionEnabled = false; + this.updateTouchActionStyle(); + } + } + /** + * The options that are currently configured for the controls instance. + */ + get options() { + return this._options; + } + set disableZoom(disable) { + if (this._disableZoom != disable) { + this._disableZoom = disable; + if (disable === true) { + this.element.removeEventListener('wheel', this.onWheel); + } + else { + this.element.addEventListener('wheel', this.onWheel); + } + this.updateTouchActionStyle(); + } + } + /** + * Copy the spherical values that represent the current camera orbital + * position relative to the configured target into a provided Spherical + * instance. If no Spherical is provided, a new Spherical will be allocated + * to copy the values into. The Spherical that values are copied into is + * returned. + */ + getCameraSpherical(target = new Spherical()) { + return target.copy(this.spherical); + } + /** + * Returns the camera's current vertical field of view in degrees. + */ + getFieldOfView() { + return this.camera.fov; + } + /** + * Configure the _options of the controls. Configured _options will be + * merged with whatever _options have already been configured for this + * controls instance. + */ + applyOptions(_options) { + Object.assign(this._options, _options); + // Re-evaluates clamping based on potentially new values for min/max + // polar, azimuth and radius: + this.setOrbit(); + this.setFieldOfView(Math.exp(this.goalLogFov)); + } + /** + * Sets the near and far planes of the camera. + */ + updateNearFar(nearPlane, farPlane) { + this.camera.far = farPlane === 0 ? 2 : farPlane; + this.camera.near = Math.max(nearPlane, this.camera.far / 1000); + this.camera.updateProjectionMatrix(); + } + /** + * Sets the aspect ratio of the camera + */ + updateAspect(aspect) { + this.camera.aspect = aspect; + this.camera.updateProjectionMatrix(); + } + /** + * Set the absolute orbital goal of the camera. The change will be + * applied over a number of frames depending on configured acceleration and + * dampening _options. + * + * Returns true if invoking the method will result in the camera changing + * position and/or rotation, otherwise false. + */ + setOrbit(goalTheta = this.goalSpherical.theta, goalPhi = this.goalSpherical.phi, goalRadius = this.goalSpherical.radius) { + const { minimumAzimuthalAngle, maximumAzimuthalAngle, minimumPolarAngle, maximumPolarAngle, minimumRadius, maximumRadius } = this._options; + const { theta, phi, radius } = this.goalSpherical; + const nextTheta = clamp(goalTheta, minimumAzimuthalAngle, maximumAzimuthalAngle); + if (!isFinite(minimumAzimuthalAngle) && + !isFinite(maximumAzimuthalAngle)) { + this.spherical.theta = + this.wrapAngle(this.spherical.theta - nextTheta) + nextTheta; + } + const nextPhi = clamp(goalPhi, minimumPolarAngle, maximumPolarAngle); + const nextRadius = clamp(goalRadius, minimumRadius, maximumRadius); + if (nextTheta === theta && nextPhi === phi && nextRadius === radius) { + return false; + } + if (!isFinite(nextTheta) || !isFinite(nextPhi) || !isFinite(nextRadius)) { + return false; + } + this.goalSpherical.theta = nextTheta; + this.goalSpherical.phi = nextPhi; + this.goalSpherical.radius = nextRadius; + this.goalSpherical.makeSafe(); + return true; + } + /** + * Subset of setOrbit() above, which only sets the camera's radius. + */ + setRadius(radius) { + this.goalSpherical.radius = radius; + this.setOrbit(); + } + /** + * Sets the goal field of view for the camera + */ + setFieldOfView(fov) { + const { minimumFieldOfView, maximumFieldOfView } = this._options; + fov = clamp(fov, minimumFieldOfView, maximumFieldOfView); + this.goalLogFov = Math.log(fov); + } + /** + * Sets the smoothing decay time. + */ + setDamperDecayTime(decayMilliseconds) { + this.thetaDamper.setDecayTime(decayMilliseconds); + this.phiDamper.setDecayTime(decayMilliseconds); + this.radiusDamper.setDecayTime(decayMilliseconds); + this.fovDamper.setDecayTime(decayMilliseconds); + } + /** + * Adjust the orbital position of the camera relative to its current orbital + * position. Does not let the theta goal get more than pi ahead of the current + * theta, which ensures interpolation continues in the direction of the delta. + * The deltaZoom parameter adjusts both the field of view and the orbit radius + * such that they progress across their allowed ranges in sync. + */ + adjustOrbit(deltaTheta, deltaPhi, deltaZoom) { + const { theta, phi, radius } = this.goalSpherical; + const { minimumRadius, maximumRadius, minimumFieldOfView, maximumFieldOfView } = this._options; + const dTheta = this.spherical.theta - theta; + const dThetaLimit = Math.PI - 0.001; + const goalTheta = theta - clamp(deltaTheta, -dThetaLimit - dTheta, dThetaLimit - dTheta); + const goalPhi = phi - deltaPhi; + const deltaRatio = deltaZoom === 0 ? + 0 : + ((deltaZoom > 0 ? maximumRadius : minimumRadius) - radius) / + (Math.log(deltaZoom > 0 ? maximumFieldOfView : minimumFieldOfView) - + this.goalLogFov); + const goalRadius = radius + + deltaZoom * + (isFinite(deltaRatio) ? deltaRatio : + (maximumRadius - minimumRadius) * 2); + this.setOrbit(goalTheta, goalPhi, goalRadius); + if (deltaZoom !== 0) { + const goalLogFov = this.goalLogFov + deltaZoom; + this.setFieldOfView(Math.exp(goalLogFov)); + } + } + /** + * Move the camera instantly instead of accelerating toward the goal + * parameters. + */ + jumpToGoal() { + this.update(0, SETTLING_TIME); + } + /** + * Update controls. In most cases, this will result in the camera + * interpolating its position and rotation until it lines up with the + * designated goal orbital position. Returns false if the camera did not move. + * + * Time and delta are measured in milliseconds. + */ + update(_time, delta) { + if (this.isStationary()) { + return false; + } + const { maximumPolarAngle, maximumRadius } = this._options; + const dTheta = this.spherical.theta - this.goalSpherical.theta; + if (Math.abs(dTheta) > Math.PI && + !isFinite(this._options.minimumAzimuthalAngle) && + !isFinite(this._options.maximumAzimuthalAngle)) { + this.spherical.theta -= Math.sign(dTheta) * 2 * Math.PI; + } + this.spherical.theta = this.thetaDamper.update(this.spherical.theta, this.goalSpherical.theta, delta, Math.PI); + this.spherical.phi = this.phiDamper.update(this.spherical.phi, this.goalSpherical.phi, delta, maximumPolarAngle); + this.spherical.radius = this.radiusDamper.update(this.spherical.radius, this.goalSpherical.radius, delta, maximumRadius); + this.logFov = this.fovDamper.update(this.logFov, this.goalLogFov, delta, 1); + this.moveCamera(); + return true; + } + updateTouchActionStyle() { + const { style } = this.element; + if (this._interactionEnabled) { + const { touchAction } = this._options; + if (this._disableZoom && touchAction !== 'none') { + style.touchAction = 'manipulation'; + } + else { + style.touchAction = touchAction; + } + } + else { + style.touchAction = ''; + } + } + isStationary() { + return this.goalSpherical.theta === this.spherical.theta && + this.goalSpherical.phi === this.spherical.phi && + this.goalSpherical.radius === this.spherical.radius && + this.goalLogFov === this.logFov; + } + moveCamera() { + // Derive the new camera position from the updated spherical: + this.spherical.makeSafe(); + this.camera.position.setFromSpherical(this.spherical); + this.camera.setRotationFromEuler(new Euler(this.spherical.phi - Math.PI / 2, this.spherical.theta, 0, 'YXZ')); + if (this.camera.fov !== Math.exp(this.logFov)) { + this.camera.fov = Math.exp(this.logFov); + this.camera.updateProjectionMatrix(); + } + } + userAdjustOrbit(deltaTheta, deltaPhi, deltaZoom) { + this.adjustOrbit(deltaTheta * this.orbitSensitivity * this.inputSensitivity, deltaPhi * this.orbitSensitivity * this.inputSensitivity, deltaZoom * this.inputSensitivity); + } + // Wraps to between -pi and pi + wrapAngle(radians) { + const normalized = (radians + Math.PI) / (2 * Math.PI); + const wrapped = normalized - Math.floor(normalized); + return wrapped * 2 * Math.PI - Math.PI; + } + pixelLengthToSphericalAngle(pixelLength) { + return 2 * Math.PI * pixelLength / this.scene.height; + } + twoTouchDistance(touchOne, touchTwo) { + const { clientX: xOne, clientY: yOne } = touchOne; + const { clientX: xTwo, clientY: yTwo } = touchTwo; + const xDelta = xTwo - xOne; + const yDelta = yTwo - yOne; + return Math.sqrt(xDelta * xDelta + yDelta * yDelta); + } + handleSinglePointerMove(dx, dy) { + const deltaTheta = this.pixelLengthToSphericalAngle(dx); + const deltaPhi = this.pixelLengthToSphericalAngle(dy); + if (this.isUserPointing === false) { + this.isUserPointing = true; + this.dispatchEvent({ type: 'pointer-change-start' }); + } + this.userAdjustOrbit(deltaTheta, deltaPhi, 0); + } + initializePan() { + const { theta, phi } = this.spherical; + const psi = theta - this.scene.yaw; + this.panPerPixel = + PAN_SENSITIVITY * this.panSensitivity / this.scene.height; + this.panProjection.set(-Math.cos(psi), -Math.cos(phi) * Math.sin(psi), 0, 0, Math.sin(phi), 0, Math.sin(psi), -Math.cos(phi) * Math.cos(psi), 0); + } + movePan(dx, dy) { + const { scene } = this; + const dxy = vector3$2.set(dx, dy, 0).multiplyScalar(this.inputSensitivity); + const metersPerPixel = this.spherical.radius * Math.exp(this.logFov) * this.panPerPixel; + dxy.multiplyScalar(metersPerPixel); + const target = scene.getTarget(); + target.add(dxy.applyMatrix3(this.panProjection)); + scene.boundingSphere.clampPoint(target, target); + scene.setTarget(target.x, target.y, target.z); + } + recenter(pointer) { + if (performance.now() > this.startTime + TAP_MS || + Math.abs(pointer.clientX - this.startPointerPosition.clientX) > + TAP_DISTANCE || + Math.abs(pointer.clientY - this.startPointerPosition.clientY) > + TAP_DISTANCE) { + return; + } + const { scene } = this; + const hit = scene.positionAndNormalFromPoint(scene.getNDC(pointer.clientX, pointer.clientY)); + if (hit == null) { + const { cameraTarget } = scene.element; + scene.element.cameraTarget = ''; + scene.element.cameraTarget = cameraTarget; + // Zoom all the way out. + this.userAdjustOrbit(0, 0, 1); + } + else { + scene.target.worldToLocal(hit.position); + scene.setTarget(hit.position.x, hit.position.y, hit.position.z); + } + } + resetRadius() { + const { scene } = this; + const hit = scene.positionAndNormalFromPoint(vector2.set(0, 0)); + if (hit == null) { + return; + } + scene.target.worldToLocal(hit.position); + const goalTarget = scene.getTarget(); + const { theta, phi } = this.spherical; + // Set target to surface hit point, except the target is still settling, + // so offset the goal accordingly so the transition is smooth even though + // this will drift the target slightly away from the hit point. + const psi = theta - scene.yaw; + const n = vector3$2.set(Math.sin(phi) * Math.sin(psi), Math.cos(phi), Math.sin(phi) * Math.cos(psi)); + const dr = n.dot(hit.position.sub(goalTarget)); + goalTarget.add(n.multiplyScalar(dr)); + scene.setTarget(goalTarget.x, goalTarget.y, goalTarget.z); + // Change the camera radius to match the change in target so that the + // camera itself does not move, unless it hits a radius bound. + this.setOrbit(undefined, undefined, this.goalSpherical.radius - dr); + } + onTouchChange(event) { + if (this.pointers.length === 1) { + this.touchMode = this.touchModeRotate; + } + else { + if (this._disableZoom) { + this.touchMode = null; + this.element.removeEventListener('touchmove', this.disableScroll); + return; + } + this.touchMode = (this.touchDecided && this.touchMode === null) ? + null : + this.touchModeZoom; + this.touchDecided = true; + this.element.addEventListener('touchmove', this.disableScroll, { passive: false }); + this.lastSeparation = + this.twoTouchDistance(this.pointers[0], this.pointers[1]); + if (this.enablePan && this.touchMode != null) { + this.initializePan(); + if (!event.altKey) { // user interaction, not prompt + this.scene.element[$panElement].style.opacity = 1; + } + } + } + } + onMouseDown(event) { + this.panPerPixel = 0; + if (this.enablePan && + (event.button === 2 || event.ctrlKey || event.metaKey || + event.shiftKey)) { + this.initializePan(); + this.scene.element[$panElement].style.opacity = 1; + } + this.element.style.cursor = 'grabbing'; + } + /** + * Handles the orbit and Zoom key presses + * Uses constants for the increment. + * @param event The keyboard event for the .key value + * @returns boolean to indicate if the key event has been handled + */ + orbitZoomKeyCodeHandler(event) { + let relevantKey = true; + switch (event.key) { + case 'PageUp': + this.userAdjustOrbit(0, 0, ZOOM_SENSITIVITY * this.zoomSensitivity); + break; + case 'PageDown': + this.userAdjustOrbit(0, 0, -1 * ZOOM_SENSITIVITY * this.zoomSensitivity); + break; + case 'ArrowUp': + this.userAdjustOrbit(0, -KEYBOARD_ORBIT_INCREMENT, 0); + break; + case 'ArrowDown': + this.userAdjustOrbit(0, KEYBOARD_ORBIT_INCREMENT, 0); + break; + case 'ArrowLeft': + this.userAdjustOrbit(-KEYBOARD_ORBIT_INCREMENT, 0, 0); + break; + case 'ArrowRight': + this.userAdjustOrbit(KEYBOARD_ORBIT_INCREMENT, 0, 0); + break; + default: + relevantKey = false; + break; + } + return relevantKey; + } + /** + * Handles the Pan key presses + * Uses constants for the increment. + * @param event The keyboard event for the .key value + * @returns boolean to indicate if the key event has been handled + */ + panKeyCodeHandler(event) { + this.initializePan(); + let relevantKey = true; + switch (event.key) { + case 'ArrowUp': + this.movePan(0, -1 * PAN_KEY_INCREMENT); // This is the negative one so that the + // model appears to move as the arrow + // direction rather than the view moving + break; + case 'ArrowDown': + this.movePan(0, PAN_KEY_INCREMENT); + break; + case 'ArrowLeft': + this.movePan(-1 * PAN_KEY_INCREMENT, 0); + break; + case 'ArrowRight': + this.movePan(PAN_KEY_INCREMENT, 0); + break; + default: + relevantKey = false; + break; + } + return relevantKey; + } +} + +// SVG strings for the icons are defined here to avoid io and better performance for xr. +const CLOSE_ICON_SVG = ` + +`; +const VIEW_REAL_SIZE_ICON_SVG = ` + +`; +const REPLAY_ICON_SVG = ` + + + + + + + + +`; +// Panel configuration +const PANEL_CONFIG = { + width: 0.16, + height: 0.07, + cornerRadius: 0.03, + opacity: 1, + color: 0x000000, + // Distance-based scaling configuration + minDistance: 0.5, // Minimum distance for scaling (meters) + maxDistance: 10.0, // Maximum distance for scaling (meters) + baseScale: 1.0, // Base scale factor + distanceScaleFactor: 0.3 // How much to scale per meter of distance +}; +// Button configuration +const BUTTON_CONFIG = { + size: 0.05, // Fixed size for all buttons + zOffset: 0.01, // Distance from panel surface + spacing: 0.07 // Space between button centers +}; +// Icon configuration +const ICON_CONFIG = { + canvasSize: 128, + filter: LinearFilter +}; +class XRMenuPanel extends Object3D { + constructor() { + super(); + this.isActualSize = false; // Start with normalized size + // Pre-render all icons + this.preRenderIcons(); + this.createPanel(); + this.createButtons(); + this.opacityDamper = new Damper(); + this.goalOpacity = PANEL_CONFIG.opacity; + } + createPanel() { + const panelShape = this.createPanelShape(); + const geometry = new ShapeGeometry(panelShape); + const material = new MeshBasicMaterial({ + color: PANEL_CONFIG.color, + opacity: PANEL_CONFIG.opacity, + transparent: true + }); + this.panelMesh = new Mesh(geometry, material); + this.panelMesh.name = 'MenuPanel'; + this.add(this.panelMesh); + } + createButtons() { + // Create exit button + this.exitButton = this.createButton('close'); + this.exitButton.name = 'ExitButton'; + this.exitButton.position.set(BUTTON_CONFIG.spacing / 2, 0, BUTTON_CONFIG.zOffset); + this.add(this.exitButton); + // Create toggle button + this.toggleButton = this.createButton('view-real-size'); + this.toggleButton.name = 'ToggleButton'; + this.toggleButton.position.set(-0.07 / 2, 0, BUTTON_CONFIG.zOffset); + this.add(this.toggleButton); + } + createPanelShape() { + const shape = new Shape(); + const { width: w, height: h, cornerRadius: r } = PANEL_CONFIG; + // Create rounded rectangle path + shape.moveTo(-0.16 / 2 + r, -0.07 / 2); + shape.lineTo(w / 2 - r, -0.07 / 2); + shape.quadraticCurveTo(w / 2, -0.07 / 2, w / 2, -0.07 / 2 + r); + shape.lineTo(w / 2, h / 2 - r); + shape.quadraticCurveTo(w / 2, h / 2, w / 2 - r, h / 2); + shape.lineTo(-0.16 / 2 + r, h / 2); + shape.quadraticCurveTo(-0.16 / 2, h / 2, -0.16 / 2, h / 2 - r); + shape.lineTo(-0.16 / 2, -0.07 / 2 + r); + shape.quadraticCurveTo(-0.16 / 2, -0.07 / 2, -0.16 / 2 + r, -0.07 / 2); + return shape; + } + preRenderIcons() { + const iconSvgs = [ + { key: 'close', svg: CLOSE_ICON_SVG }, + { key: 'view-real-size', svg: VIEW_REAL_SIZE_ICON_SVG }, + { key: 'replay', svg: REPLAY_ICON_SVG } + ]; + iconSvgs.forEach(({ key, svg }) => { + if (!XRMenuPanel.iconTextures.has(key)) { + this.createTextureFromSvg(svg, key); + } + }); + } + createTextureFromSvg(svgContent, key) { + const canvas = document.createElement('canvas'); + canvas.width = ICON_CONFIG.canvasSize; + canvas.height = ICON_CONFIG.canvasSize; + const ctx = canvas.getContext('2d'); + // Create an image from SVG content + const img = new Image(); + const svgBlob = new Blob([svgContent], { type: 'image/svg+xml' }); + const url = URL.createObjectURL(svgBlob); + img.onload = () => { + ctx.drawImage(img, 0, 0, ICON_CONFIG.canvasSize, ICON_CONFIG.canvasSize); + const texture = new CanvasTexture(canvas); + texture.needsUpdate = true; + texture.minFilter = ICON_CONFIG.filter; + XRMenuPanel.iconTextures.set(key, texture); + URL.revokeObjectURL(url); + }; + img.src = url; + } + createButton(iconKey) { + // Create a placeholder mesh + const material = new MeshBasicMaterial({ transparent: true }); + const geometry = new PlaneGeometry(BUTTON_CONFIG.size, BUTTON_CONFIG.size); + const mesh = new Mesh(geometry, material); + // Try to get cached texture, or create a fallback + const cachedTexture = XRMenuPanel.iconTextures.get(iconKey); + if (cachedTexture) { + mesh.material.map = cachedTexture; + mesh.material.needsUpdate = true; + } + else { + // RACE CONDITION FIX: Texture creation is async (img.onload), but button creation is sync + // This fallback handles the case where buttons are created before textures finish loading + this.createTextureFromSvg(iconKey === 'close' ? CLOSE_ICON_SVG : + iconKey === 'view-real-size' ? VIEW_REAL_SIZE_ICON_SVG : + REPLAY_ICON_SVG, iconKey); + // Polling mechanism: Wait for async texture creation to complete + // This prevents white squares from appearing on first load + const checkTexture = () => { + const texture = XRMenuPanel.iconTextures.get(iconKey); + if (texture) { + // Texture is ready - apply it to the mesh + mesh.material.map = texture; + mesh.material.needsUpdate = true; + } + else { + // Texture not ready yet - check again in 10ms + setTimeout(checkTexture, 10); + } + }; + checkTexture(); + } + return mesh; + } + exitButtonControllerIntersection(scene, controller) { + const hitResult = scene.hitFromController(controller, this.exitButton); + return hitResult; + } + scaleModeButtonControllerIntersection(scene, controller) { + const hitResult = scene.hitFromController(controller, this.toggleButton); + return hitResult; + } + handleScaleToggle(worldSpaceInitialPlacementDone, initialModelScale, minScale, maxScale) { + if (!worldSpaceInitialPlacementDone) { + return null; + } + this.isActualSize = !this.isActualSize; + // Toggle between view real size icon and replay icon + // When isActualSize is true, show replay icon (to reset) + // When isActualSize is false, show view real size icon (to go to actual size) + const iconKey = this.isActualSize ? 'replay' : 'view-real-size'; + this.updateScaleModeButtonLabel(iconKey); + const targetScale = this.isActualSize ? 1.0 : initialModelScale; + const goalScale = Math.max(minScale, Math.min(maxScale, targetScale)); + return goalScale; + } + updateScaleModeButtonLabel(iconKey) { + const cachedTexture = XRMenuPanel.iconTextures.get(iconKey); + if (cachedTexture) { + this.toggleButton.material.map = cachedTexture; + this.toggleButton.material.needsUpdate = true; + } + } + updatePosition(camera, placementBox) { + if (!placementBox) { + return; + } + // Get the world position of the placement box + const placementBoxWorldPos = new Vector3(); + placementBox.getWorldPosition(placementBoxWorldPos); + // Get the placement box size to calculate dynamic offsets + const placementBoxSize = placementBox.getSize(); + const placementBoxMinDimension = Math.min(placementBoxSize.x, placementBoxSize.z); + // Calculate dynamic offsets based on placement box size + // Base offsets with placement box size scaling + const baseOffsetUp = -0.2; + const baseOffsetForward = 0.9; + const sizeScaleFactor = Math.max(0.5, Math.min(2.0, placementBoxMinDimension / 1.0)); // Scale between 0.5x and 2x + const offsetUp = baseOffsetUp * sizeScaleFactor; + const offsetForward = baseOffsetForward * sizeScaleFactor; + // Get direction from placement box to camera (horizontal only) + const directionToCamera = new Vector3() + .copy(camera.position) + .sub(placementBoxWorldPos); + directionToCamera.y = 0; // Zero out vertical component + directionToCamera.normalize(); + // Calculate the final position + const panelPosition = new Vector3() + .copy(placementBoxWorldPos) + .add(new Vector3(0, offsetUp, 0)) // Move up + .add(directionToCamera.multiplyScalar(offsetForward)); // Move forward + this.position.copy(panelPosition); + // Calculate distance-based scaling + const distanceToCamera = camera.position.distanceTo(panelPosition); + const clampedDistance = Math.max(PANEL_CONFIG.minDistance, Math.min(PANEL_CONFIG.maxDistance, distanceToCamera)); + const scaleFactor = PANEL_CONFIG.baseScale + (clampedDistance - PANEL_CONFIG.minDistance) * PANEL_CONFIG.distanceScaleFactor; + // Apply scaling to the entire panel (including buttons) + this.scale.set(scaleFactor, scaleFactor, scaleFactor); + // Make the menu panel face the camera + this.lookAt(camera.position); + } + /** + * Set the box's visibility; it will fade in and out. + */ + set show(visible) { + this.goalOpacity = visible ? PANEL_CONFIG.opacity : 0; + } + /** + * Call on each frame with the frame delta to fade the box. + */ + updateOpacity(delta) { + const material = this.panelMesh.material; + const currentOpacity = material.opacity; + const newOpacity = this.opacityDamper.update(currentOpacity, this.goalOpacity, delta, 1); + this.traverse((child) => { + if (child instanceof Mesh) { + const mat = child.material; + if (mat.transparent) + mat.opacity = newOpacity; + } + }); + this.visible = newOpacity > 0; + } + dispose() { + var _a; + this.children.forEach(child => { + if (child instanceof Mesh) { + // Dispose geometry first + if (child.geometry) { + child.geometry.dispose(); + } + // Handle material(s) + // Material can be a single Material or an array of Materials + const materials = Array.isArray(child.material) ? child.material : [child.material]; + materials.forEach(material => { + if (material) { // Ensure material exists before proceeding + // Dispose texture if it exists and is a CanvasTexture + // We specifically created CanvasTextures for buttons, so check for that type. + if ('map' in material && material.map instanceof CanvasTexture) { // Check if 'map' property exists and is a CanvasTexture + material.map.dispose(); + } + // Dispose material itself + material.dispose(); + } + }); + } + }); + // Remove the panel itself from its parent in the scene graph + (_a = this.parent) === null || _a === void 0 ? void 0 : _a.remove(this); + } +} +// Cache for pre-rendered textures +XRMenuPanel.iconTextures = new Map(); + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// number of initial null pose XRFrames allowed before we post not-tracking +const INIT_FRAMES = 30; +// AR shadow is not user-configurable. This is to pave the way for AR lighting +// estimation, which will be used once available in WebXR. +const AR_SHADOW_INTENSITY = 0.8; +const ROTATION_RATE = 1.5; +// Angle down (towards bottom of screen) from camera center ray to use for hit +// testing against the floor. This makes placement faster and more intuitive +// assuming the phone is in portrait mode. This seems to be a reasonable +// assumption for the start of the session and UI will lack landscape mode to +// encourage upright use. +const HIT_ANGLE_DEG = 20; +const SCALE_SNAP = 0.2; +// upward-oriented ray for ceiling detection +const CEILING_HIT_ANGLE_DEG = 20; +const CEILING_ORIENTATION_THRESHOLD = 15; // degrees +// For automatic dynamic viewport scaling, don't let the scale drop below this +// limit. +const MIN_VIEWPORT_SCALE = 0.25; +// Furthest away you can move an object (meters). +const MAX_DISTANCE = 10; +// Damper decay in milliseconds for the headset - screen uses default. +const DECAY = 150; +// Longer controller/hand indicator line (meters). +const MAX_LINE_LENGTH = 5; +// Axis Y in webxr. +const AXIS_Y = new Vector3(0, 1, 0); +// Webxr rotation sensitivity +const ROTATION_SENSIVITY = 0.3; +// World-space AR automatic positioning constants (similar to FrameModel approach in SVXR) +const MIN_WORLD_SPACE_DISTANCE = 1.5; // Minimum distance from camera (meters) +const VIEW_DROP_DEGREES = 15; // Angle down from camera center for optimal viewing +const VIEW_RATIO = 0.3; // Ratio of viewport to use for model sizing +const MIN_MODEL_SIZE = 0.01; // Minimum model size to prevent division by zero +const PLACEMENT_BOX_EXTRA_PADDING = 0.15; // Extra padding for model-viewer +// SVXR-like constants for scale limits +const MAX_MODEL_SIZE = 70.0; +const MODEL_SIZE_EPSILON = 0.001; +const FOOTPRINT__INTERSECT_THRESHOLD = 0.2; +const ARStatus = { + NOT_PRESENTING: 'not-presenting', + SESSION_STARTED: 'session-started', + OBJECT_PLACED: 'object-placed', + FAILED: 'failed' +}; +const ARTracking = { + TRACKING: 'tracking', + NOT_TRACKING: 'not-tracking' +}; +const vector3$1 = new Vector3(); +const quaternion = new Quaternion(); +const matrix4 = new Matrix4(); +const hitPosition = new Vector3(); +const camera = new PerspectiveCamera(45, 1, 0.1, 100); +const lineGeometry = new BufferGeometry().setFromPoints([new Vector3(0, 0, 0), new Vector3(0, 0, -1)]); +const XRMode = { + SCREEN_SPACE: 'screen-space', + WORLD_SPACE: 'world-space' +}; +class ARRenderer extends EventDispatcher { + /** + * Check if world-space mode is active and initial placement is complete + */ + isWorldSpaceReady() { + return this.xrMode === XRMode.WORLD_SPACE && this.worldSpaceInitialPlacementDone; + } + constructor(renderer) { + super(); + this.renderer = renderer; + this.currentSession = null; + this.placementMode = 'floor'; + this.placementBox = null; + this.menuPanel = null; + this.lastTick = null; + this.turntableRotation = null; + this.oldShadowIntensity = null; + this.frame = null; + this.initialHitSource = null; + this.transientHitTestSource = null; + this.inputSource = null; + this._presentedScene = null; + this.resolveCleanup = null; + this.exitWebXRButtonContainer = null; + this.overlay = null; + this.xrLight = null; + this.xrMode = null; + this.xrController1 = null; + this.xrController2 = null; + this.selectedXRController = null; + this.tracking = true; + this.frames = 0; + this.initialized = false; + this.oldTarget = new Vector3(); + this.placementComplete = false; + this.isTranslating = false; + this.isRotating = false; + this.isTwoHandInteraction = false; + this.lastDragPosition = new Vector3(); + this.deltaRotation = new Quaternion(); + this.scaleLine = new Line(lineGeometry); + this.firstRatio = 0; + this.lastAngle = 0; + this.goalPosition = new Vector3(); + this.goalYaw = 0; + this.goalScale = 1; + this.xDamper = new Damper(); + this.yDamper = new Damper(); + this.zDamper = new Damper(); + this.yawDamper = new Damper(); + this.pitchDamper = new Damper(); + this.rollDamper = new Damper(); + this.scaleDamper = new Damper(); + this.wasTwoFingering = false; + // Track if initial automatic placement has been done for world-space mode + this.worldSpaceInitialPlacementDone = false; + // Scale toggle state for world-space mode + this.initialModelScale = 1.0; + this.minScale = 1.0; + this.maxScale = 1.0; + this.onExitWebXRButtonContainerClick = () => this.stopPresenting(); + this.onControllerSelectStart = (event) => { + var _a, _b, _c; + const scene = this.presentedScene; + const controller = event.target; + const menuPanel = this.menuPanel; + const exitIntersect = this.menuPanel.exitButtonControllerIntersection(scene, controller); + if (exitIntersect != null) { + (_a = this.menuPanel) === null || _a === void 0 ? void 0 : _a.dispose(); + this.stopPresenting(); + return; + } + const scaleModeIntersect = this.menuPanel.scaleModeButtonControllerIntersection(scene, controller); + if (scaleModeIntersect != null) { + const goalScale = this.menuPanel.handleScaleToggle(this.worldSpaceInitialPlacementDone, this.initialModelScale, this.minScale, this.maxScale); + if (goalScale !== null) { + this.goalScale = goalScale; + } + return; + } + if (menuPanel) { + menuPanel.show = false; + } + const intersection = this.placementBox.controllerIntersection(scene, controller); + if (intersection != null) { + const bbox = new Box3().setFromObject(scene.pivot); + const footprintY = bbox.min.y + FOOTPRINT__INTERSECT_THRESHOLD; // Small threshold above base + // Check if the ray intersection is near the footprint + const isFootprint = intersection.point.y <= footprintY; + if (isFootprint) { + if (this.selectedXRController != null) { + this.selectedXRController.userData.line.visible = false; + if (scene.canScale && this.isWorldSpaceReady()) { + this.isTwoHandInteraction = true; + this.firstRatio = this.controllerSeparation() / scene.pivot.scale.x; + this.scaleLine.visible = true; + } + } + else { + controller.attach(scene.pivot); + } + this.selectedXRController = controller; + scene.setShadowIntensity(0.01); + } + else { + if (controller == this.xrController1) { + this.xrController1.userData.isSelected = true; + } + else if (controller == this.xrController2) { + this.xrController2.userData.isSelected = true; + } + if (((_b = this.xrController1) === null || _b === void 0 ? void 0 : _b.userData.isSelected) && ((_c = this.xrController2) === null || _c === void 0 ? void 0 : _c.userData.isSelected)) { + if (scene.canScale && this.isWorldSpaceReady()) { + this.isTwoHandInteraction = true; + this.firstRatio = this.controllerSeparation() / scene.pivot.scale.x; + this.scaleLine.visible = true; + } + } + else { + const otherController = controller === this.xrController1 ? this.xrController2 : + this.xrController1; + controller.userData.initialX = controller.position.x; + otherController.userData.turning = false; + controller.userData.turning = true; + controller.userData.line.visible = false; + } + } + } + }; + this.onControllerSelectEnd = (event) => { + const controller = event.target; + controller.userData.turning = false; + controller.userData.line.visible = true; + this.isTwoHandInteraction = false; + this.scaleLine.visible = false; + if (controller == this.xrController1) { + this.xrController1.userData.isSelected = false; + } + else if (controller == this.xrController2) { + this.xrController2.userData.isSelected = false; + } + if (this.selectedXRController != null && + this.selectedXRController != controller) { + return; + } + const scene = this.presentedScene; + // drop on floor + scene.attach(scene.pivot); + this.selectedXRController = null; + this.goalYaw = Math.atan2(scene.pivot.matrix.elements[8], scene.pivot.matrix.elements[10]); + this.goalPosition.x = scene.pivot.position.x; + this.goalPosition.z = scene.pivot.position.z; + // For world-space mode after initial placement, preserve Y position + if (this.isWorldSpaceReady()) { + this.goalPosition.y = scene.pivot.position.y; + } + const menuPanel = this.menuPanel; + menuPanel.show = true; + }; + this.onUpdateScene = () => { + if (this.placementBox != null && this.isPresenting) { + // Update the existing placement box with new model dimensions instead of recreating + this.placementBox.updateFromModelChanges(); + // Ensure screen space mode is maintained + this.placementBox.setScreenSpaceMode(this.xrMode === XRMode.SCREEN_SPACE); + } + if (this.xrMode !== XRMode.SCREEN_SPACE) { + if (this.menuPanel) { + this.menuPanel.dispose(); + this.menuPanel = null; + } + this.menuPanel = new XRMenuPanel(); + this.presentedScene.add(this.menuPanel); + this.menuPanel.updatePosition(this.presentedScene.getCamera(), this.placementBox); + } + }; + this.onSelectStart = (event) => { + const hitSource = this.transientHitTestSource; + if (hitSource == null) { + return; + } + const fingers = this.frame.getHitTestResultsForTransientInput(hitSource); + const scene = this.presentedScene; + const box = this.placementBox; + if (fingers.length === 1) { + this.inputSource = event.inputSource; + const { axes } = this.inputSource.gamepad; + const hitPosition = box.getHit(this.presentedScene, axes[0], axes[1]); + box.show = true; + if (hitPosition != null) { + this.isTranslating = true; + this.lastDragPosition.copy(hitPosition); + } + else if (this.placeOnWall === false) { + this.isRotating = true; + this.lastAngle = axes[0] * ROTATION_RATE; + } + } + else if (fingers.length === 2) { + box.show = true; + this.isTwoHandInteraction = true; + const { separation, angle } = this.fingerPolar(fingers); + this.lastAngle = angle; // Initialize lastAngle, do not update goalYaw + if (this.firstRatio === 0) { + this.firstRatio = separation / scene.pivot.scale.x; + } + if (scene.canScale) { + this.setScale(separation); + } + return; + } + }; + this.onSelectEnd = () => { + this.isTranslating = false; + this.isRotating = false; + this.isTwoHandInteraction = false; + this.inputSource = null; + this.goalPosition.y += + this.placementBox.offsetHeight * this.presentedScene.scale.x; + this.placementBox.show = false; + }; + this.threeRenderer = renderer.threeRenderer; + this.threeRenderer.xr.enabled = true; + } + async resolveARSession() { + assertIsArCandidate(); + const session = await navigator.xr.requestSession('immersive-ar', { + requiredFeatures: [], + optionalFeatures: ['hit-test', 'dom-overlay', 'light-estimation'], + domOverlay: this.overlay ? { root: this.overlay } : undefined + }); + this.threeRenderer.xr.setReferenceSpaceType('local'); + await this.threeRenderer.xr.setSession(session); + this.threeRenderer.xr.cameraAutoUpdate = false; + return session; + } + /** + * The currently presented scene, if any + */ + get presentedScene() { + return this._presentedScene; + } + /** + * Resolves to true if the renderer has detected all the necessary qualities + * to support presentation in AR. + */ + async supportsPresentation() { + try { + assertIsArCandidate(); + return await navigator.xr.isSessionSupported('immersive-ar'); + } + catch (error) { + console.warn('Request to present in WebXR denied:'); + console.warn(error); + console.warn('Falling back to next ar-mode'); + return false; + } + } + /** + * Present a scene in AR + */ + async present(scene, environmentEstimation = false) { + if (this.isPresenting) { + console.warn('Cannot present while a model is already presenting'); + } + let waitForAnimationFrame = new Promise((resolve, _reject) => { + requestAnimationFrame(() => resolve()); + }); + scene.setHotspotsVisibility(false); + scene.queueRender(); + // Render a frame to turn off the hotspots + await waitForAnimationFrame; + // This sets isPresenting to true + this._presentedScene = scene; + this.overlay = scene.element.shadowRoot.querySelector('div.default'); + if (environmentEstimation === true) { + this.xrLight = new XREstimatedLight(this.threeRenderer); + this.xrLight.addEventListener('estimationstart', () => { + if (!this.isPresenting || this.xrLight == null) { + return; + } + const scene = this.presentedScene; + scene.add(this.xrLight); + scene.environment = this.xrLight.environment; + }); + } + const currentSession = await this.resolveARSession(); + currentSession.addEventListener('end', () => { + this.postSessionCleanup(); + }, { once: true }); + const exitButton = scene.element.shadowRoot.querySelector('.slot.exit-webxr-ar-button'); + exitButton.classList.add('enabled'); + exitButton.addEventListener('click', this.onExitWebXRButtonContainerClick); + this.exitWebXRButtonContainer = exitButton; + const viewerRefSpace = await currentSession.requestReferenceSpace('viewer'); + this.xrMode = currentSession.interactionMode; + this.tracking = true; + this.frames = 0; + this.initialized = false; + this.turntableRotation = scene.yaw; + this.goalYaw = scene.yaw; + this.goalScale = 1; + scene.setBackground(null); + this.oldShadowIntensity = scene.shadowIntensity; + scene.setShadowIntensity(0.01); // invisible, but not changing the shader + this.oldTarget.copy(scene.getTarget()); + scene.element.addEventListener('load', this.onUpdateScene); + // Create hit test source for all modes (will be used differently based on mode and state) + let ray; + if (!this.placeOnWall && !this.placeOnCeiling) { + // floor – shoot slightly downward + const r = HIT_ANGLE_DEG * Math.PI / 180; + ray = new XRRay(new DOMPoint(0, 0, 0), { x: 0, y: -Math.sin(r), z: -Math.cos(r) }); + } + else if (this.placeOnWall) { + ray = undefined; + } + else { // ceiling – shoot upward + const r = CEILING_HIT_ANGLE_DEG * Math.PI / 180; + ray = new XRRay(new DOMPoint(0, 0, 0), { x: 0, y: Math.sin(r), z: -Math.cos(r) }); + } + currentSession + .requestHitTestSource({ space: viewerRefSpace, offsetRay: ray }).then(hitTestSource => { + this.initialHitSource = hitTestSource; + }); + if (this.xrMode !== XRMode.SCREEN_SPACE) { + this.setupXRControllers(); + this.xDamper.setDecayTime(DECAY); + this.yDamper.setDecayTime(DECAY); + this.zDamper.setDecayTime(DECAY); + this.yawDamper.setDecayTime(DECAY); + this.pitchDamper.setDecayTime(DECAY); + this.rollDamper.setDecayTime(DECAY); + this.scaleDamper.setDecayTime(DECAY); + } + this.currentSession = currentSession; + this.placementBox = new PlacementBox(scene, this.placeOnWall ? 'back' + : this.placeOnCeiling ? 'top' : 'bottom'); + // Set screen space mode for proper positioning + if (this.placementBox) { + this.placementBox.setScreenSpaceMode(this.xrMode === XRMode.SCREEN_SPACE); + } + this.placementComplete = false; + if (this.xrMode !== XRMode.SCREEN_SPACE) { + this.menuPanel = new XRMenuPanel(); + scene.add(this.menuPanel); + this.menuPanel.updatePosition(scene.getCamera(), this.placementBox); // Position the menu panel + } + this.lastTick = performance.now(); + this.dispatchEvent({ type: 'status', status: ARStatus.SESSION_STARTED }); + } + setupXRControllerLine(xrController) { + if (!xrController.userData.line) { + const line = new Line(lineGeometry); + line.name = 'line'; + line.scale.z = MAX_LINE_LENGTH; + xrController.userData.turning = false; + xrController.userData.line = line; + xrController.add(line); + } + } + setupController(controller) { + this.setupXRControllerLine(controller); + controller.addEventListener('selectstart', this.onControllerSelectStart); + controller.addEventListener('selectend', this.onControllerSelectEnd); + } + setupXRControllers() { + this.xrController1 = this.threeRenderer.xr.getController(0); + this.xrController2 = this.threeRenderer.xr.getController(1); + this.setupController(this.xrController1); + this.setupController(this.xrController2); + this.scaleLine.name = 'scale line'; + this.scaleLine.visible = false; + this.xrController1.add(this.scaleLine); + // Add controllers to the scene + const scene = this.presentedScene; + scene.add(this.xrController1); + scene.add(this.xrController2); + } + hover(xrController) { + // Do not highlight in mobile-ar + if (this.xrMode === XRMode.SCREEN_SPACE || + this.selectedXRController == xrController) { + return false; + } + const scene = this.presentedScene; + const intersection = this.placementBox.controllerIntersection(scene, xrController); + xrController.userData.line.scale.z = + intersection == null ? MAX_LINE_LENGTH : intersection.distance; + return intersection != null; + } + controllerSeparation() { + return this.xrController1.position.distanceTo(this.xrController2.position); + } + /** + * If currently presenting a scene in AR, stops presentation and exits AR. + */ + async stopPresenting() { + if (!this.isPresenting) { + return; + } + const cleanupPromise = new Promise((resolve) => { + this.resolveCleanup = resolve; + }); + try { + await this.currentSession.end(); + await cleanupPromise; + } + catch (error) { + console.warn('Error while trying to end WebXR AR session'); + console.warn(error); + this.postSessionCleanup(); + } + } + /** + * True if a scene is currently in the process of being presented in AR + */ + get isPresenting() { + return this.presentedScene != null; + } + get target() { + return this.oldTarget; + } + get placeOnCeiling() { return this.placementMode === 'ceiling'; } + get placeOnWall() { return this.placementMode === 'wall'; } + updateTarget() { + const scene = this.presentedScene; + if (scene != null) { + const target = scene.getTarget(); + this.oldTarget.copy(target); + if (this.placeOnWall) { + target.z = scene.boundingBox.min.z; + } + else if (this.placeOnCeiling) { + target.y = scene.boundingBox.max.y; // Use ceiling height + } + else { + target.y = scene.boundingBox.min.y; // Floor height + } + scene.setTarget(target.x, target.y, target.z); + } + } + cleanupXRController(xrController) { + xrController.userData.turning = false; + xrController.userData.line.visible = true; + xrController.removeEventListener('selectstart', this.onControllerSelectStart); + xrController.removeEventListener('selectend', this.onControllerSelectEnd); + xrController.removeFromParent(); + } + postSessionCleanup() { + const session = this.currentSession; + if (session != null) { + session.removeEventListener('selectstart', this.onSelectStart); + session.removeEventListener('selectend', this.onSelectEnd); + this.currentSession = null; + } + const scene = this.presentedScene; + this._presentedScene = null; + if (scene != null) { + const { element } = scene; + if (this.xrLight != null) { + scene.remove(this.xrLight); + this.xrLight.dispose(); + this.xrLight = null; + } + if (this.menuPanel != null) { + this.menuPanel.dispose(); + this.menuPanel = null; + } + scene.add(scene.pivot); + scene.pivot.quaternion.set(0, 0, 0, 1); + scene.pivot.position.set(0, 0, 0); + scene.pivot.scale.set(1, 1, 1); + scene.setShadowOffset(0); + const yaw = this.turntableRotation; + if (yaw != null) { + scene.yaw = yaw; + } + const intensity = this.oldShadowIntensity; + if (intensity != null) { + scene.setShadowIntensity(intensity); + } + scene.setEnvironmentAndSkybox(element[$currentEnvironmentMap], element[$currentBackground]); + const point = this.oldTarget; + scene.setTarget(point.x, point.y, point.z); + scene.xrCamera = null; + scene.element.removeEventListener('load', this.onUpdateScene); + scene.orientHotspots(0); + const { width, height } = element.getBoundingClientRect(); + scene.setSize(width, height); + requestAnimationFrame(() => { + scene.element.dispatchEvent(new CustomEvent('camera-change', { detail: { source: ChangeSource.NONE } })); + }); + } + // Force the Renderer to update its size + this.renderer.height = 0; + const exitButton = this.exitWebXRButtonContainer; + if (exitButton != null) { + exitButton.classList.remove('enabled'); + exitButton.removeEventListener('click', this.onExitWebXRButtonContainerClick); + this.exitWebXRButtonContainer = null; + } + const hitSource = this.transientHitTestSource; + if (hitSource != null) { + hitSource.cancel(); + this.transientHitTestSource = null; + } + const hitSourceInitial = this.initialHitSource; + if (hitSourceInitial != null) { + hitSourceInitial.cancel(); + this.initialHitSource = null; + } + if (this.placementBox != null) { + this.placementBox.dispose(); + this.placementBox = null; + } + if (this.xrMode !== XRMode.SCREEN_SPACE) { + if (this.xrController1 != null) { + this.cleanupXRController(this.xrController1); + this.xrController1 = null; + } + if (this.xrController2 != null) { + this.cleanupXRController(this.xrController2); + this.xrController2 = null; + } + this.selectedXRController = null; + this.scaleLine.visible = false; + } + this.isTranslating = false; + this.isRotating = false; + this.isTwoHandInteraction = false; + this.lastTick = null; + this.turntableRotation = null; + this.oldShadowIntensity = null; + this.frame = null; + this.inputSource = null; + this.overlay = null; + this.worldSpaceInitialPlacementDone = false; + if (this.resolveCleanup != null) { + this.resolveCleanup(); + } + this.dispatchEvent({ type: 'status', status: ARStatus.NOT_PRESENTING }); + } + updateView(view) { + const scene = this.presentedScene; + const xr = this.threeRenderer.xr; + xr.updateCamera(camera); + scene.xrCamera = xr.getCamera(); + const { elements } = scene.getCamera().matrixWorld; + scene.orientHotspots(Math.atan2(elements[1], elements[5])); + if (!this.initialized) { + this.placeInitially(); + this.initialized = true; + } + // Use automatic dynamic viewport scaling if supported. + if (view.requestViewportScale && view.recommendedViewportScale) { + const scale = view.recommendedViewportScale; + view.requestViewportScale(Math.max(scale, MIN_VIEWPORT_SCALE)); + } + const layer = xr.getBaseLayer(); + if (layer != null) { + const viewport = layer instanceof XRWebGLLayer ? + layer.getViewport(view) : + xr.getBinding().getViewSubImage(layer, view).viewport; + this.threeRenderer.setViewport(viewport.x, viewport.y, viewport.width, viewport.height); + } + } + placeInitially() { + const scene = this.presentedScene; + const { pivot, element } = scene; + const { position } = pivot; + const xrCamera = scene.getCamera(); + const { width, height } = this.overlay.getBoundingClientRect(); + scene.setSize(width, height); + xrCamera.projectionMatrixInverse.copy(xrCamera.projectionMatrix).invert(); + const { theta } = element + .getCameraOrbit(); + // Orient model to match the 3D camera view + const cameraDirection = xrCamera.getWorldDirection(vector3$1); + scene.yaw = Math.atan2(-cameraDirection.x, -cameraDirection.z) - theta; + this.goalYaw = scene.yaw; + if (this.placeOnCeiling && !this.isViewPointingUp()) { + scene.visible = false; // Hide until properly oriented + scene.setHotspotsVisibility(true); // Still show UI + // Set up touch interaction for screen-space mode + if (this.xrMode === XRMode.SCREEN_SPACE) { + const { session } = this.frame; + session.addEventListener('selectstart', this.onSelectStart); + session.addEventListener('selectend', this.onSelectEnd); + session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' }) + .then(hitTestSource => { this.transientHitTestSource = hitTestSource; }); + } + return; // Exit early - don't place yet + } + // Use different placement logic for world-space vs screen-space + if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone) { + // Use automatic optimal placement for world-space AR only on first session + const { position: optimalPosition, scale: optimalScale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera); + this.goalPosition.copy(optimalPosition); + this.goalScale = optimalScale; + // Store the initial scale for toggle functionality + this.initialModelScale = optimalScale; + // Set initial position and scale immediately for world-space + position.copy(optimalPosition); + pivot.scale.set(optimalScale, optimalScale, optimalScale); + // Mark that initial placement is done + this.worldSpaceInitialPlacementDone = true; + // Calculate scale limits for world-space mode (SVXR logic) + this.calculateWorldSpaceScaleLimits(scene); + // Enable user interaction after initial placement + this.enableWorldSpaceUserInteraction(); + } + else if (this.xrMode === XRMode.SCREEN_SPACE) { + // Use original placement logic for screen-space AR + const radius = Math.max(1, 2 * scene.boundingSphere.radius); + position.copy(xrCamera.position) + .add(cameraDirection.multiplyScalar(radius)); + this.updateTarget(); + const target = scene.getTarget(); + position.add(target).sub(this.oldTarget); + this.goalPosition.copy(position); + } + scene.setHotspotsVisibility(true); + scene.visible = true; // Model is properly oriented, show it + if (this.xrMode === XRMode.SCREEN_SPACE) { + const { session } = this.frame; + session.addEventListener('selectstart', this.onSelectStart); + session.addEventListener('selectend', this.onSelectEnd); + session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' }) + .then(hitTestSource => { this.transientHitTestSource = hitTestSource; }); + } + } + checkForDeferredCeilingPlacement() { + // Check on every frame—both XR modes, only when ceiling is the target and the model is hidden + if (!this.placeOnCeiling || !this.presentedScene || this.presentedScene.visible) + return; + const isWorldSpaceDeferred = this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone; + const isScreenSpaceDeferred = this.xrMode === XRMode.SCREEN_SPACE; + if (isWorldSpaceDeferred || isScreenSpaceDeferred) { + if (this.isViewPointingUp()) { + this.performDeferredPlacement(); + } + } + } + performDeferredPlacement() { + const scene = this.presentedScene; + if (this.xrMode === XRMode.WORLD_SPACE) { + const xrCamera = scene.getCamera(); + const { position, scale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera); + this.goalPosition.copy(position); + this.goalScale = scale; + this.initialModelScale = scale; + scene.pivot.position.copy(position); + scene.pivot.scale.set(scale, scale, scale); + this.worldSpaceInitialPlacementDone = true; + this.calculateWorldSpaceScaleLimits(scene); + this.enableWorldSpaceUserInteraction(); + } + else { // SCREEN_SPACE + const xrCamera = scene.getCamera(); + const cameraDirection = xrCamera.getWorldDirection(new Vector3()); + const radius = Math.max(1, 2 * scene.boundingSphere.radius); + scene.pivot.position.copy(xrCamera.position).add(cameraDirection.multiplyScalar(radius)); + this.updateTarget(); + const target = scene.getTarget(); + scene.pivot.position.add(target).sub(this.oldTarget); + this.goalPosition.copy(scene.pivot.position); + // Setup touch interaction if needed + const { session } = this.frame; + session.addEventListener('selectstart', this.onSelectStart); + session.addEventListener('selectend', this.onSelectEnd); + session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' }) + .then(hitTestSource => { this.transientHitTestSource = hitTestSource; }); + } + scene.visible = true; + scene.setHotspotsVisibility(true); + this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED }); + } + getTouchLocation() { + const { axes } = this.inputSource.gamepad; + let location = this.placementBox.getExpandedHit(this.presentedScene, axes[0], axes[1]); + if (location != null) { + vector3$1.copy(location).sub(this.presentedScene.getCamera().position); + if (vector3$1.length() > MAX_DISTANCE) + return null; + } + return location; + } + getHitPoint(hitResult) { + const refSpace = this.threeRenderer.xr.getReferenceSpace(); + const pose = hitResult.getPose(refSpace); + if (pose == null) { + return null; + } + const hitMatrix = matrix4.fromArray(pose.transform.matrix); + if (this.placeOnWall === true) { + // Orient the model to the wall's normal vector. + this.goalYaw = Math.atan2(hitMatrix.elements[4], hitMatrix.elements[6]); + } + // Check that the y-coordinate of the normal is large enough that the normal + // is pointing up for floor placement; opposite for wall placement. + const normalY = hitMatrix.elements[5]; + if (this.placeOnWall) { + // wall: reject if normal points down/up too much + return normalY < -0.75 ? null : hitPosition.setFromMatrixPosition(hitMatrix); + } + if (this.placeOnCeiling) { + // ceiling: accept only downward-facing planes + return normalY < -0.5 + ? hitPosition.setFromMatrixPosition(hitMatrix) + : null; + } + // floor: accept only upward-facing planes + return normalY > 0.75 ? hitPosition.setFromMatrixPosition(hitMatrix) : null; + } + /** + * Hit-test the environment once per frame until a suitable surface is found, + * then lock the model to that anchor. + * – Floor: accept upward-facing planes and “drop” the model down. + * – Wall: accept vertical planes; keep full XYZ. + * – Ceiling: accept downward-facing planes; keep full XYZ and hide model + * until a ceiling hit arrives (no premature floor placement). + */ + moveToAnchor(frame) { + // Handle deferred initial placement for ceiling mode + if (this.placeOnCeiling && + this.xrMode === XRMode.WORLD_SPACE && + !this.worldSpaceInitialPlacementDone && + !this.presentedScene.visible) { + // Check if orientation is now sufficient + if (!this.isViewPointingUp()) { + console.log('[ARR/moveToAnchor] Still waiting for proper ceiling orientation'); + return; + } + // Orientation is good - complete the deferred world-space placement + const scene = this.presentedScene; + const xrCamera = scene.getCamera(); + const { position: optimalPosition, scale: optimalScale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera); + this.goalPosition.copy(optimalPosition); + this.goalScale = optimalScale; + this.initialModelScale = optimalScale; + scene.pivot.position.copy(optimalPosition); + scene.pivot.scale.set(optimalScale, optimalScale, optimalScale); + this.worldSpaceInitialPlacementDone = true; + this.calculateWorldSpaceScaleLimits(scene); + this.enableWorldSpaceUserInteraction(); + scene.visible = true; + this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED }); + return; + } + // Skip for world-space mode after initial placement (unless ceiling was deferred) + if (this.xrMode === XRMode.WORLD_SPACE && this.worldSpaceInitialPlacementDone) { + this.placementBox.show = false; + this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED }); + return; + } + } + isViewPointingUp(thresholdDeg = CEILING_ORIENTATION_THRESHOLD) { + const cam = this.presentedScene.getCamera(); + // Handle ArrayCamera (common in XR) + const realCam = cam.isArrayCamera && Array.isArray(cam.cameras) + ? cam.cameras[0] // Use first sub-camera + : cam; + if (!realCam || typeof realCam.updateMatrixWorld !== 'function') { + return false; + } + // Update camera matrix to get current world orientation + realCam.updateMatrixWorld(true); + const elements = realCam.matrixWorld.elements; + // Get forward direction from camera matrix (-Z column) + const forwardY = -elements[9]; // Y component of forward vector + const minY = Math.sin(thresholdDeg * Math.PI / 180); + return forwardY >= minY; + } + fingerPolar(fingers) { + const fingerOne = fingers[0].inputSource.gamepad.axes; + const fingerTwo = fingers[1].inputSource.gamepad.axes; + const deltaX = fingerTwo[0] - fingerOne[0]; + const deltaY = fingerTwo[1] - fingerOne[1]; + const angle = Math.atan2(deltaY, deltaX); + let deltaYaw = this.lastAngle - angle; + if (deltaYaw > Math.PI) { + deltaYaw -= 2 * Math.PI; + } + else if (deltaYaw < -Math.PI) { + deltaYaw += 2 * Math.PI; + } + return { + separation: Math.sqrt(deltaX * deltaX + deltaY * deltaY), + deltaYaw: deltaYaw, + angle: angle + }; + } + setScale(separation) { + let scale = separation / this.firstRatio; + scale = (Math.abs(scale - 1) < SCALE_SNAP) ? 1 : scale; + // Clamp to min/max for world-space mode after initial placement + if (this.isWorldSpaceReady()) { + scale = Math.max(this.minScale, Math.min(this.maxScale, scale)); + } + this.goalScale = scale; + } + processInput(frame) { + const hitSource = this.transientHitTestSource; + if (hitSource == null) { + return; + } + const fingers = frame.getHitTestResultsForTransientInput(hitSource); + const scene = this.presentedScene; + const scale = scene.pivot.scale.x; + // Robust two-finger gesture handling + if (fingers.length === 2) { + if (!this.wasTwoFingering) { + // New two-finger gesture starting + const { separation, angle } = this.fingerPolar(fingers); + this.firstRatio = separation / scale; + this.lastAngle = angle; + this.wasTwoFingering = true; + this.isTwoHandInteraction = true; + // Do not apply rotation or scale on this frame + return; + } + // Ongoing two-finger gesture + const { separation, deltaYaw, angle } = this.fingerPolar(fingers); + this.goalYaw += deltaYaw; + this.lastAngle = angle; + if (scene.canScale) { + this.setScale(separation); + } + this.isTwoHandInteraction = true; + return; + } + else { + if (this.wasTwoFingering) { + // Two-finger gesture ended + this.wasTwoFingering = false; + this.isTwoHandInteraction = false; + this.firstRatio = 0; + } + } + if (!this.isTranslating && !this.isTwoHandInteraction && !this.isRotating) { + return; + } + // Handle single finger interactions + if (this.isRotating) { + const angle = this.inputSource.gamepad.axes[0] * ROTATION_RATE; + this.goalYaw += angle - this.lastAngle; + this.lastAngle = angle; + } + else if (this.isTranslating) { + fingers.forEach(finger => { + if (finger.inputSource !== this.inputSource) { + return; + } + let hit = null; + if (finger.results.length > 0) { + hit = this.getHitPoint(finger.results[0]); + } + if (hit == null) { + hit = this.getTouchLocation(); + } + if (hit == null) { + return; + } + this.goalPosition.sub(this.lastDragPosition); + // For world-space mode after initial placement, allow full Y-axis control + if (this.isWorldSpaceReady()) { + // Use the hit point directly without floor constraints + console.log('[processInput] Setting goalPosition.y to hit.y:', hit.y); + this.goalPosition.add(hit); + } + else if (this.placeOnWall === false) { + // Original logic for screen-space or initial world-space placement + const offset = hit.y - this.lastDragPosition.y; + // When a lower floor is found, keep the model at the same height, but + // drop the placement box to the floor. The model falls on select end. + if (offset < 0) { + this.placementBox.offsetHeight = offset / scale; + this.presentedScene.setShadowOffset(offset); + // Interpolate hit ray up to drag plane + const cameraPosition = vector3$1.copy(scene.getCamera().position); + const alpha = -offset / (cameraPosition.y - hit.y); + cameraPosition.multiplyScalar(alpha); + hit.multiplyScalar(1 - alpha).add(cameraPosition); + } + this.goalPosition.add(hit); + } + else { + this.goalPosition.add(hit); + } + this.lastDragPosition.copy(hit); + }); + } + } + applyXRControllerRotation(controller, pivot) { + if (!controller.userData.turning) { + return; + } + const angle = (controller.position.x - controller.userData.initialX) * ROTATION_SENSIVITY; + this.deltaRotation.setFromAxisAngle(AXIS_Y, angle); + pivot.quaternion.multiplyQuaternions(this.deltaRotation, pivot.quaternion); + } + handleScalingInXR(scene, delta) { + // Allow manual scaling for world-space mode after initial placement + if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone) { + return; + } + if (this.xrController1 && this.xrController2 && this.isTwoHandInteraction) { + const dist = this.controllerSeparation(); + this.setScale(dist); + this.scaleLine.scale.z = -dist; + this.scaleLine.lookAt(this.xrController2.position); + } + const oldScale = scene.pivot.scale.x; + if (this.goalScale !== oldScale) { + const newScale = this.scaleDamper.update(oldScale, this.goalScale, delta, 1); + scene.pivot.scale.set(newScale, newScale, newScale); + } + } + updatePivotPosition(scene, delta) { + const { pivot } = scene; + const box = this.placementBox; + const boundingRadius = scene.boundingSphere.radius; + const goal = this.goalPosition; + const position = pivot.position; + let source = ChangeSource.NONE; + if (!goal.equals(position)) { + source = ChangeSource.USER_INTERACTION; + let { x, y, z } = position; + x = this.xDamper.update(x, goal.x, delta, boundingRadius); + y = this.yDamper.update(y, goal.y, delta, boundingRadius); + z = this.zDamper.update(z, goal.z, delta, boundingRadius); + position.set(x, y, z); + if (this.xrMode === XRMode.SCREEN_SPACE && !this.isTranslating) { + const offset = goal.y - y; + if (this.placementComplete && this.placeOnWall === false) { + box.offsetHeight = offset / scene.pivot.scale.x; + scene.setShadowOffset(offset); + } + else if (offset === 0) { + this.placementComplete = true; + box.show = false; + scene.setShadowIntensity(AR_SHADOW_INTENSITY); + } + } + if (this.xrMode !== XRMode.SCREEN_SPACE && goal.equals(position)) { + scene.setShadowIntensity(AR_SHADOW_INTENSITY); + } + // For world-space mode after initial placement, don't constrain Y position + if (this.isWorldSpaceReady()) { + // Allow full Y-axis movement without floor constraints + scene.setShadowIntensity(AR_SHADOW_INTENSITY); + } + } + // Handle automatic scaling for world-space mode only during initial placement + if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone && this.goalScale !== pivot.scale.x) { + const newScale = this.scaleDamper.update(pivot.scale.x, this.goalScale, delta, 1); + pivot.scale.set(newScale, newScale, newScale); + } + scene.updateTarget(delta); + // Return the source so the caller can use it for camera-change events + return source; + } + updateYaw(scene, delta) { + // yaw must be updated last, since this also updates the shadow position. + quaternion.setFromAxisAngle(vector3$1.set(0, 1, 0), this.goalYaw); + const angle = scene.pivot.quaternion.angleTo(quaternion); + const angleStep = angle - this.yawDamper.update(angle, 0, delta, Math.PI); + scene.pivot.quaternion.rotateTowards(quaternion, angleStep); + } + updateMenuPanel(scene, box, delta) { + if (this.menuPanel) { + this.menuPanel.updateOpacity(delta); + this.menuPanel.updatePosition(scene.getCamera(), box); + } + } + applyXRInputToScene(delta) { + const scene = this.presentedScene; + const pivot = scene.pivot; + const box = this.placementBox; + this.updatePlacementBoxOpacity(box, delta); + this.updateTwoHandInteractionState(); + this.applyXRControllerRotations(pivot); + this.handleScalingInXR(scene, delta); + if (pivot.parent !== scene) { + // attached to controller instead + // when moving the model, the menu panel should disapear + this.updateMenuPanel(scene, box, delta); + return; + } + const source = this.updatePivotPosition(scene, delta); + this.updateYaw(scene, delta); + this.dispatchCameraChangeEvent(scene, source); + this.updateMenuPanel(scene, box, delta); + } + updatePlacementBoxOpacity(box, delta) { + // Use the new enhanced update method that includes distance scaling and visual state + const camera = this.presentedScene.getCamera(); + box.update(delta, camera.position); + // Update interaction state based on hover + const over1 = this.hover(this.xrController1); + const over2 = this.hover(this.xrController2); + const isHovered = (over1 || over2) && !this.isTwoHandInteraction; + // Set interaction state for visual feedback + box.setInteractionState(this.isTranslating || this.isRotating, isHovered); + } + updateTwoHandInteractionState() { + var _a, _b; + const bothSelected = ((_a = this.xrController1) === null || _a === void 0 ? void 0 : _a.userData.isSelected) && ((_b = this.xrController2) === null || _b === void 0 ? void 0 : _b.userData.isSelected); + this.isTwoHandInteraction = !!bothSelected; + } + applyXRControllerRotations(pivot) { + if (!this.isTwoHandInteraction) { + if (this.xrController1) + this.applyXRControllerRotation(this.xrController1, pivot); + if (this.xrController2) + this.applyXRControllerRotation(this.xrController2, pivot); + } + } + dispatchCameraChangeEvent(scene, source) { + scene.element.dispatchEvent(new CustomEvent('camera-change', { detail: { source } })); + } + updateXRControllerHover() { + const over1 = this.hover(this.xrController1); + const over2 = this.hover(this.xrController2); + const isHovered = (over1 || over2) && !this.isTwoHandInteraction; + // Use the new interaction state system + if (this.placementBox) { + this.placementBox.setInteractionState(this.isTranslating || this.isRotating, isHovered); + this.placementBox.show = isHovered; + } + } + /** + * Enable user interaction for world-space mode after initial automatic placement + */ + enableWorldSpaceUserInteraction() { + // Show placement box to indicate model can be moved + if (this.placementBox) { + this.placementBox.show = true; + } + // Enable shadow to show model is placed + if (this.presentedScene) { + this.presentedScene.setShadowIntensity(AR_SHADOW_INTENSITY); + } + } + handleFirstView(frame, time) { + // Skip moveToFloor for world-space mode after initial placement to prevent overriding + if (this.xrMode !== XRMode.WORLD_SPACE || !this.worldSpaceInitialPlacementDone) { + this.moveToAnchor(frame); + } + this.processInput(frame); + const delta = time - this.lastTick; + this.applyXRInputToScene(delta); + this.renderer.preRender(this.presentedScene, time, delta); + this.lastTick = time; + this.presentedScene.renderShadow(this.threeRenderer); + } + /** + * Only public to make it testable. + */ + onWebXRFrame(time, frame) { + if (this.xrMode !== XRMode.SCREEN_SPACE) { + this.updateXRControllerHover(); + } + this.frame = frame; + // increamenets a counter tracking how many frames have been processed sinces the session started + ++this.frames; + // refSpace and pose are used to get the user's current position and orientation in the XR session. + const refSpace = this.threeRenderer.xr.getReferenceSpace(); + const pose = frame.getViewerPose(refSpace); + // Tracking loss Detection. + // If pos is null, it means the XR system cannot currently track the user's position(e.g., the camera is covered or the env can't be recognized). + // Checks if we previously throught tracking was working + // Ensures that we don't report tracking loss too early(sometimes the first few frames can be null as the system initializes). + if (pose == null && this.tracking === true && this.frames > INIT_FRAMES) { + this.tracking = false; + this.dispatchEvent({ type: 'tracking', status: ARTracking.NOT_TRACKING }); + } + // Prevent rendering if there's no valid pose, no scene, or the scene isen't loaded. + const scene = this.presentedScene; + if (pose == null || scene == null || !scene.element.loaded) { + this.threeRenderer.clear(); + return; + } + // Tracking REcovery Detection. + // If tracking was previously lost, but now we have a valid pose, it meanse tracking has been recovered. + if (this.tracking === false) { + this.tracking = true; + this.dispatchEvent({ type: 'tracking', status: ARTracking.TRACKING }); + } + // WebXR may return multiple views, i.e. for headset AR. This + // isn't really supported at this point, but make a best-effort + // attempt to render other views also, using the first view + // as the main viewpoint. + let isFirstView = true; + for (const view of pose.views) { + this.updateView(view); + if (isFirstView) { + this.checkForDeferredCeilingPlacement(); + this.handleFirstView(frame, time); + isFirstView = false; + } + this.threeRenderer.render(scene, scene.getCamera()); + } + } + /** + * Calculate optimal scale and position for world-space AR presentation + * Similar to the SVXR:FrameModel approach for consistent model presentation + * + * This method implements automatic model framing for world-space AR sessions: + * 1. Calculates optimal viewing distance based on model size and minimum distance + * 2. Positions model at a drop angle below camera center for natural viewing + * 3. Automatically scales model to fit within viewport constraints + * 4. Ensures consistent presentation across different model sizes + * + * Note: This automatic placement only happens on the first session start. + * After initial placement, users have full control over model position, rotation, and scale. + */ + calculateWorldSpaceOptimalPlacement(scene, camera) { + // Get model bounding box half extents + const boundingBox = scene.boundingBox; + const halfExtent = { + x: (boundingBox.max.x - boundingBox.min.x) / 2, + y: (boundingBox.max.y - boundingBox.min.y) / 2, + z: (boundingBox.max.z - boundingBox.min.z) / 2 + }; + // Compute view distance (with extra padding for model-viewer) + const placementBoxPadding = PLACEMENT_BOX_EXTRA_PADDING; + const viewDistance = Math.max(MIN_WORLD_SPACE_DISTANCE + placementBoxPadding, 2 * Math.max(halfExtent.x, halfExtent.z) + placementBoxPadding); + // Compute ideal view position (drop angle below camera center) + const dropAngleRad = VIEW_DROP_DEGREES * Math.PI / 180; + const idealViewPosition = new Vector3(0, -viewDistance * Math.sin(dropAngleRad), -viewDistance * Math.cos(dropAngleRad)); + // Transform ideal view position to world space + const worldFromCamera = camera.matrixWorld; + const idealWorldPosition = idealViewPosition.clone().applyMatrix4(worldFromCamera); + // Compute turntable and vertical radii + const turntableRadius = Math.max(halfExtent.x, halfExtent.z) + placementBoxPadding; + const verticalRadius = halfExtent.y; + const turntableRadiusLimit = viewDistance * VIEW_RATIO; + const verticalRadiusLimit = viewDistance * VIEW_RATIO; + // Compute optimal scale + const verticalScale = verticalRadiusLimit / Math.max(verticalRadius, MIN_MODEL_SIZE); + const turntableScale = turntableRadiusLimit / Math.max(turntableRadius, MIN_MODEL_SIZE); + const optimalScale = Math.min(verticalScale, turntableScale); + // Offset so the model's base sits at the ideal world position + // (subtract scaled half height in Y) + const finalPosition = idealWorldPosition.clone().sub(new Vector3(0, optimalScale * halfExtent.y, 0)); + return { + position: finalPosition, + scale: optimalScale + }; + } + /** + * Calculate min/max scale for world-space AR, SVXR-style + */ + calculateWorldSpaceScaleLimits(scene) { + const size = scene.size; + const largestDimension = Math.max(size.x, size.y, size.z); + const smallestDimension = Math.max(Math.min(size.x, size.y, size.z), MODEL_SIZE_EPSILON); + const scaleMin = MIN_MODEL_SIZE / Math.max(largestDimension, MODEL_SIZE_EPSILON); + const scaleMax = MAX_MODEL_SIZE / Math.max(smallestDimension, MODEL_SIZE_EPSILON); + // Clamp to initial scale if needed + this.minScale = Math.min(scaleMin, scaleMax, this.goalScale); + this.maxScale = Math.max(scaleMin, scaleMax, this.goalScale); + } +} + +function clone( source ) { + + const sourceLookup = new Map(); + const cloneLookup = new Map(); + + const clone = source.clone(); + + parallelTraverse( source, clone, function ( sourceNode, clonedNode ) { + + sourceLookup.set( clonedNode, sourceNode ); + cloneLookup.set( sourceNode, clonedNode ); + + } ); + + clone.traverse( function ( node ) { + + if ( ! node.isSkinnedMesh ) return; + + const clonedMesh = node; + const sourceMesh = sourceLookup.get( node ); + const sourceBones = sourceMesh.skeleton.bones; + + clonedMesh.skeleton = sourceMesh.skeleton.clone(); + clonedMesh.bindMatrix.copy( sourceMesh.bindMatrix ); + + clonedMesh.skeleton.bones = sourceBones.map( function ( bone ) { + + return cloneLookup.get( bone ); + + } ); + + clonedMesh.bind( clonedMesh.skeleton, clonedMesh.bindMatrix ); + + } ); + + return clone; + +} + +function parallelTraverse( a, b, callback ) { + + callback( a, b ); + + for ( let i = 0; i < a.children.length; i ++ ) { + + parallelTraverse( a.children[ i ], b.children[ i ], callback ); + + } + +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $prepared = Symbol('prepared'); +const $prepare = Symbol('prepare'); +const $preparedGLTF = Symbol('preparedGLTF'); +const $clone = Symbol('clone'); +/** + * Represents the preparation and enhancement of the output of a Three.js + * GLTFLoader (a Three.js-flavor "GLTF"), to make it suitable for optimal, + * correct viewing in a given presentation context and also make the cloning + * process more explicit and legible. + * + * A GLTFInstance is API-compatible with a Three.js-flavor "GLTF", so it should + * be considered to be interchangeable with the loaded result of a GLTFLoader. + * + * This basic implementation only implements trivial preparation and enhancement + * of a GLTF. These operations are intended to be enhanced by inheriting + * classes. + */ +class GLTFInstance { + /** + * Prepares a given GLTF for presentation and future cloning. A GLTF that is + * prepared can safely have this method invoked on it multiple times; it will + * only be prepared once, including after being cloned. + */ + static prepare(source) { + if (source.scene == null) { + throw new Error('Model does not have a scene'); + } + if (source[$prepared]) { + return source; + } + const prepared = this[$prepare](source); + // NOTE: ES5 Symbol polyfill is not compatible with spread operator + // so {...prepared, [$prepared]: true} does not work + prepared[$prepared] = true; + return prepared; + } + /** + * Override in an inheriting class to apply specialty one-time preparations + * for a given input GLTF. + */ + static [$prepare](source) { + // TODO(#195,#1003): We don't currently support multiple scenes, so we don't + // bother preparing extra scenes for now: + const { scene } = source; + const scenes = [scene]; + return Object.assign(Object.assign({}, source), { scene, scenes }); + } + get parser() { + return this[$preparedGLTF].parser; + } + get animations() { + return this[$preparedGLTF].animations; + } + get scene() { + return this[$preparedGLTF].scene; + } + get scenes() { + return this[$preparedGLTF].scenes; + } + get cameras() { + return this[$preparedGLTF].cameras; + } + get asset() { + return this[$preparedGLTF].asset; + } + get userData() { + return this[$preparedGLTF].userData; + } + constructor(preparedGLTF) { + this[$preparedGLTF] = preparedGLTF; + } + /** + * Creates and returns a copy of this instance. + */ + clone() { + const GLTFInstanceConstructor = this.constructor; + const clonedGLTF = this[$clone](); + return new GLTFInstanceConstructor(clonedGLTF); + } + /** + * Cleans up any retained memory that might not otherwise be released when + * this instance is done being used. + */ + dispose() { + this.scenes.forEach((scene) => { + scene.traverse((object) => { + const mesh = object; + if (!mesh.material) { + return; + } + const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material]; + materials.forEach(material => { + // Explicitly dispose any textures assigned to this material + for (const propertyName in material) { + const texture = material[propertyName]; + if (texture instanceof Texture$1) { + const image = texture.source.data; + if (image.close != null) { + image.close(); + } + texture.dispose(); + } + } + material.dispose(); + }); + mesh.geometry.dispose(); + }); + }); + } + /** + * Override in an inheriting class to implement specialized cloning strategies + */ + [$clone]() { + const source = this[$preparedGLTF]; + // TODO(#195,#1003): We don't currently support multiple scenes, so we don't + // bother cloning extra scenes for now: + const scene = clone(this.scene); + cloneVariantMaterials(scene, this.scene); + const scenes = [scene]; + const userData = source.userData ? Object.assign({}, source.userData) : {}; + return Object.assign(Object.assign({}, source), { scene, scenes, userData }); + } +} +// Variant materials and original material instances are stored under +// object.userData.variantMaterials/originalMaterial. +// Three.js Object3D.clone() doesn't clone Three.js objects under +// .userData so this function is a workaround. +const cloneVariantMaterials = (dst, src) => { + traversePair(dst, src, (dst, src) => { + if (src.userData.variantMaterials !== undefined) { + dst.userData.variantMaterials = new Map(src.userData.variantMaterials); + } + if (src.userData.variantData !== undefined) { + dst.userData.variantData = src.userData.variantData; + } + if (src.userData.originalMaterial !== undefined) { + dst.userData.originalMaterial = src.userData.originalMaterial; + } + }); +}; +const traversePair = (obj1, obj2, callback) => { + callback(obj1, obj2); + // Assume obj1 and obj2 have the same tree structure + for (let i = 0; i < obj1.children.length; i++) { + traversePair(obj1.children[i], obj2.children[i], callback); + } +}; + +const $threeGLTF = Symbol('threeGLTF'); +const $gltf = Symbol('gltf'); +const $gltfElementMap = Symbol('gltfElementMap'); +const $threeObjectMap = Symbol('threeObjectMap'); +const $parallelTraverseThreeScene = Symbol('parallelTraverseThreeScene'); +const $correlateOriginalThreeGLTF = Symbol('correlateOriginalThreeGLTF'); +const $correlateCloneThreeGLTF = Symbol('correlateCloneThreeGLTF'); +/** + * The Three.js GLTFLoader provides us with an in-memory representation + * of a glTF in terms of Three.js constructs. It also provides us with a copy + * of the deserialized glTF without any Three.js decoration, and a mapping of + * glTF elements to their corresponding Three.js constructs. + * + * A CorrelatedSceneGraph exposes a synchronously available mapping of glTF + * element references to their corresponding Three.js constructs. + */ +class CorrelatedSceneGraph { + /** + * Produce a CorrelatedSceneGraph from a naturally generated Three.js GLTF. + * Such GLTFs are produced by Three.js' GLTFLoader, and contain cached + * details that expedite the correlation step. + * + * If a CorrelatedSceneGraph is provided as the second argument, re-correlates + * a cloned Three.js GLTF with a clone of the glTF hierarchy used to produce + * the upstream Three.js GLTF that the clone was created from. The result + * CorrelatedSceneGraph is representative of the cloned hierarchy. + */ + static from(threeGLTF, upstreamCorrelatedSceneGraph) { + if (upstreamCorrelatedSceneGraph != null) { + return this[$correlateCloneThreeGLTF](threeGLTF, upstreamCorrelatedSceneGraph); + } + else { + return this[$correlateOriginalThreeGLTF](threeGLTF); + } + } + static [$correlateOriginalThreeGLTF](threeGLTF) { + const gltf = threeGLTF.parser.json; + const associations = threeGLTF.parser.associations; + const gltfElementMap = new Map(); + const defaultMaterial = { name: 'Default' }; + const defaultReference = { index: -1 }; + for (const threeMaterial of associations.keys()) { + // Note: GLTFLoader creates a "default" material that has no + // corresponding glTF element in the case that no materials are + // specified in the source glTF. In this case we append a default + // material to allow this to be operated upon. + if (threeMaterial instanceof Material$1 && + associations.get(threeMaterial) == null) { + if (defaultReference.index < 0) { + if (gltf.materials == null) { + gltf.materials = []; + } + defaultReference.index = gltf.materials.length; + gltf.materials.push(defaultMaterial); + } + threeMaterial.name = defaultMaterial.name; + associations.set(threeMaterial, { materials: defaultReference.index }); + } + } + // Creates a reverse look up map (gltf-object to Three-object) + for (const [threeObject, gltfMappings] of associations) { + if (gltfMappings) { + threeObject.userData = threeObject.userData || {}; + threeObject.userData.associations = gltfMappings; + } + for (const mapping in gltfMappings) { + if (mapping != null && mapping !== 'primitives') { + const type = mapping; + const elementArray = gltf[type] || []; + const gltfElement = elementArray[gltfMappings[type]]; + if (gltfElement == null) { + // TODO: Maybe throw here... + continue; + } + let threeObjects = gltfElementMap.get(gltfElement); + if (threeObjects == null) { + threeObjects = new Set(); + gltfElementMap.set(gltfElement, threeObjects); + } + threeObjects.add(threeObject); + } + } + } + return new CorrelatedSceneGraph(threeGLTF, gltf, associations, gltfElementMap); + } + /** + * Transfers the association between a raw glTF and a Three.js scene graph + * to a clone of the Three.js scene graph, resolved as a new + * CorrelatedSceneGraph instance. + */ + static [$correlateCloneThreeGLTF](cloneThreeGLTF, upstreamCorrelatedSceneGraph) { + const originalThreeGLTF = upstreamCorrelatedSceneGraph.threeGLTF; + const originalGLTF = upstreamCorrelatedSceneGraph.gltf; + const cloneGLTF = JSON.parse(JSON.stringify(originalGLTF)); + const cloneThreeObjectMap = new Map(); + const cloneGLTFElementMap = new Map(); + for (let i = 0; i < originalThreeGLTF.scenes.length; i++) { + this[$parallelTraverseThreeScene](originalThreeGLTF.scenes[i], cloneThreeGLTF.scenes[i], (object, cloneObject) => { + const elementReference = upstreamCorrelatedSceneGraph.threeObjectMap.get(object); + if (elementReference == null) { + return; + } + for (const mapping in elementReference) { + if (mapping != null && mapping !== 'primitives') { + const type = mapping; + const index = elementReference[type]; + const cloneElement = cloneGLTF[type][index]; + const mappings = cloneThreeObjectMap.get(cloneObject) || {}; + mappings[type] = index; + cloneThreeObjectMap.set(cloneObject, mappings); + const cloneObjects = cloneGLTFElementMap.get(cloneElement) || new Set(); + cloneObjects.add(cloneObject); + cloneGLTFElementMap.set(cloneElement, cloneObjects); + } + } + }); + } + return new CorrelatedSceneGraph(cloneThreeGLTF, cloneGLTF, cloneThreeObjectMap, cloneGLTFElementMap); + } + /** + * Traverses two presumably identical Three.js scenes, and invokes a + * callback for each Object3D or Material encountered, including the initial + * scene. Adapted from + * https://github.com/mrdoob/three.js/blob/7c1424c5819ab622a346dd630ee4e6431388021e/examples/jsm/utils/SkeletonUtils.js#L586-L596 + */ + static [$parallelTraverseThreeScene](sceneOne, sceneTwo, callback) { + const traverse = (a, b) => { + callback(a, b); + if (a.isObject3D) { + const meshA = a; + const meshB = b; + if (meshA.material) { + if (Array.isArray(meshA.material)) { + for (let i = 0; i < meshA.material.length; ++i) { + callback(meshA.material[i], meshB.material[i]); + } + } + else { + callback(meshA.material, meshB.material); + } + } + for (let i = 0; i < a.children.length; ++i) { + traverse(a.children[i], b.children[i]); + } + } + }; + traverse(sceneOne, sceneTwo); + } + /** + * The source Three.js GLTF result given to us by a Three.js GLTFLoader. + */ + get threeGLTF() { + return this[$threeGLTF]; + } + /** + * The in-memory deserialized source glTF. + */ + get gltf() { + return this[$gltf]; + } + /** + * A Map of glTF element references to arrays of corresponding Three.js + * object references. Three.js objects are kept in arrays to account for + * cases where more than one Three.js object corresponds to a single glTF + * element. + */ + get gltfElementMap() { + return this[$gltfElementMap]; + } + /** + * A map of individual Three.js objects to corresponding elements in the + * source glTF. + */ + get threeObjectMap() { + return this[$threeObjectMap]; + } + constructor(threeGLTF, gltf, threeObjectMap, gltfElementMap) { + this[$threeGLTF] = threeGLTF; + this[$gltf] = gltf; + this[$gltfElementMap] = gltfElementMap; + this[$threeObjectMap] = threeObjectMap; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $correlatedSceneGraph = Symbol('correlatedSceneGraph'); +/** + * This specialization of GLTFInstance collects all of the processing needed + * to prepare a model and to clone it making special considerations for + * use cases. + */ +class ModelViewerGLTFInstance extends GLTFInstance { + /** + * @override + */ + static [$prepare](source) { + const prepared = super[$prepare](source); + if (prepared[$correlatedSceneGraph] == null) { + prepared[$correlatedSceneGraph] = CorrelatedSceneGraph.from(prepared); + } + const { scene } = prepared; + const nullSphere = new Sphere(undefined, Infinity); + scene.traverse((node) => { + // Set a high renderOrder while we're here to ensure the model + // always renders on top of the sky sphere + node.renderOrder = 1000; + // Three.js seems to cull some animated models incorrectly. Since we + // expect to view our whole scene anyway, we turn off the frustum + // culling optimization here. + node.frustumCulled = false; + // Animations for objects without names target their UUID instead. When + // objects are cloned, they get new UUIDs which the animation can't + // find. To fix this, we assign their UUID as their name. + if (!node.name) { + node.name = node.uuid; + } + const mesh = node; + if (mesh.material) { + const { geometry } = mesh; + mesh.castShadow = true; + if (mesh.isSkinnedMesh) { + // Akin to disabling frustum culling above, we have to also manually + // disable the bounds to make raycasting correct for skinned meshes. + geometry.boundingSphere = nullSphere; + // The bounding box is set in GLTFLoader by the accessor bounds, which + // are not updated with animation. + geometry.boundingBox = null; + } + const material = mesh.material; + if (material.isMeshBasicMaterial === true) { + material.toneMapped = false; + } + // This makes shadows better for non-manifold meshes + material.shadowSide = FrontSide; + // Fixes an edge case with unused extra UV-coords being incorrectly + // referenced by three.js; remove when + // https://github.com/mrdoob/three.js/pull/23974 is merged. + if (material.aoMap) { + const { gltf, threeObjectMap } = prepared[$correlatedSceneGraph]; + const gltfRef = threeObjectMap.get(material); + if (gltf.materials != null && gltfRef != null && + gltfRef.materials != null) { + const gltfMaterial = gltf.materials[gltfRef.materials]; + if (gltfMaterial.occlusionTexture && + gltfMaterial.occlusionTexture.texCoord === 0 && + geometry.attributes.uv != null) { + geometry.setAttribute('uv2', geometry.attributes.uv); + } + } + } + } + }); + return prepared; + } + get correlatedSceneGraph() { + return this[$preparedGLTF][$correlatedSceneGraph]; + } + /** + * @override + */ + [$clone]() { + const clone = super[$clone](); + const sourceUUIDToClonedMaterial = new Map(); + clone.scene.traverse((node) => { + // Materials aren't cloned when cloning meshes; geometry + // and materials are copied by reference. This is necessary + // for the same model to be used twice with different + // scene-graph operations. + const mesh = node; + if (mesh.material) { + const material = mesh.material; + if (material != null) { + if (sourceUUIDToClonedMaterial.has(material.uuid)) { + mesh.material = sourceUUIDToClonedMaterial.get(material.uuid); + return; + } + mesh.material = material.clone(); + sourceUUIDToClonedMaterial.set(material.uuid, mesh.material); + } + } + const light = node; + if (light.target !== undefined) { + // The target's parent is lost in the cloning process, but in + // GLTFLoader, all light targets are children of their light. + light.add(light.target); + } + }); + // Cross-correlate the scene graph by relying on information in the + // current scene graph; without this step, relationships between the + // Three.js object graph and the glTF scene graph will be lost. + clone[$correlatedSceneGraph] = + CorrelatedSceneGraph.from(clone, this.correlatedSceneGraph); + return clone; + } +} + +/** + * @monogrid/gainmap-js v3.1.0 + * With ❤️, by MONOGRID + */ + + +const getBufferForType = (type, width, height) => { + let out; + switch (type) { + case UnsignedByteType: + out = new Uint8ClampedArray(width * height * 4); + break; + case HalfFloatType: + out = new Uint16Array(width * height * 4); + break; + case UnsignedIntType: + out = new Uint32Array(width * height * 4); + break; + case ByteType: + out = new Int8Array(width * height * 4); + break; + case ShortType: + out = new Int16Array(width * height * 4); + break; + case IntType: + out = new Int32Array(width * height * 4); + break; + case FloatType: + out = new Float32Array(width * height * 4); + break; + default: + throw new Error('Unsupported data type'); + } + return out; +}; +let _canReadPixelsResult; +/** + * Test if this browser implementation can correctly read pixels from the specified + * Render target type. + * + * Runs only once + * + * @param type + * @param renderer + * @param camera + * @param renderTargetOptions + * @returns + */ +const canReadPixels = (type, renderer, camera, renderTargetOptions) => { + if (_canReadPixelsResult !== undefined) + return _canReadPixelsResult; + const testRT = new WebGLRenderTarget(1, 1, renderTargetOptions); + renderer.setRenderTarget(testRT); + const mesh = new Mesh(new PlaneGeometry(), new MeshBasicMaterial({ color: 0xffffff })); + renderer.render(mesh, camera); + renderer.setRenderTarget(null); + const out = getBufferForType(type, testRT.width, testRT.height); + renderer.readRenderTargetPixels(testRT, 0, 0, testRT.width, testRT.height, out); + testRT.dispose(); + mesh.geometry.dispose(); + mesh.material.dispose(); + _canReadPixelsResult = out[0] !== 0; + return _canReadPixelsResult; +}; +/** + * Utility class used for rendering a texture with a material + * + * @category Core + * @group Core + */ +class QuadRenderer { + /** + * Constructs a new QuadRenderer + * + * @param options Parameters for this QuadRenderer + */ + constructor(options) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; + this._rendererIsDisposable = false; + this._supportsReadPixels = true; + /** + * Renders the input texture using the specified material + */ + this.render = () => { + this._renderer.setRenderTarget(this._renderTarget); + try { + this._renderer.render(this._scene, this._camera); + } + catch (e) { + this._renderer.setRenderTarget(null); + throw e; + } + this._renderer.setRenderTarget(null); + }; + this._width = options.width; + this._height = options.height; + this._type = options.type; + this._colorSpace = options.colorSpace; + const rtOptions = { + // fixed options + format: RGBAFormat, + depthBuffer: false, + stencilBuffer: false, + // user options + type: this._type, // set in class property + colorSpace: this._colorSpace, // set in class property + anisotropy: ((_a = options.renderTargetOptions) === null || _a === void 0 ? void 0 : _a.anisotropy) !== undefined ? (_b = options.renderTargetOptions) === null || _b === void 0 ? void 0 : _b.anisotropy : 1, + generateMipmaps: ((_c = options.renderTargetOptions) === null || _c === void 0 ? void 0 : _c.generateMipmaps) !== undefined ? (_d = options.renderTargetOptions) === null || _d === void 0 ? void 0 : _d.generateMipmaps : false, + magFilter: ((_e = options.renderTargetOptions) === null || _e === void 0 ? void 0 : _e.magFilter) !== undefined ? (_f = options.renderTargetOptions) === null || _f === void 0 ? void 0 : _f.magFilter : LinearFilter, + minFilter: ((_g = options.renderTargetOptions) === null || _g === void 0 ? void 0 : _g.minFilter) !== undefined ? (_h = options.renderTargetOptions) === null || _h === void 0 ? void 0 : _h.minFilter : LinearFilter, + samples: ((_j = options.renderTargetOptions) === null || _j === void 0 ? void 0 : _j.samples) !== undefined ? (_k = options.renderTargetOptions) === null || _k === void 0 ? void 0 : _k.samples : undefined, + wrapS: ((_l = options.renderTargetOptions) === null || _l === void 0 ? void 0 : _l.wrapS) !== undefined ? (_m = options.renderTargetOptions) === null || _m === void 0 ? void 0 : _m.wrapS : ClampToEdgeWrapping, + wrapT: ((_o = options.renderTargetOptions) === null || _o === void 0 ? void 0 : _o.wrapT) !== undefined ? (_p = options.renderTargetOptions) === null || _p === void 0 ? void 0 : _p.wrapT : ClampToEdgeWrapping + }; + this._material = options.material; + if (options.renderer) { + this._renderer = options.renderer; + } + else { + this._renderer = QuadRenderer.instantiateRenderer(); + this._rendererIsDisposable = true; + } + this._scene = new Scene(); + this._camera = new OrthographicCamera(); + this._camera.position.set(0, 0, 10); + this._camera.left = -0.5; + this._camera.right = 0.5; + this._camera.top = 0.5; + this._camera.bottom = -0.5; + this._camera.updateProjectionMatrix(); + if (!canReadPixels(this._type, this._renderer, this._camera, rtOptions)) { + let alternativeType; + switch (this._type) { + case HalfFloatType: + alternativeType = this._renderer.extensions.has('EXT_color_buffer_float') ? FloatType : undefined; + break; + } + if (alternativeType !== undefined) { + console.warn(`This browser does not support reading pixels from ${this._type} RenderTargets, switching to ${FloatType}`); + this._type = alternativeType; + } + else { + this._supportsReadPixels = false; + console.warn('This browser dos not support toArray or toDataTexture, calls to those methods will result in an error thrown'); + } + } + this._quad = new Mesh(new PlaneGeometry(), this._material); + this._quad.geometry.computeBoundingBox(); + this._scene.add(this._quad); + this._renderTarget = new WebGLRenderTarget(this.width, this.height, rtOptions); + this._renderTarget.texture.mapping = ((_q = options.renderTargetOptions) === null || _q === void 0 ? void 0 : _q.mapping) !== undefined ? (_r = options.renderTargetOptions) === null || _r === void 0 ? void 0 : _r.mapping : UVMapping; + } + /** + * Instantiates a temporary renderer + * + * @returns + */ + static instantiateRenderer() { + const renderer = new WebGLRenderer(); + renderer.setSize(128, 128); + // renderer.outputColorSpace = SRGBColorSpace + // renderer.toneMapping = LinearToneMapping + // renderer.debug.checkShaderErrors = false + // this._rendererIsDisposable = true + return renderer; + } + /** + * Obtains a Buffer containing the rendered texture. + * + * @throws Error if the browser cannot read pixels from this RenderTarget type. + * @returns a TypedArray containing RGBA values from this renderer + */ + toArray() { + if (!this._supportsReadPixels) + throw new Error('Can\'t read pixels in this browser'); + const out = getBufferForType(this._type, this._width, this._height); + this._renderer.readRenderTargetPixels(this._renderTarget, 0, 0, this._width, this._height, out); + return out; + } + /** + * Performs a readPixel operation in the renderTarget + * and returns a DataTexture containing the read data + * + * @param options options + * @returns + */ + toDataTexture(options) { + const returnValue = new DataTexture( + // fixed values + this.toArray(), this.width, this.height, RGBAFormat, this._type, + // user values + (options === null || options === void 0 ? void 0 : options.mapping) || UVMapping, (options === null || options === void 0 ? void 0 : options.wrapS) || ClampToEdgeWrapping, (options === null || options === void 0 ? void 0 : options.wrapT) || ClampToEdgeWrapping, (options === null || options === void 0 ? void 0 : options.magFilter) || LinearFilter, (options === null || options === void 0 ? void 0 : options.minFilter) || LinearFilter, (options === null || options === void 0 ? void 0 : options.anisotropy) || 1, + // fixed value + LinearSRGBColorSpace); + // set this afterwards, we can't set it in constructor + returnValue.generateMipmaps = (options === null || options === void 0 ? void 0 : options.generateMipmaps) !== undefined ? options === null || options === void 0 ? void 0 : options.generateMipmaps : false; + return returnValue; + } + /** + * If using a disposable renderer, it will dispose it. + */ + disposeOnDemandRenderer() { + this._renderer.setRenderTarget(null); + if (this._rendererIsDisposable) { + this._renderer.dispose(); + this._renderer.forceContextLoss(); + } + } + /** + * Will dispose of **all** assets used by this renderer. + * + * + * @param disposeRenderTarget will dispose of the renderTarget which will not be usable later + * set this to true if you passed the `renderTarget.texture` to a `PMREMGenerator` + * or are otherwise done with it. + * + * @example + * ```js + * const loader = new HDRJPGLoader(renderer) + * const result = await loader.loadAsync('gainmap.jpeg') + * const mesh = new Mesh(geometry, new MeshBasicMaterial({ map: result.renderTarget.texture }) ) + * // DO NOT dispose the renderTarget here, + * // it is used directly in the material + * result.dispose() + * ``` + * + * @example + * ```js + * const loader = new HDRJPGLoader(renderer) + * const pmremGenerator = new PMREMGenerator( renderer ); + * const result = await loader.loadAsync('gainmap.jpeg') + * const envMap = pmremGenerator.fromEquirectangular(result.renderTarget.texture) + * const mesh = new Mesh(geometry, new MeshStandardMaterial({ envMap }) ) + * // renderTarget can be disposed here + * // because it was used to generate a PMREM texture + * result.dispose(true) + * ``` + */ + dispose(disposeRenderTarget) { + this.disposeOnDemandRenderer(); + if (disposeRenderTarget) { + this.renderTarget.dispose(); + } + // dispose shader material texture uniforms + if (this.material instanceof ShaderMaterial) { + Object.values(this.material.uniforms).forEach(v => { + if (v.value instanceof Texture$1) + v.value.dispose(); + }); + } + // dispose other material properties + Object.values(this.material).forEach(value => { + if (value instanceof Texture$1) + value.dispose(); + }); + this.material.dispose(); + this._quad.geometry.dispose(); + } + /** + * Width of the texture + */ + get width() { return this._width; } + set width(value) { + this._width = value; + this._renderTarget.setSize(this._width, this._height); + } + /** + * Height of the texture + */ + get height() { return this._height; } + set height(value) { + this._height = value; + this._renderTarget.setSize(this._width, this._height); + } + /** + * The renderer used + */ + get renderer() { return this._renderer; } + /** + * The `WebGLRenderTarget` used. + */ + get renderTarget() { return this._renderTarget; } + set renderTarget(value) { + this._renderTarget = value; + this._width = value.width; + this._height = value.height; + // this._type = value.texture.type + } + /** + * The `Material` used. + */ + get material() { return this._material; } + /** + * + */ + get type() { return this._type; } + get colorSpace() { return this._colorSpace; } +} + +/** + * @monogrid/gainmap-js v3.1.0 + * With ❤️, by MONOGRID + */ + + +const vertexShader = /* glsl */ ` +varying vec2 vUv; + +void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); +} +`; +const fragmentShader = /* glsl */ ` +// min half float value +#define HALF_FLOAT_MIN vec3( -65504, -65504, -65504 ) +// max half float value +#define HALF_FLOAT_MAX vec3( 65504, 65504, 65504 ) + +uniform sampler2D sdr; +uniform sampler2D gainMap; +uniform vec3 gamma; +uniform vec3 offsetHdr; +uniform vec3 offsetSdr; +uniform vec3 gainMapMin; +uniform vec3 gainMapMax; +uniform float weightFactor; + +varying vec2 vUv; + +void main() { + vec3 rgb = texture2D( sdr, vUv ).rgb; + vec3 recovery = texture2D( gainMap, vUv ).rgb; + vec3 logRecovery = pow( recovery, gamma ); + vec3 logBoost = gainMapMin * ( 1.0 - logRecovery ) + gainMapMax * logRecovery; + vec3 hdrColor = (rgb + offsetSdr) * exp2( logBoost * weightFactor ) - offsetHdr; + vec3 clampedHdrColor = max( HALF_FLOAT_MIN, min( HALF_FLOAT_MAX, hdrColor )); + gl_FragColor = vec4( clampedHdrColor , 1.0 ); +} +`; +/** + * A Material which is able to decode the Gainmap into a full HDR Representation + * + * @category Materials + * @group Materials + */ +class GainMapDecoderMaterial extends ShaderMaterial { + /** + * + * @param params + */ + constructor({ gamma, offsetHdr, offsetSdr, gainMapMin, gainMapMax, maxDisplayBoost, hdrCapacityMin, hdrCapacityMax, sdr, gainMap }) { + super({ + name: 'GainMapDecoderMaterial', + vertexShader, + fragmentShader, + uniforms: { + sdr: { value: sdr }, + gainMap: { value: gainMap }, + gamma: { value: new Vector3(1.0 / gamma[0], 1.0 / gamma[1], 1.0 / gamma[2]) }, + offsetHdr: { value: new Vector3().fromArray(offsetHdr) }, + offsetSdr: { value: new Vector3().fromArray(offsetSdr) }, + gainMapMin: { value: new Vector3().fromArray(gainMapMin) }, + gainMapMax: { value: new Vector3().fromArray(gainMapMax) }, + weightFactor: { + value: (Math.log2(maxDisplayBoost) - hdrCapacityMin) / (hdrCapacityMax - hdrCapacityMin) + } + }, + blending: NoBlending, + depthTest: false, + depthWrite: false + }); + this._maxDisplayBoost = maxDisplayBoost; + this._hdrCapacityMin = hdrCapacityMin; + this._hdrCapacityMax = hdrCapacityMax; + this.needsUpdate = true; + this.uniformsNeedUpdate = true; + } + get sdr() { return this.uniforms.sdr.value; } + set sdr(value) { this.uniforms.sdr.value = value; } + get gainMap() { return this.uniforms.gainMap.value; } + set gainMap(value) { this.uniforms.gainMap.value = value; } + /** + * @see {@link GainMapMetadata.offsetHdr} + */ + get offsetHdr() { return this.uniforms.offsetHdr.value.toArray(); } + set offsetHdr(value) { this.uniforms.offsetHdr.value.fromArray(value); } + /** + * @see {@link GainMapMetadata.offsetSdr} + */ + get offsetSdr() { return this.uniforms.offsetSdr.value.toArray(); } + set offsetSdr(value) { this.uniforms.offsetSdr.value.fromArray(value); } + /** + * @see {@link GainMapMetadata.gainMapMin} + */ + get gainMapMin() { return this.uniforms.gainMapMin.value.toArray(); } + set gainMapMin(value) { this.uniforms.gainMapMin.value.fromArray(value); } + /** + * @see {@link GainMapMetadata.gainMapMax} + */ + get gainMapMax() { return this.uniforms.gainMapMax.value.toArray(); } + set gainMapMax(value) { this.uniforms.gainMapMax.value.fromArray(value); } + /** + * @see {@link GainMapMetadata.gamma} + */ + get gamma() { + const g = this.uniforms.gamma.value; + return [1 / g.x, 1 / g.y, 1 / g.z]; + } + set gamma(value) { + const g = this.uniforms.gamma.value; + g.x = 1.0 / value[0]; + g.y = 1.0 / value[1]; + g.z = 1.0 / value[2]; + } + /** + * @see {@link GainMapMetadata.hdrCapacityMin} + * @remarks Logarithmic space + */ + get hdrCapacityMin() { return this._hdrCapacityMin; } + set hdrCapacityMin(value) { + this._hdrCapacityMin = value; + this.calculateWeight(); + } + /** + * @see {@link GainMapMetadata.hdrCapacityMin} + * @remarks Logarithmic space + */ + get hdrCapacityMax() { return this._hdrCapacityMax; } + set hdrCapacityMax(value) { + this._hdrCapacityMax = value; + this.calculateWeight(); + } + /** + * @see {@link GainmapDecodingParameters.maxDisplayBoost} + * @remarks Non Logarithmic space + */ + get maxDisplayBoost() { return this._maxDisplayBoost; } + set maxDisplayBoost(value) { + this._maxDisplayBoost = Math.max(1, Math.min(65504, value)); + this.calculateWeight(); + } + calculateWeight() { + const val = (Math.log2(this._maxDisplayBoost) - this._hdrCapacityMin) / (this._hdrCapacityMax - this._hdrCapacityMin); + this.uniforms.weightFactor.value = Math.max(0, Math.min(1, val)); + } +} + +class GainMapNotFoundError extends Error { +} + +class XMPMetadataNotFoundError extends Error { +} + +const getXMLValue = (xml, tag, defaultValue) => { + // Check for attribute format first: tag="value" + const attributeMatch = new RegExp(`${tag}="([^"]*)"`, 'i').exec(xml); + if (attributeMatch) + return attributeMatch[1]; + // Check for tag format: value or value... + const tagMatch = new RegExp(`<${tag}[^>]*>([\\s\\S]*?)`, 'i').exec(xml); + if (tagMatch) { + // Check if it contains rdf:li elements + const liValues = tagMatch[1].match(/([^<]*)<\/rdf:li>/g); + if (liValues && liValues.length === 3) { + return liValues.map(v => v.replace(/<\/?rdf:li>/g, '')); + } + return tagMatch[1].trim(); + } + if (defaultValue !== undefined) + return defaultValue; + throw new Error(`Can't find ${tag} in gainmap metadata`); +}; +const extractXMP = (input) => { + let str; + // support node test environment + if (typeof TextDecoder !== 'undefined') + str = new TextDecoder().decode(input); + else + str = input.toString(); + let start = str.indexOf('', start); + const xmpBlock = str.slice(start, end + 10); + try { + const gainMapMin = getXMLValue(xmpBlock, 'hdrgm:GainMapMin', '0'); + const gainMapMax = getXMLValue(xmpBlock, 'hdrgm:GainMapMax'); + const gamma = getXMLValue(xmpBlock, 'hdrgm:Gamma', '1'); + const offsetSDR = getXMLValue(xmpBlock, 'hdrgm:OffsetSDR', '0.015625'); + const offsetHDR = getXMLValue(xmpBlock, 'hdrgm:OffsetHDR', '0.015625'); + // These are always attributes, so we can use a simpler regex + const hdrCapacityMinMatch = /hdrgm:HDRCapacityMin="([^"]*)"/.exec(xmpBlock); + const hdrCapacityMin = hdrCapacityMinMatch ? hdrCapacityMinMatch[1] : '0'; + const hdrCapacityMaxMatch = /hdrgm:HDRCapacityMax="([^"]*)"/.exec(xmpBlock); + if (!hdrCapacityMaxMatch) + throw new Error('Incomplete gainmap metadata'); + const hdrCapacityMax = hdrCapacityMaxMatch[1]; + return { + gainMapMin: Array.isArray(gainMapMin) ? gainMapMin.map(v => parseFloat(v)) : [parseFloat(gainMapMin), parseFloat(gainMapMin), parseFloat(gainMapMin)], + gainMapMax: Array.isArray(gainMapMax) ? gainMapMax.map(v => parseFloat(v)) : [parseFloat(gainMapMax), parseFloat(gainMapMax), parseFloat(gainMapMax)], + gamma: Array.isArray(gamma) ? gamma.map(v => parseFloat(v)) : [parseFloat(gamma), parseFloat(gamma), parseFloat(gamma)], + offsetSdr: Array.isArray(offsetSDR) ? offsetSDR.map(v => parseFloat(v)) : [parseFloat(offsetSDR), parseFloat(offsetSDR), parseFloat(offsetSDR)], + offsetHdr: Array.isArray(offsetHDR) ? offsetHDR.map(v => parseFloat(v)) : [parseFloat(offsetHDR), parseFloat(offsetHDR), parseFloat(offsetHDR)], + hdrCapacityMin: parseFloat(hdrCapacityMin), + hdrCapacityMax: parseFloat(hdrCapacityMax) + }; + } + catch (e) { + // Continue searching for another xmpmeta block if this one fails + } + start = str.indexOf(' { + const debug = this.options.debug; + const dataView = new DataView(imageArrayBuffer.buffer); + // If you're executing this line on a big endian machine, it'll be reversed. + // bigEnd further down though, refers to the endianness of the image itself. + if (dataView.getUint16(0) !== 0xffd8) { + reject(new Error('Not a valid jpeg')); + return; + } + const length = dataView.byteLength; + let offset = 2; + let loops = 0; + let marker; // APP# marker + while (offset < length) { + if (++loops > 250) { + reject(new Error(`Found no marker after ${loops} loops 😵`)); + return; + } + if (dataView.getUint8(offset) !== 0xff) { + reject(new Error(`Not a valid marker at offset 0x${offset.toString(16)}, found: 0x${dataView.getUint8(offset).toString(16)}`)); + return; + } + marker = dataView.getUint8(offset + 1); + if (debug) + console.log(`Marker: ${marker.toString(16)}`); + if (marker === 0xe2) { + if (debug) + console.log('Found APP2 marker (0xffe2)'); + // Works for iPhone 8 Plus, X, and XSMax. Or any photos of MPF format. + // Great way to visualize image information in html is using Exiftool. E.g.: + // ./exiftool.exe -htmldump -wantTrailer photo.jpg > photo.html + const formatPt = offset + 4; + /* + * Structure of the MP Format Identifier + * + * Offset Addr. | Code (Hex) | Description + * +00 ff Marker Prefix <-- offset + * +01 e2 APP2 + * +02 #n APP2 Field Length + * +03 #n APP2 Field Length + * +04 4d 'M' <-- formatPt + * +05 50 'P' + * +06 46 'F' + * +07 00 NULL + * <-- tiffOffset + */ + if (dataView.getUint32(formatPt) === 0x4d504600) { + // Found MPF tag, so we start dig out sub images + const tiffOffset = formatPt + 4; + let bigEnd; // Endianness from TIFF header + // Test for TIFF validity and endianness + // 0x4949 and 0x4D4D ('II' and 'MM') marks Little Endian and Big Endian + if (dataView.getUint16(tiffOffset) === 0x4949) { + bigEnd = false; + } + else if (dataView.getUint16(tiffOffset) === 0x4d4d) { + bigEnd = true; + } + else { + reject(new Error('No valid endianness marker found in TIFF header')); + return; + } + if (dataView.getUint16(tiffOffset + 2, !bigEnd) !== 0x002a) { + reject(new Error('Not valid TIFF data! (no 0x002A marker)')); + return; + } + // 32 bit number stating the offset from the start of the 8 Byte MP Header + // to MP Index IFD Least possible value is thus 8 (means 0 offset) + const firstIFDOffset = dataView.getUint32(tiffOffset + 4, !bigEnd); + if (firstIFDOffset < 0x00000008) { + reject(new Error('Not valid TIFF data! (First offset less than 8)')); + return; + } + // Move ahead to MP Index IFD + // Assume we're at the first IFD, so firstIFDOffset points to + // MP Index IFD and not MP Attributes IFD. (If we try extract from a sub image, + // we fail silently here due to this assumption) + // Count (2 Byte) | MP Index Fields a.k.a. MP Entries (count * 12 Byte) | Offset of Next IFD (4 Byte) + const dirStart = tiffOffset + firstIFDOffset; // Start of IFD (Image File Directory) + const count = dataView.getUint16(dirStart, !bigEnd); // Count of MPEntries (2 Byte) + // Extract info from MPEntries (starting after Count) + const entriesStart = dirStart + 2; + let numberOfImages = 0; + for (let i = entriesStart; i < entriesStart + 12 * count; i += 12) { + // Each entry is 12 Bytes long + // Check MP Index IFD tags, here we only take tag 0xb001 = Number of images + if (dataView.getUint16(i, !bigEnd) === 0xb001) { + // stored in Last 4 bytes of its 12 Byte entry. + numberOfImages = dataView.getUint32(i + 8, !bigEnd); + } + } + const nextIFDOffsetLen = 4; // 4 Byte offset field that appears after MP Index IFD tags + const MPImageListValPt = dirStart + 2 + count * 12 + nextIFDOffsetLen; + const images = []; + for (let i = MPImageListValPt; i < MPImageListValPt + numberOfImages * 16; i += 16) { + const image = { + MPType: dataView.getUint32(i, !bigEnd), + size: dataView.getUint32(i + 4, !bigEnd), + // This offset is specified relative to the address of the MP Endian + // field in the MP Header, unless the image is a First Individual Image, + // in which case the value of the offset shall be NULL (0x00000000). + dataOffset: dataView.getUint32(i + 8, !bigEnd), + dependantImages: dataView.getUint32(i + 12, !bigEnd), + start: -1, + end: -1, + isFII: false + }; + if (!image.dataOffset) { + // dataOffset is 0x00000000 for First Individual Image + image.start = 0; + image.isFII = true; + } + else { + image.start = tiffOffset + image.dataOffset; + image.isFII = false; + } + image.end = image.start + image.size; + images.push(image); + } + if (this.options.extractNonFII && images.length) { + const bufferBlob = new Blob([dataView]); + const imgs = []; + for (const image of images) { + if (image.isFII && !this.options.extractFII) { + continue; // Skip FII + } + const imageBlob = bufferBlob.slice(image.start, image.end + 1, 'image/jpeg'); + // we don't need this + // const imageUrl = URL.createObjectURL(imageBlob) + // image.img = document.createElement('img') + // image.img.src = imageUrl + imgs.push(imageBlob); + } + resolve(imgs); + } + } + } + offset += 2 + dataView.getUint16(offset + 2); + } + }); + } +} + +/** + * Extracts XMP Metadata and the gain map recovery image + * from a single JPEG file. + * + * @category Decoding Functions + * @group Decoding Functions + * @param jpegFile an `Uint8Array` containing and encoded JPEG file + * @returns an sdr `Uint8Array` compressed in JPEG, a gainMap `Uint8Array` compressed in JPEG and the XMP parsed XMP metadata + * @throws Error if XMP Metadata is not found + * @throws Error if Gain map image is not found + * @example + * import { FileLoader } from 'three' + * import { extractGainmapFromJPEG } from '@monogrid/gainmap-js' + * + * const jpegFile = await new FileLoader() + * .setResponseType('arraybuffer') + * .loadAsync('image.jpg') + * + * const { sdr, gainMap, metadata } = extractGainmapFromJPEG(jpegFile) + */ +const extractGainmapFromJPEG = async (jpegFile) => { + const metadata = extractXMP(jpegFile); + if (!metadata) + throw new XMPMetadataNotFoundError('Gain map XMP metadata not found'); + const mpfExtractor = new MPFExtractor({ extractFII: true, extractNonFII: true }); + const images = await mpfExtractor.extract(jpegFile); + if (images.length !== 2) + throw new GainMapNotFoundError('Gain map recovery image not found'); + return { + sdr: new Uint8Array(await images[0].arrayBuffer()), + gainMap: new Uint8Array(await images[1].arrayBuffer()), + metadata + }; +}; + +/** + * private function, async get image from blob + * + * @param blob + * @returns + */ +const getHTMLImageFromBlob = (blob) => { + return new Promise((resolve, reject) => { + const img = document.createElement('img'); + img.onload = () => { resolve(img); }; + img.onerror = (e) => { reject(e); }; + img.src = URL.createObjectURL(blob); + }); +}; + +class LoaderBase extends Loader { + /** + * + * @param renderer + * @param manager + */ + constructor(renderer, manager) { + super(manager); + if (renderer) + this._renderer = renderer; + this._internalLoadingManager = new LoadingManager(); + } + /** + * Specify the renderer to use when rendering the gain map + * + * @param renderer + * @returns + */ + setRenderer(renderer) { + this._renderer = renderer; + return this; + } + /** + * Specify the renderTarget options to use when rendering the gain map + * + * @param options + * @returns + */ + setRenderTargetOptions(options) { + this._renderTargetOptions = options; + return this; + } + /** + * @private + * @returns + */ + prepareQuadRenderer() { + if (!this._renderer) + console.warn('WARNING: An existing WebGL Renderer was not passed to this Loader constructor or in setRenderer, the result of this Loader will need to be converted to a Data Texture with toDataTexture() before you can use it in your renderer.'); + // temporary values + const material = new GainMapDecoderMaterial({ + gainMapMax: [1, 1, 1], + gainMapMin: [0, 0, 0], + gamma: [1, 1, 1], + offsetHdr: [1, 1, 1], + offsetSdr: [1, 1, 1], + hdrCapacityMax: 1, + hdrCapacityMin: 0, + maxDisplayBoost: 1, + gainMap: new Texture$1(), + sdr: new Texture$1() + }); + return new QuadRenderer({ + width: 16, + height: 16, + type: HalfFloatType, + colorSpace: LinearSRGBColorSpace, + material, + renderer: this._renderer, + renderTargetOptions: this._renderTargetOptions + }); + } + /** + * @private + * @param quadRenderer + * @param metadata + * @param sdrBuffer + * @param gainMapBuffer + */ + async render(quadRenderer, metadata, sdrBuffer, gainMapBuffer) { + // this is optional, will render a black gain-map if not present + const gainMapBlob = gainMapBuffer ? new Blob([gainMapBuffer], { type: 'image/jpeg' }) : undefined; + const sdrBlob = new Blob([sdrBuffer], { type: 'image/jpeg' }); + let sdrImage; + let gainMapImage; + let needsFlip = false; + if (typeof createImageBitmap === 'undefined') { + const res = await Promise.all([ + gainMapBlob ? getHTMLImageFromBlob(gainMapBlob) : Promise.resolve(undefined), + getHTMLImageFromBlob(sdrBlob) + ]); + gainMapImage = res[0]; + sdrImage = res[1]; + needsFlip = true; + } + else { + const res = await Promise.all([ + gainMapBlob ? createImageBitmap(gainMapBlob, { imageOrientation: 'flipY' }) : Promise.resolve(undefined), + createImageBitmap(sdrBlob, { imageOrientation: 'flipY' }) + ]); + gainMapImage = res[0]; + sdrImage = res[1]; + } + const gainMap = new Texture$1(gainMapImage || new ImageData(2, 2), UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, 1, LinearSRGBColorSpace); + gainMap.flipY = needsFlip; + gainMap.needsUpdate = true; + const sdr = new Texture$1(sdrImage, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, 1, SRGBColorSpace); + sdr.flipY = needsFlip; + sdr.needsUpdate = true; + quadRenderer.width = sdrImage.width; + quadRenderer.height = sdrImage.height; + quadRenderer.material.gainMap = gainMap; + quadRenderer.material.sdr = sdr; + quadRenderer.material.gainMapMin = metadata.gainMapMin; + quadRenderer.material.gainMapMax = metadata.gainMapMax; + quadRenderer.material.offsetHdr = metadata.offsetHdr; + quadRenderer.material.offsetSdr = metadata.offsetSdr; + quadRenderer.material.gamma = metadata.gamma; + quadRenderer.material.hdrCapacityMin = metadata.hdrCapacityMin; + quadRenderer.material.hdrCapacityMax = metadata.hdrCapacityMax; + quadRenderer.material.maxDisplayBoost = Math.pow(2, metadata.hdrCapacityMax); + quadRenderer.material.needsUpdate = true; + quadRenderer.render(); + } +} + +/** + * A Three.js Loader for a JPEG with embedded gainmap metadata. + * + * @category Loaders + * @group Loaders + * + * @example + * import { HDRJPGLoader } from '@monogrid/gainmap-js' + * import { + * EquirectangularReflectionMapping, + * LinearFilter, + * Mesh, + * MeshBasicMaterial, + * PerspectiveCamera, + * PlaneGeometry, + * Scene, + * WebGLRenderer + * } from 'three' + * + * const renderer = new WebGLRenderer() + * + * const loader = new HDRJPGLoader(renderer) + * + * const result = await loader.loadAsync('gainmap.jpeg') + * // `result` can be used to populate a Texture + * + * const scene = new Scene() + * const mesh = new Mesh( + * new PlaneGeometry(), + * new MeshBasicMaterial({ map: result.renderTarget.texture }) + * ) + * scene.add(mesh) + * renderer.render(scene, new PerspectiveCamera()) + * + * // Starting from three.js r159 + * // `result.renderTarget.texture` can + * // also be used as Equirectangular scene background + * // + * // it was previously needed to convert it + * // to a DataTexture with `result.toDataTexture()` + * scene.background = result.renderTarget.texture + * scene.background.mapping = EquirectangularReflectionMapping + * + * // result must be manually disposed + * // when you are done using it + * result.dispose() + * + */ +class HDRJPGLoader extends LoaderBase { + /** + * Loads a JPEG containing gain map metadata + * Renders a normal SDR image if gainmap data is not found + * + * @param url An array in the form of [sdr.jpg, gainmap.jpg, metadata.json] + * @param onLoad Load complete callback, will receive the result + * @param onProgress Progress callback, will receive a {@link ProgressEvent} + * @param onError Error callback + * @returns + */ + load(url, onLoad, onProgress, onError) { + const quadRenderer = this.prepareQuadRenderer(); + const loader = new FileLoader(this._internalLoadingManager); + loader.setResponseType('arraybuffer'); + loader.setRequestHeader(this.requestHeader); + loader.setPath(this.path); + loader.setWithCredentials(this.withCredentials); + this.manager.itemStart(url); + loader.load(url, async (jpeg) => { + /* istanbul ignore if + this condition exists only because of three.js types + strict mode + */ + if (typeof jpeg === 'string') + throw new Error('Invalid buffer, received [string], was expecting [ArrayBuffer]'); + const jpegBuffer = new Uint8Array(jpeg); + let sdrJPEG; + let gainMapJPEG; + let metadata; + try { + const extractionResult = await extractGainmapFromJPEG(jpegBuffer); + // gain map is successfully reconstructed + sdrJPEG = extractionResult.sdr; + gainMapJPEG = extractionResult.gainMap; + metadata = extractionResult.metadata; + } + catch (e) { + // render the SDR version if this is not a gainmap + if (e instanceof XMPMetadataNotFoundError || e instanceof GainMapNotFoundError) { + console.warn(`Failure to reconstruct an HDR image from ${url}: Gain map metadata not found in the file, HDRJPGLoader will render the SDR jpeg`); + metadata = { + gainMapMin: [0, 0, 0], + gainMapMax: [1, 1, 1], + gamma: [1, 1, 1], + hdrCapacityMin: 0, + hdrCapacityMax: 1, + offsetHdr: [0, 0, 0], + offsetSdr: [0, 0, 0] + }; + sdrJPEG = jpegBuffer; + } + else { + throw e; + } + } + // solves #16 + try { + await this.render(quadRenderer, metadata, sdrJPEG, gainMapJPEG); + } + catch (error) { + this.manager.itemError(url); + if (typeof onError === 'function') + onError(error); + quadRenderer.disposeOnDemandRenderer(); + return; + } + if (typeof onLoad === 'function') + onLoad(quadRenderer); + this.manager.itemEnd(url); + quadRenderer.disposeOnDemandRenderer(); + }, onProgress, (error) => { + this.manager.itemError(url); + if (typeof onError === 'function') + onError(error); + }); + return quadRenderer; + } +} + +// https://github.com/mrdoob/three.js/issues/5552 +// http://en.wikipedia.org/wiki/RGBE_image_format + +class RGBELoader extends DataTextureLoader { + + constructor( manager ) { + + super( manager ); + + this.type = HalfFloatType; + + } + + // adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html + + parse( buffer ) { + + const + /* default error routine. change this to change error handling */ + rgbe_read_error = 1, + rgbe_write_error = 2, + rgbe_format_error = 3, + rgbe_memory_error = 4, + rgbe_error = function ( rgbe_error_code, msg ) { + + switch ( rgbe_error_code ) { + + case rgbe_read_error: throw new Error( 'THREE.RGBELoader: Read Error: ' + ( msg || '' ) ); + case rgbe_write_error: throw new Error( 'THREE.RGBELoader: Write Error: ' + ( msg || '' ) ); + case rgbe_format_error: throw new Error( 'THREE.RGBELoader: Bad File Format: ' + ( msg || '' ) ); + default: + case rgbe_memory_error: throw new Error( 'THREE.RGBELoader: Memory Error: ' + ( msg || '' ) ); + + } + + }, + + /* offsets to red, green, and blue components in a data (float) pixel */ + //RGBE_DATA_RED = 0, + //RGBE_DATA_GREEN = 1, + //RGBE_DATA_BLUE = 2, + + /* number of floats per pixel, use 4 since stored in rgba image format */ + //RGBE_DATA_SIZE = 4, + + /* flags indicating which fields in an rgbe_header_info are valid */ + RGBE_VALID_PROGRAMTYPE = 1, + RGBE_VALID_FORMAT = 2, + RGBE_VALID_DIMENSIONS = 4, + + NEWLINE = '\n', + + fgets = function ( buffer, lineLimit, consume ) { + + const chunkSize = 128; + + lineLimit = ! lineLimit ? 1024 : lineLimit; + let p = buffer.pos, + i = -1, len = 0, s = '', + chunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) ); + + while ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) { + + s += chunk; len += chunk.length; + p += chunkSize; + chunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) ); + + } + + if ( -1 < i ) { + + /*for (i=l-1; i>=0; i--) { + byteCode = m.charCodeAt(i); + if (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++; + else if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2; + if (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate + }*/ + buffer.pos += len + i + 1; + return s + chunk.slice( 0, i ); + + } + + return false; + + }, + + /* minimal header reading. modify if you want to parse more information */ + RGBE_ReadHeader = function ( buffer ) { + + + // regexes to parse header info fields + const magic_token_re = /^#\?(\S+)/, + gamma_re = /^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/, + exposure_re = /^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/, + format_re = /^\s*FORMAT=(\S+)\s*$/, + dimensions_re = /^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/, + + // RGBE format header struct + header = { + + valid: 0, /* indicate which fields are valid */ + + string: '', /* the actual header string */ + + comments: '', /* comments found in header */ + + programtype: 'RGBE', /* listed at beginning of file to identify it after "#?". defaults to "RGBE" */ + + format: '', /* RGBE format, default 32-bit_rle_rgbe */ + + gamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */ + + exposure: 1.0, /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */ + + width: 0, height: 0 /* image dimensions, width/height */ + + }; + + let line, match; + + if ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) { + + rgbe_error( rgbe_read_error, 'no header found' ); + + } + + /* if you want to require the magic token then uncomment the next line */ + if ( ! ( match = line.match( magic_token_re ) ) ) { + + rgbe_error( rgbe_format_error, 'bad initial token' ); + + } + + header.valid |= RGBE_VALID_PROGRAMTYPE; + header.programtype = match[ 1 ]; + header.string += line + '\n'; + + while ( true ) { + + line = fgets( buffer ); + if ( false === line ) break; + header.string += line + '\n'; + + if ( '#' === line.charAt( 0 ) ) { + + header.comments += line + '\n'; + continue; // comment line + + } + + if ( match = line.match( gamma_re ) ) { + + header.gamma = parseFloat( match[ 1 ] ); + + } + + if ( match = line.match( exposure_re ) ) { + + header.exposure = parseFloat( match[ 1 ] ); + + } + + if ( match = line.match( format_re ) ) { + + header.valid |= RGBE_VALID_FORMAT; + header.format = match[ 1 ];//'32-bit_rle_rgbe'; + + } + + if ( match = line.match( dimensions_re ) ) { + + header.valid |= RGBE_VALID_DIMENSIONS; + header.height = parseInt( match[ 1 ], 10 ); + header.width = parseInt( match[ 2 ], 10 ); + + } + + if ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break; + + } + + if ( ! ( header.valid & RGBE_VALID_FORMAT ) ) { + + rgbe_error( rgbe_format_error, 'missing format specifier' ); + + } + + if ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) { + + rgbe_error( rgbe_format_error, 'missing image size specifier' ); + + } + + return header; + + }, + + RGBE_ReadPixels_RLE = function ( buffer, w, h ) { + + const scanline_width = w; + + if ( + // run length encoding is not allowed so read flat + ( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) || + // this file is not run length encoded + ( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) ) + ) { + + // return the flat buffer + return new Uint8Array( buffer ); + + } + + if ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) { + + rgbe_error( rgbe_format_error, 'wrong scanline width' ); + + } + + const data_rgba = new Uint8Array( 4 * w * h ); + + if ( ! data_rgba.length ) { + + rgbe_error( rgbe_memory_error, 'unable to allocate buffer space' ); + + } + + let offset = 0, pos = 0; + + const ptr_end = 4 * scanline_width; + const rgbeStart = new Uint8Array( 4 ); + const scanline_buffer = new Uint8Array( ptr_end ); + let num_scanlines = h; + + // read in each successive scanline + while ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) { + + if ( pos + 4 > buffer.byteLength ) { + + rgbe_error( rgbe_read_error ); + + } + + rgbeStart[ 0 ] = buffer[ pos ++ ]; + rgbeStart[ 1 ] = buffer[ pos ++ ]; + rgbeStart[ 2 ] = buffer[ pos ++ ]; + rgbeStart[ 3 ] = buffer[ pos ++ ]; + + if ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) { + + rgbe_error( rgbe_format_error, 'bad rgbe scanline format' ); + + } + + // read each of the four channels for the scanline into the buffer + // first red, then green, then blue, then exponent + let ptr = 0, count; + + while ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) { + + count = buffer[ pos ++ ]; + const isEncodedRun = count > 128; + if ( isEncodedRun ) count -= 128; + + if ( ( 0 === count ) || ( ptr + count > ptr_end ) ) { + + rgbe_error( rgbe_format_error, 'bad scanline data' ); + + } + + if ( isEncodedRun ) { + + // a (encoded) run of the same value + const byteValue = buffer[ pos ++ ]; + for ( let i = 0; i < count; i ++ ) { + + scanline_buffer[ ptr ++ ] = byteValue; + + } + //ptr += count; + + } else { + + // a literal-run + scanline_buffer.set( buffer.subarray( pos, pos + count ), ptr ); + ptr += count; pos += count; + + } + + } + + + // now convert data from buffer into rgba + // first red, then green, then blue, then exponent (alpha) + const l = scanline_width; //scanline_buffer.byteLength; + for ( let i = 0; i < l; i ++ ) { + + let off = 0; + data_rgba[ offset ] = scanline_buffer[ i + off ]; + off += scanline_width; //1; + data_rgba[ offset + 1 ] = scanline_buffer[ i + off ]; + off += scanline_width; //1; + data_rgba[ offset + 2 ] = scanline_buffer[ i + off ]; + off += scanline_width; //1; + data_rgba[ offset + 3 ] = scanline_buffer[ i + off ]; + offset += 4; + + } + + num_scanlines --; + + } + + return data_rgba; + + }; + + const RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) { + + const e = sourceArray[ sourceOffset + 3 ]; + const scale = Math.pow( 2.0, e - 128.0 ) / 255.0; + + destArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale; + destArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale; + destArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale; + destArray[ destOffset + 3 ] = 1; + + }; + + const RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) { + + const e = sourceArray[ sourceOffset + 3 ]; + const scale = Math.pow( 2.0, e - 128.0 ) / 255.0; + + // clamping to 65504, the maximum representable value in float16 + destArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) ); + destArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) ); + destArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) ); + destArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 ); + + }; + + const byteArray = new Uint8Array( buffer ); + byteArray.pos = 0; + const rgbe_header_info = RGBE_ReadHeader( byteArray ); + + const w = rgbe_header_info.width, + h = rgbe_header_info.height, + image_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h ); + + + let data, type; + let numElements; + + switch ( this.type ) { + + case FloatType: + + numElements = image_rgba_data.length / 4; + const floatArray = new Float32Array( numElements * 4 ); + + for ( let j = 0; j < numElements; j ++ ) { + + RGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 ); + + } + + data = floatArray; + type = FloatType; + break; + + case HalfFloatType: + + numElements = image_rgba_data.length / 4; + const halfArray = new Uint16Array( numElements * 4 ); + + for ( let j = 0; j < numElements; j ++ ) { + + RGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 ); + + } + + data = halfArray; + type = HalfFloatType; + break; + + default: + + throw new Error( 'THREE.RGBELoader: Unsupported type: ' + this.type ); + + } + + return { + width: w, height: h, + data: data, + header: rgbe_header_info.string, + gamma: rgbe_header_info.gamma, + exposure: rgbe_header_info.exposure, + type: type + }; + + } + + setDataType( value ) { + + this.type = value; + return this; + + } + + load( url, onLoad, onProgress, onError ) { + + function onLoadCallback( texture, texData ) { + + switch ( texture.type ) { + + case FloatType: + case HalfFloatType: + + texture.colorSpace = LinearSRGBColorSpace; + texture.minFilter = LinearFilter; + texture.magFilter = LinearFilter; + texture.generateMipmaps = false; + texture.flipY = true; + + break; + + } + + if ( onLoad ) onLoad( texture, texData ); + + } + + return super.load( url, onLoadCallback, onProgress, onError ); + + } + +} + +/* @license + * Copyright 2021 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const legacy = { + topLight: { + intensity: 500, + position: [0.418, 16.199, 0.300], + }, + room: { + position: [-0.757, 13.219, 0.717], + scale: [31.713, 28.305, 28.591], + }, + boxes: [ + { + position: [-10.906, 2.009, 1.846], + rotation: -0.195, + scale: [2.328, 7.905, 4.651], + }, + { + position: [-5.607, -0.754, -0.758], + rotation: 0.994, + scale: [1.970, 1.534, 3.955], + }, + { + position: [6.167, 0.857, 7.803], + rotation: 0.561, + scale: [3.927, 6.285, 3.687], + }, + { + position: [-2.017, 0.018, 6.124], + rotation: 0.333, + scale: [2.002, 4.566, 2.064], + }, + { + position: [2.291, -0.756, -2.621], + rotation: -0.286, + scale: [1.546, 1.552, 1.496], + }, + { + position: [-2.193, -0.369, -5.547], + rotation: 0.516, + scale: [3.875, 3.487, 2.986], + }, + ], + lights: [ + { + intensity: 50, + position: [-16.116, 14.37, 8.208], + scale: [0.1, 2.428, 2.739], + }, + { + intensity: 50, + position: [-16.109, 18.021, -8.207], + scale: [0.1, 2.425, 2.751], + }, + { + intensity: 17, + position: [14.904, 12.198, -1.832], + scale: [0.15, 4.265, 6.331], + }, + { + intensity: 43, + position: [-0.462, 8.89, 14.520], + scale: [4.38, 5.441, 0.088], + }, + { + intensity: 20, + position: [3.235, 11.486, -12.541], + scale: [2.5, 2.0, 0.1], + }, + { + intensity: 100, + position: [0.0, 20.0, 0.0], + scale: [1.0, 0.1, 1.0], + }, + ] +}; +const neutral = { + topLight: { + intensity: 400, + position: [0.5, 14.0, 0.5], + }, + room: { + position: [0.0, 13.2, 0.0], + scale: [31.5, 28.5, 31.5], + }, + boxes: [ + { + position: [-10.906, -1, 1.846], + rotation: -0.195, + scale: [2.328, 7.905, 4.651], + }, + { + position: [-5.607, -0.754, -0.758], + rotation: 0.994, + scale: [1.970, 1.534, 3.955], + }, + { + position: [6.167, -0.16, 7.803], + rotation: 0.561, + scale: [3.927, 6.285, 3.687], + }, + { + position: [-2.017, 0.018, 6.124], + rotation: 0.333, + scale: [2.002, 4.566, 2.064], + }, + { + position: [2.291, -0.756, -2.621], + rotation: -0.286, + scale: [1.546, 1.552, 1.496], + }, + { + position: [-2.193, -0.369, -5.547], + rotation: 0.516, + scale: [3.875, 3.487, 2.986], + }, + ], + lights: [ + { + intensity: 80, + position: [-14, 10.0, 8.0], + scale: [0.1, 2.5, 2.5], + }, + { + intensity: 80, + position: [-14, 14.0, -4], + scale: [0.1, 2.5, 2.5], + }, + { + intensity: 23, + position: [14.0, 12.0, 0.0], + scale: [0.1, 5.0, 5.0], + }, + { + intensity: 16, + position: [0.0, 9.0, 14.0], + scale: [5.0, 5.0, 0.1], + }, + { + intensity: 80, + position: [7.0, 8.0, -14], + scale: [2.5, 2.5, 0.1], + }, + { + intensity: 80, + position: [-7, 16.0, -14], + scale: [2.5, 2.5, 0.1], + }, + { + intensity: 1, + position: [0.0, 20.0, 0.0], + scale: [0.1, 0.1, 0.1], + }, + ] +}; +class EnvironmentScene extends Scene { + constructor(name) { + super(); + this.position.y = -3.5; + const geometry = new BoxGeometry(); + geometry.deleteAttribute('uv'); + const roomMaterial = new MeshStandardMaterial({ metalness: 0, side: BackSide }); + const boxMaterial = new MeshStandardMaterial({ metalness: 0 }); + const data = name == 'legacy' ? legacy : neutral; + const mainLight = new PointLight(0xffffff, data.topLight.intensity, 28, 2); + mainLight.position.set(...data.topLight.position); + this.add(mainLight); + const room = new Mesh(geometry, roomMaterial); + room.position.set(...data.room.position); + room.scale.set(...data.room.scale); + this.add(room); + for (const box of data.boxes) { + const box1 = new Mesh(geometry, boxMaterial); + box1.position.set(...box.position); + box1.rotation.set(0, box.rotation, 0); + box1.scale.set(...box.scale); + this.add(box1); + } + for (const light of data.lights) { + const light1 = new Mesh(geometry, this.createAreaLightMaterial(light.intensity)); + light1.position.set(...light.position); + light1.scale.set(...light.scale); + this.add(light1); + } + } + createAreaLightMaterial(intensity) { + const material = new MeshBasicMaterial(); + material.color.setScalar(intensity); + return material; + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const GENERATED_SIGMA = 0.04; +// The maximum length of the blur for loop. Smaller sigmas will use fewer +// samples and exit early, but not recompile the shader. +const MAX_SAMPLES = 20; +const HDR_FILE_RE = /\.hdr(\.js)?$/; +class TextureUtils { + constructor(threeRenderer) { + this.threeRenderer = threeRenderer; + this.lottieLoaderUrl = ''; + this._ldrLoader = null; + this._imageLoader = null; + this._hdrLoader = null; + this._lottieLoader = null; + this.generatedEnvironmentMap = null; + this.generatedEnvironmentMapAlt = null; + this.skyboxCache = new Map(); + this.blurMaterial = null; + this.blurScene = null; + } + ldrLoader(withCredentials) { + if (this._ldrLoader == null) { + this._ldrLoader = new TextureLoader(); + } + this._ldrLoader.setWithCredentials(withCredentials); + return this._ldrLoader; + } + imageLoader(withCredentials) { + if (this._imageLoader == null) { + this._imageLoader = new HDRJPGLoader(this.threeRenderer); + } + this._imageLoader.setWithCredentials(withCredentials); + return this._imageLoader; + } + hdrLoader(withCredentials) { + if (this._hdrLoader == null) { + this._hdrLoader = new RGBELoader(); + this._hdrLoader.setDataType(HalfFloatType); + } + this._hdrLoader.setWithCredentials(withCredentials); + return this._hdrLoader; + } + async getLottieLoader(withCredentials) { + if (this._lottieLoader == null) { + const { LottieLoader } = await import(/* webpackIgnore: true */ this.lottieLoaderUrl); + this._lottieLoader = new LottieLoader(); + } + this._lottieLoader.setWithCredentials(withCredentials); + return this._lottieLoader; + } + async loadImage(url, withCredentials) { + const texture = await new Promise((resolve, reject) => this.ldrLoader(withCredentials) + .load(url, resolve, () => { }, reject)); + texture.name = url; + texture.flipY = false; + return texture; + } + async loadLottie(url, quality, withCredentials) { + const loader = await this.getLottieLoader(withCredentials); + loader.setQuality(quality); + const texture = await new Promise((resolve, reject) => loader.load(url, resolve, () => { }, reject)); + texture.name = url; + return texture; + } + async loadEquirect(url, withCredentials = false, progressCallback = () => { }) { + try { + const isHDR = HDR_FILE_RE.test(url); + const loader = isHDR ? this.hdrLoader(withCredentials) : + this.imageLoader(withCredentials); + const texture = await new Promise((resolve, reject) => loader.load(url, (result) => { + const { renderTarget } = result; + if (renderTarget != null) { + const { texture } = renderTarget; + result.dispose(false); + resolve(texture); + } + else { + resolve(result); + } + }, (event) => { + progressCallback(event.loaded / event.total * 0.9); + }, reject)); + progressCallback(1.0); + texture.name = url; + texture.mapping = EquirectangularReflectionMapping; + if (!isHDR) { + texture.colorSpace = SRGBColorSpace; + } + return texture; + } + finally { + if (progressCallback) { + progressCallback(1); + } + } + } + /** + * Returns a { skybox, environmentMap } object with the targets/textures + * accordingly. `skybox` is a WebGLRenderCubeTarget, and `environmentMap` + * is a Texture from a WebGLRenderCubeTarget. + */ + async generateEnvironmentMapAndSkybox(skyboxUrl = null, environmentMapUrl = null, progressCallback = () => { }, withCredentials = false) { + const useAltEnvironment = environmentMapUrl !== 'legacy'; + if (environmentMapUrl === 'legacy' || environmentMapUrl === 'neutral') { + environmentMapUrl = null; + } + environmentMapUrl = deserializeUrl(environmentMapUrl); + let skyboxLoads = Promise.resolve(null); + let environmentMapLoads; + // If we have a skybox URL, attempt to load it as a cubemap + if (!!skyboxUrl) { + skyboxLoads = this.loadEquirectFromUrl(skyboxUrl, withCredentials, progressCallback); + } + if (!!environmentMapUrl) { + // We have an available environment map URL + environmentMapLoads = this.loadEquirectFromUrl(environmentMapUrl, withCredentials, progressCallback); + } + else if (!!skyboxUrl) { + // Fallback to deriving the environment map from an available skybox + environmentMapLoads = this.loadEquirectFromUrl(skyboxUrl, withCredentials, progressCallback); + } + else { + // Fallback to generating the environment map + environmentMapLoads = useAltEnvironment ? + this.loadGeneratedEnvironmentMapAlt() : + this.loadGeneratedEnvironmentMap(); + } + const [environmentMap, skybox] = await Promise.all([environmentMapLoads, skyboxLoads]); + if (environmentMap == null) { + throw new Error('Failed to load environment map.'); + } + return { environmentMap, skybox }; + } + /** + * Loads an equirect Texture from a given URL, for use as a skybox. + */ + async loadEquirectFromUrl(url, withCredentials, progressCallback) { + if (!this.skyboxCache.has(url)) { + const skyboxMapLoads = this.loadEquirect(url, withCredentials, progressCallback); + this.skyboxCache.set(url, skyboxMapLoads); + } + return this.skyboxCache.get(url); + } + async GenerateEnvironmentMap(scene, name) { + await timePasses(); + const renderer = this.threeRenderer; + const cubeTarget = new WebGLCubeRenderTarget(256, { + generateMipmaps: false, + type: HalfFloatType, + format: RGBAFormat, + colorSpace: LinearSRGBColorSpace, + depthBuffer: true + }); + const cubeCamera = new CubeCamera(0.1, 100, cubeTarget); + const generatedEnvironmentMap = cubeCamera.renderTarget.texture; + generatedEnvironmentMap.name = name; + const outputColorSpace = renderer.outputColorSpace; + const toneMapping = renderer.toneMapping; + renderer.toneMapping = NoToneMapping; + renderer.outputColorSpace = LinearSRGBColorSpace; + cubeCamera.update(renderer, scene); + this.blurCubemap(cubeTarget, GENERATED_SIGMA); + renderer.toneMapping = toneMapping; + renderer.outputColorSpace = outputColorSpace; + return generatedEnvironmentMap; + } + /** + * Loads a dynamically generated environment map. + */ + async loadGeneratedEnvironmentMap() { + if (this.generatedEnvironmentMap == null) { + this.generatedEnvironmentMap = + this.GenerateEnvironmentMap(new EnvironmentScene('legacy'), 'legacy'); + } + return this.generatedEnvironmentMap; + } + /** + * Loads a dynamically generated environment map, designed to be neutral and + * color-preserving. Shows less contrast around the different sides of the + * object. + */ + async loadGeneratedEnvironmentMapAlt() { + if (this.generatedEnvironmentMapAlt == null) { + this.generatedEnvironmentMapAlt = this.GenerateEnvironmentMap(new EnvironmentScene('neutral'), 'neutral'); + } + return this.generatedEnvironmentMapAlt; + } + blurCubemap(cubeTarget, sigma) { + if (this.blurMaterial == null) { + this.blurMaterial = this.getBlurShader(MAX_SAMPLES); + const box = new BoxGeometry(); + const blurMesh = new Mesh(box, this.blurMaterial); + this.blurScene = new Scene(); + this.blurScene.add(blurMesh); + } + const tempTarget = cubeTarget.clone(); + this.halfblur(cubeTarget, tempTarget, sigma, 'latitudinal'); + this.halfblur(tempTarget, cubeTarget, sigma, 'longitudinal'); + // Disposing this target after we're done with it somehow corrupts Safari's + // whole graphics driver. It's random, but occurs more frequently on + // lower-powered GPUs (macbooks with intel graphics, older iPhones). It goes + // beyond just messing up the PMREM, as it also occasionally causes + // visible corruption on the canvas and even on the rest of the page. + /** tempTarget.dispose(); */ + } + halfblur(targetIn, targetOut, sigmaRadians, direction) { + // Number of standard deviations at which to cut off the discrete + // approximation. + const STANDARD_DEVIATIONS = 3; + const pixels = targetIn.width; + const radiansPerPixel = isFinite(sigmaRadians) ? + Math.PI / (2 * pixels) : + 2 * Math.PI / (2 * MAX_SAMPLES - 1); + const sigmaPixels = sigmaRadians / radiansPerPixel; + const samples = isFinite(sigmaRadians) ? + 1 + Math.floor(STANDARD_DEVIATIONS * sigmaPixels) : + MAX_SAMPLES; + if (samples > MAX_SAMPLES) { + console.warn(`sigmaRadians, ${sigmaRadians}, is too large and will clip, as it requested ${samples} samples when the maximum is set to ${MAX_SAMPLES}`); + } + const weights = []; + let sum = 0; + for (let i = 0; i < MAX_SAMPLES; ++i) { + const x = i / sigmaPixels; + const weight = Math.exp(-x * x / 2); + weights.push(weight); + if (i == 0) { + sum += weight; + } + else if (i < samples) { + sum += 2 * weight; + } + } + for (let i = 0; i < weights.length; i++) { + weights[i] = weights[i] / sum; + } + const blurUniforms = this.blurMaterial.uniforms; + blurUniforms['envMap'].value = targetIn.texture; + blurUniforms['samples'].value = samples; + blurUniforms['weights'].value = weights; + blurUniforms['latitudinal'].value = direction === 'latitudinal'; + blurUniforms['dTheta'].value = radiansPerPixel; + const cubeCamera = new CubeCamera(0.1, 100, targetOut); + cubeCamera.update(this.threeRenderer, this.blurScene); + } + getBlurShader(maxSamples) { + const weights = new Float32Array(maxSamples); + const poleAxis = new Vector3(0, 1, 0); + const shaderMaterial = new ShaderMaterial({ + name: 'SphericalGaussianBlur', + defines: { 'n': maxSamples }, + uniforms: { + 'envMap': { value: null }, + 'samples': { value: 1 }, + 'weights': { value: weights }, + 'latitudinal': { value: false }, + 'dTheta': { value: 0 }, + 'poleAxis': { value: poleAxis } + }, + vertexShader: /* glsl */ ` + + varying vec3 vOutputDirection; + + void main() { + + vOutputDirection = vec3( position ); + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + } + `, + fragmentShader: /* glsl */ ` + varying vec3 vOutputDirection; + + uniform samplerCube envMap; + uniform int samples; + uniform float weights[ n ]; + uniform bool latitudinal; + uniform float dTheta; + uniform vec3 poleAxis; + + vec3 getSample( float theta, vec3 axis ) { + + float cosTheta = cos( theta ); + // Rodrigues' axis-angle rotation + vec3 sampleDirection = vOutputDirection * cosTheta + + cross( axis, vOutputDirection ) * sin( theta ) + + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); + + return vec3( textureCube( envMap, sampleDirection ) ); + + } + + void main() { + + vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); + + if ( all( equal( axis, vec3( 0.0 ) ) ) ) { + + axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); + + } + + axis = normalize( axis ); + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); + + for ( int i = 1; i < n; i++ ) { + + if ( i >= samples ) { + + break; + + } + + float theta = dTheta * float( i ); + gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); + gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); + + } + } + `, + blending: NoBlending, + depthTest: false, + depthWrite: false, + side: BackSide + }); + return shaderMaterial; + } + async dispose() { + for (const [, promise] of this.skyboxCache) { + const skybox = await promise; + skybox.dispose(); + } + if (this.generatedEnvironmentMap != null) { + (await this.generatedEnvironmentMap).dispose(); + this.generatedEnvironmentMap = null; + } + if (this.generatedEnvironmentMapAlt != null) { + (await this.generatedEnvironmentMapAlt).dispose(); + this.generatedEnvironmentMapAlt = null; + } + if (this.blurMaterial != null) { + this.blurMaterial.dispose(); + } + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Between 0 and 1: larger means the average responds faster and is less smooth. +const DURATION_DECAY = 0.2; +const LOW_FRAME_DURATION_MS = 40; +const HIGH_FRAME_DURATION_MS = 60; +const MAX_AVG_CHANGE_MS = 5; +const SCALE_STEPS = [1, 0.79, 0.62, 0.5, 0.4, 0.31, 0.25]; +const DEFAULT_LAST_STEP = 3; +const DEFAULT_POWER_PREFERENCE = 'high-performance'; +const COMMERCE_EXPOSURE = 1.3; +/** + * Registers canvases with Canvas2DRenderingContexts and renders them + * all in the same WebGLRenderingContext, spitting out textures to apply + * to the canvases. Creates a fullscreen WebGL canvas that is not added + * to the DOM, and on each frame, renders each registered canvas on a portion + * of the WebGL canvas, and applies the texture on the registered canvas. + * + * In the future, can use ImageBitmapRenderingContext instead of + * Canvas2DRenderingContext if supported for cheaper transferring of + * the texture. + */ +class Renderer extends EventDispatcher { + static get singleton() { + if (!this._singleton) { + this._singleton = new Renderer({ + powerPreference: (self.ModelViewerElement || {}) + .powerPreference || + DEFAULT_POWER_PREFERENCE, + debug: isDebugMode() + }); + } + return this._singleton; + } + static resetSingleton() { + const elements = this._singleton.dispose(); + for (const element of elements) { + element.disconnectedCallback(); + } + this._singleton = new Renderer({ + powerPreference: (self.ModelViewerElement || {}) + .powerPreference || + DEFAULT_POWER_PREFERENCE, + debug: isDebugMode() + }); + for (const element of elements) { + element.connectedCallback(); + } + } + get canRender() { + return this.threeRenderer != null; + } + get scaleFactor() { + return SCALE_STEPS[this.scaleStep]; + } + set minScale(scale) { + let i = 1; + while (i < SCALE_STEPS.length) { + if (SCALE_STEPS[i] < scale) { + break; + } + ++i; + } + this.lastStep = i - 1; + } + constructor(options) { + super(); + this.loader = new CachingGLTFLoader(ModelViewerGLTFInstance); + this.width = 0; + this.height = 0; + this.dpr = 1; + this.scenes = new Set(); + this.multipleScenesVisible = false; + this.lastTick = performance.now(); + this.renderedLastFrame = false; + this.scaleStep = 0; + this.lastStep = DEFAULT_LAST_STEP; + this.avgFrameDuration = (HIGH_FRAME_DURATION_MS + LOW_FRAME_DURATION_MS) / 2; + this.onWebGLContextLost = (event) => { + this.dispatchEvent({ type: 'contextlost', sourceEvent: event }); + }; + this.onWebGLContextRestored = () => { + var _a; + (_a = this.textureUtils) === null || _a === void 0 ? void 0 : _a.dispose(); + this.textureUtils = new TextureUtils(this.threeRenderer); + for (const scene of this.scenes) { + scene.element[$updateEnvironment](); + } + }; + this.dpr = window.devicePixelRatio; + this.canvas3D = document.createElement('canvas'); + this.canvas3D.id = 'webgl-canvas'; + this.canvas3D.classList.add('show'); + try { + this.threeRenderer = new WebGLRenderer({ + canvas: this.canvas3D, + alpha: true, + antialias: true, + powerPreference: options.powerPreference, + preserveDrawingBuffer: true, + }); + this.threeRenderer.autoClear = true; + this.threeRenderer.setPixelRatio(1); // handle pixel ratio externally + this.threeRenderer.debug = { + checkShaderErrors: !!options.debug, + onShaderError: null + }; + // ACESFilmicToneMapping appears to be the most "saturated", + // and similar to Filament's gltf-viewer. + this.threeRenderer.toneMapping = NeutralToneMapping; + } + catch (error) { + console.warn(error); + } + this.arRenderer = new ARRenderer(this); + this.textureUtils = + this.canRender ? new TextureUtils(this.threeRenderer) : null; + CachingGLTFLoader.initializeKTX2Loader(this.threeRenderer); + this.canvas3D.addEventListener('webglcontextlost', this.onWebGLContextLost); + this.canvas3D.addEventListener('webglcontextrestored', this.onWebGLContextRestored); + this.updateRendererSize(); + } + registerScene(scene) { + this.scenes.add(scene); + scene.forceRescale(); + const size = new Vector2(); + this.threeRenderer.getSize(size); + scene.canvas.width = size.x; + scene.canvas.height = size.y; + if (this.canRender && this.scenes.size > 0) { + this.threeRenderer.setAnimationLoop((time, frame) => this.render(time, frame)); + } + } + unregisterScene(scene) { + this.scenes.delete(scene); + if (this.canvas3D.parentElement === scene.canvas.parentElement) { + scene.canvas.parentElement.removeChild(this.canvas3D); + } + if (this.canRender && this.scenes.size === 0) { + this.threeRenderer.setAnimationLoop(null); + } + } + displayCanvas(scene) { + return scene.element.modelIsVisible && !this.multipleScenesVisible ? + this.canvas3D : + scene.element[$canvas]; + } + /** + * The function enables an optimization, where when there is only a single + * element, we can use the renderer's 3D canvas directly for + * display. Otherwise we need to use the element's 2D canvas and copy the + * renderer's result into it. + */ + countVisibleScenes() { + const { canvas3D } = this; + let visibleScenes = 0; + let canvas3DScene = null; + for (const scene of this.scenes) { + const { element } = scene; + if (element.modelIsVisible && scene.externalRenderer == null) { + ++visibleScenes; + } + if (canvas3D.parentElement === scene.canvas.parentElement) { + canvas3DScene = scene; + } + } + const multipleScenesVisible = visibleScenes > 1; + if (canvas3DScene != null) { + const newlyMultiple = multipleScenesVisible && !this.multipleScenesVisible; + const disappearing = !canvas3DScene.element.modelIsVisible; + if (newlyMultiple || disappearing) { + const { width, height } = this.sceneSize(canvas3DScene); + this.copyPixels(canvas3DScene, width, height); + canvas3D.parentElement.removeChild(canvas3D); + } + } + this.multipleScenesVisible = multipleScenesVisible; + } + /** + * Updates the renderer's size based on the largest scene and any changes to + * device pixel ratio. + */ + updateRendererSize() { + var _a; + const dpr = window.devicePixelRatio; + if (dpr !== this.dpr) { + // If the device pixel ratio has changed due to page zoom, elements + // specified by % width do not fire a resize event even though their CSS + // pixel dimensions change, so we force them to update their size here. + for (const scene of this.scenes) { + const { element } = scene; + element[$updateSize](element.getBoundingClientRect()); + } + } + // Make the renderer the size of the largest scene + let width = 0; + let height = 0; + for (const scene of this.scenes) { + width = Math.max(width, scene.width); + height = Math.max(height, scene.height); + } + if (width === this.width && height === this.height && dpr === this.dpr) { + return; + } + this.width = width; + this.height = height; + this.dpr = dpr; + width = Math.ceil(width * dpr); + height = Math.ceil(height * dpr); + if (this.canRender) { + this.threeRenderer.setSize(width, height, false); + } + // Each scene's canvas must match the renderer size. In general they can be + // larger than the element that contains them, but the overflow is hidden + // and only the portion that is shown is copied over. + for (const scene of this.scenes) { + const { canvas } = scene; + canvas.width = width; + canvas.height = height; + scene.forceRescale(); + (_a = scene.effectRenderer) === null || _a === void 0 ? void 0 : _a.setSize(width, height); + } + } + updateRendererScale(delta) { + const scaleStep = this.scaleStep; + this.avgFrameDuration += clamp(DURATION_DECAY * (delta - this.avgFrameDuration), -5, MAX_AVG_CHANGE_MS); + if (this.avgFrameDuration > HIGH_FRAME_DURATION_MS) { + ++this.scaleStep; + } + else if (this.avgFrameDuration < LOW_FRAME_DURATION_MS && this.scaleStep > 0) { + --this.scaleStep; + } + this.scaleStep = Math.min(this.scaleStep, this.lastStep); + if (scaleStep !== this.scaleStep) { + this.avgFrameDuration = + (HIGH_FRAME_DURATION_MS + LOW_FRAME_DURATION_MS) / 2; + } + } + shouldRender(scene) { + if (!scene.shouldRender()) { + // The first frame we stop rendering the scene (because it stops moving), + // trigger one extra render at full scale. + if (scene.scaleStep != 0) { + scene.scaleStep = 0; + this.rescaleCanvas(scene); + } + else { + return false; + } + } + else if (scene.scaleStep != this.scaleStep) { + // Update render scale + scene.scaleStep = this.scaleStep; + this.rescaleCanvas(scene); + } + return true; + } + rescaleCanvas(scene) { + const scale = SCALE_STEPS[scene.scaleStep]; + const width = Math.ceil(this.width / scale); + const height = Math.ceil(this.height / scale); + const { style } = scene.canvas; + style.width = `${width}px`; + style.height = `${height}px`; + this.canvas3D.style.width = `${width}px`; + this.canvas3D.style.height = `${height}px`; + const renderedDpr = this.dpr * scale; + const reason = scale < 1 ? 'GPU throttling' : + this.dpr !== window.devicePixelRatio ? 'No meta viewport tag' : + ''; + scene.element.dispatchEvent(new CustomEvent('render-scale', { + detail: { + reportedDpr: window.devicePixelRatio, + renderedDpr: renderedDpr, + minimumDpr: this.dpr * SCALE_STEPS[this.lastStep], + pixelWidth: Math.ceil(scene.width * renderedDpr), + pixelHeight: Math.ceil(scene.height * renderedDpr), + reason: reason + } + })); + } + sceneSize(scene) { + const { dpr } = this; + const scaleFactor = SCALE_STEPS[scene.scaleStep]; + // We avoid using the Three.js PixelRatio and handle it ourselves here so + // that we can do proper rounding and avoid white boundary pixels. + const width = Math.min(Math.ceil(scene.width * scaleFactor * dpr), this.canvas3D.width); + const height = Math.min(Math.ceil(scene.height * scaleFactor * dpr), this.canvas3D.height); + return { width, height }; + } + copyPixels(scene, width, height) { + const context2D = scene.context; + if (context2D == null) { + console.log('could not acquire 2d context'); + return; + } + context2D.clearRect(0, 0, width, height); + context2D.drawImage(this.canvas3D, 0, 0, width, height, 0, 0, width, height); + scene.canvas.classList.add('show'); + } + /** + * Returns an array version of this.scenes where the non-visible ones are + * first. This allows eager scenes to be rendered before they are visible, + * without needing the multi-canvas render path. + */ + orderedScenes() { + const scenes = []; + for (const visible of [false, true]) { + for (const scene of this.scenes) { + if (scene.element.modelIsVisible === visible) { + scenes.push(scene); + } + } + } + return scenes; + } + get isPresenting() { + return this.arRenderer.isPresenting; + } + /** + * This method takes care of updating the element and renderer state based on + * the time that has passed since the last rendered frame. + */ + preRender(scene, t, delta) { + const { element, exposure, toneMapping } = scene; + element[$tick](t, delta); + const exposureIsNumber = typeof exposure === 'number' && !Number.isNaN(exposure); + const env = element.environmentImage; + const sky = element.skyboxImage; + const compensateExposure = toneMapping === NeutralToneMapping && + (env === 'neutral' || env === 'legacy' || (!env && !sky)); + this.threeRenderer.toneMappingExposure = + (exposureIsNumber ? exposure : 1.0) * + (compensateExposure ? COMMERCE_EXPOSURE : 1.0); + } + render(t, frame) { + if (frame != null) { + this.arRenderer.onWebXRFrame(t, frame); + return; + } + const delta = t - this.lastTick; + this.lastTick = t; + if (!this.canRender || this.isPresenting) { + return; + } + this.countVisibleScenes(); + this.updateRendererSize(); + if (this.renderedLastFrame) { + this.updateRendererScale(delta); + this.renderedLastFrame = false; + } + const { canvas3D } = this; + for (const scene of this.orderedScenes()) { + const { element } = scene; + if (!element.loaded || + (!element.modelIsVisible && scene.renderCount > 0)) { + continue; + } + this.preRender(scene, t, delta); + if (!this.shouldRender(scene)) { + continue; + } + if (scene.externalRenderer != null) { + const camera = scene.getCamera(); + camera.updateMatrix(); + const { matrix, projectionMatrix } = camera; + const viewMatrix = matrix.elements.slice(); + const target = scene.getTarget(); + viewMatrix[12] += target.x; + viewMatrix[13] += target.y; + viewMatrix[14] += target.z; + scene.externalRenderer.render({ + viewMatrix: viewMatrix, + projectionMatrix: projectionMatrix.elements + }); + continue; + } + if (!element.modelIsVisible && !this.multipleScenesVisible) { + // Here we are pre-rendering on the visible canvas, so we must mark the + // visible scene dirty to ensure it overwrites us. + for (const visibleScene of this.scenes) { + if (visibleScene.element.modelIsVisible) { + visibleScene.queueRender(); + } + } + } + const { width, height } = this.sceneSize(scene); + scene.renderShadow(this.threeRenderer); + // Need to set the render target in order to prevent + // clearing the depth from a different buffer + this.threeRenderer.setRenderTarget(null); + this.threeRenderer.setViewport(0, Math.ceil(this.height * this.dpr) - height, width, height); + if (scene.effectRenderer != null) { + scene.effectRenderer.render(delta); + } + else { + this.threeRenderer.autoClear = + true; // this might get reset by the effectRenderer + this.threeRenderer.toneMapping = scene.toneMapping; + this.threeRenderer.render(scene, scene.camera); + } + if (this.multipleScenesVisible || + (!scene.element.modelIsVisible && scene.renderCount === 0)) { + this.copyPixels(scene, width, height); + } + else if (canvas3D.parentElement !== scene.canvas.parentElement) { + scene.canvas.parentElement.appendChild(canvas3D); + scene.canvas.classList.remove('show'); + } + scene.hasRendered(); + ++scene.renderCount; + this.renderedLastFrame = true; + } + } + dispose() { + if (this.textureUtils != null) { + this.textureUtils.dispose(); + } + if (this.threeRenderer != null) { + this.threeRenderer.dispose(); + } + this.textureUtils = null; + this.threeRenderer = null; + const elements = []; + for (const scene of this.scenes) { + elements.push(scene.element); + } + this.canvas3D.removeEventListener('webglcontextlost', this.onWebGLContextLost); + this.canvas3D.removeEventListener('webglcontextrestored', this.onWebGLContextRestored); + return elements; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $correlatedObjects = Symbol('correlatedObjects'); +const $onUpdate$1 = Symbol('onUpdate'); +/** + * A SerializableThreeDOMElement is the common primitive of all scene graph + * elements that have been facaded in the host execution context. It adds + * a common interface to these elements in support of convenient + * serializability. + */ +class ThreeDOMElement { + constructor(onUpdate, correlatedObjects) { + this[$onUpdate$1] = onUpdate; + this[$correlatedObjects] = correlatedObjects; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const quadMaterial = new MeshBasicMaterial(); +const quad = new PlaneGeometry(2, 2); +let adhocNum = 0; +const $threeTexture$2 = Symbol('threeTexture'); +const $threeTextures$1 = Symbol('threeTextures'); +/** + * Image facade implementation for Three.js textures + */ +let Image$1 = class Image extends ThreeDOMElement { + get [$threeTexture$2]() { + var _a; + return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value; + } + get [$threeTextures$1]() { + return this[$correlatedObjects]; + } + constructor(onUpdate, texture) { + super(onUpdate, new Set(texture ? [texture] : [])); + if (!this[$threeTexture$2].image.src) { + this[$threeTexture$2].image.src = + texture.name ? texture.name : 'adhoc_image' + adhocNum++; + } + if (!this[$threeTexture$2].image.name) { + this[$threeTexture$2].image.name = + (texture && texture.image && texture.image.src) ? + texture.image.src.split('/').pop() : + 'adhoc_image'; + } + } + get name() { + return this[$threeTexture$2].image.name || ''; + } + get uri() { + return this[$threeTexture$2].image.src; + } + get bufferView() { + return this[$threeTexture$2].image.bufferView; + } + get element() { + const texture = this[$threeTexture$2]; + if (texture && (texture.isCanvasTexture || texture.isVideoTexture)) { + return texture.image; + } + return; + } + get animation() { + const texture = this[$threeTexture$2]; + if (texture && texture.isCanvasTexture && texture.animation) { + return texture.animation; + } + return; + } + get type() { + return this.uri != null ? 'external' : 'embedded'; + } + set name(name) { + for (const texture of this[$threeTextures$1]) { + texture.image.name = name; + } + } + update() { + const texture = this[$threeTexture$2]; + // Applies to non-Lottie canvas textures only + if (texture && texture.isCanvasTexture && !texture.animation) { + this[$threeTexture$2].needsUpdate = true; + this[$onUpdate$1](); + } + } + async createThumbnail(width, height) { + const scene = new Scene(); + quadMaterial.map = this[$threeTexture$2]; + const mesh = new Mesh(quad, quadMaterial); + scene.add(mesh); + const camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1); + const { threeRenderer } = Renderer.singleton; + const renderTarget = new WebGLRenderTarget(width, height); + threeRenderer.setRenderTarget(renderTarget); + threeRenderer.render(scene, camera); + threeRenderer.setRenderTarget(null); + const buffer = new Uint8Array(width * height * 4); + threeRenderer.readRenderTargetPixels(renderTarget, 0, 0, width, height, buffer); + blobCanvas.width = width; + blobCanvas.height = height; + const blobContext = blobCanvas.getContext('2d'); + const imageData = blobContext.createImageData(width, height); + imageData.data.set(buffer); + blobContext.putImageData(imageData, 0, 0); + return new Promise(async (resolve, reject) => { + blobCanvas.toBlob(blob => { + if (!blob) { + return reject('Failed to capture thumbnail.'); + } + resolve(URL.createObjectURL(blob)); + }, 'image/png'); + }); + } +}; + +var Filter; +(function (Filter) { + Filter[Filter["Nearest"] = 9728] = "Nearest"; + Filter[Filter["Linear"] = 9729] = "Linear"; + Filter[Filter["NearestMipmapNearest"] = 9984] = "NearestMipmapNearest"; + Filter[Filter["LinearMipmapNearest"] = 9985] = "LinearMipmapNearest"; + Filter[Filter["NearestMipmapLinear"] = 9986] = "NearestMipmapLinear"; + Filter[Filter["LinearMipmapLinear"] = 9987] = "LinearMipmapLinear"; +})(Filter || (Filter = {})); +var Wrap; +(function (Wrap) { + Wrap[Wrap["ClampToEdge"] = 33071] = "ClampToEdge"; + Wrap[Wrap["MirroredRepeat"] = 33648] = "MirroredRepeat"; + Wrap[Wrap["Repeat"] = 10497] = "Repeat"; +})(Wrap || (Wrap = {})); + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Convertion between gltf standards and threejs standards. +const wrapModeToWrapping = new Map([ + [Wrap.Repeat, RepeatWrapping], + [Wrap.ClampToEdge, ClampToEdgeWrapping], + [Wrap.MirroredRepeat, MirroredRepeatWrapping] +]); +const wrappingToWrapMode = new Map([ + [RepeatWrapping, Wrap.Repeat], + [ClampToEdgeWrapping, Wrap.ClampToEdge], + [MirroredRepeatWrapping, Wrap.MirroredRepeat] +]); +const minFilterToMinification = new Map([ + [Filter.Nearest, NearestFilter], + [Filter.Linear, LinearFilter], + [Filter.NearestMipmapNearest, NearestMipmapNearestFilter], + [Filter.LinearMipmapNearest, LinearMipmapNearestFilter], + [Filter.NearestMipmapLinear, NearestMipmapLinearFilter], + [Filter.LinearMipmapLinear, LinearMipmapLinearFilter] +]); +const minificationToMinFilter = new Map([ + [NearestFilter, Filter.Nearest], + [LinearFilter, Filter.Linear], + [NearestMipmapNearestFilter, Filter.NearestMipmapNearest], + [LinearMipmapNearestFilter, Filter.LinearMipmapNearest], + [NearestMipmapLinearFilter, Filter.NearestMipmapLinear], + [LinearMipmapLinearFilter, Filter.LinearMipmapLinear] +]); +const magFilterToMagnification = new Map([[Filter.Nearest, NearestFilter], [Filter.Linear, LinearFilter]]); +const magnificationToMagFilter = new Map([[NearestFilter, Filter.Nearest], [LinearFilter, Filter.Linear]]); +// Checks for threejs standards. +const isMinFilter = (() => { + return (value) => minificationToMinFilter.has(value); +})(); +const isMagFilter = (() => { + return (value) => magnificationToMagFilter.has(value); +})(); +const isWrapping = (() => { + return (value) => wrappingToWrapMode.has(value); +})(); +const isValidSamplerValue = (property, value) => { + switch (property) { + case 'minFilter': + return isMinFilter(value); + case 'magFilter': + return isMagFilter(value); + case 'wrapS': + case 'wrapT': + return isWrapping(value); + case 'rotation': + case 'repeat': + case 'offset': + return true; + default: + throw new Error(`Cannot configure property "${property}" on Sampler`); + } +}; +const $threeTexture$1 = Symbol('threeTexture'); +const $threeTextures = Symbol('threeTextures'); +const $setProperty = Symbol('setProperty'); +/** + * Sampler facade implementation for Three.js textures + */ +class Sampler extends ThreeDOMElement { + get [$threeTexture$1]() { + var _a; + return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value; + } + get [$threeTextures]() { + return this[$correlatedObjects]; + } + constructor(onUpdate, texture) { + super(onUpdate, new Set(texture ? [texture] : [])); + } + get name() { + return this[$threeTexture$1].name || ''; + } + get minFilter() { + return minificationToMinFilter.get(this[$threeTexture$1].minFilter); + } + get magFilter() { + return magnificationToMagFilter.get(this[$threeTexture$1].magFilter); + } + get wrapS() { + return wrappingToWrapMode.get(this[$threeTexture$1].wrapS); + } + get wrapT() { + return wrappingToWrapMode.get(this[$threeTexture$1].wrapT); + } + get rotation() { + return this[$threeTexture$1].rotation; + } + get scale() { + return toVector2D(this[$threeTexture$1].repeat); + } + get offset() { + return toVector2D(this[$threeTexture$1].offset); + } + setMinFilter(filter) { + this[$setProperty]('minFilter', minFilterToMinification.get(filter)); + } + setMagFilter(filter) { + this[$setProperty]('magFilter', magFilterToMagnification.get(filter)); + } + setWrapS(mode) { + this[$setProperty]('wrapS', wrapModeToWrapping.get(mode)); + } + setWrapT(mode) { + this[$setProperty]('wrapT', wrapModeToWrapping.get(mode)); + } + setRotation(rotation) { + if (rotation == null) { + // Reset rotation. + rotation = 0; + } + this[$setProperty]('rotation', rotation); + } + setScale(scale) { + if (scale == null) { + // Reset scale. + scale = { u: 1, v: 1 }; + } + this[$setProperty]('repeat', new Vector2(scale.u, scale.v)); + } + setOffset(offset) { + if (offset == null) { + // Reset offset. + offset = { u: 0, v: 0 }; + } + this[$setProperty]('offset', new Vector2(offset.u, offset.v)); + } + [$setProperty](property, value) { + if (isValidSamplerValue(property, value)) { + for (const texture of this[$threeTextures]) { + texture[property] = value; + texture.needsUpdate = true; + } + } + this[$onUpdate$1](); + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $image = Symbol('image'); +const $sampler = Symbol('sampler'); +const $threeTexture = Symbol('threeTexture'); +/** + * Material facade implementation for Three.js materials + */ +class Texture extends ThreeDOMElement { + get [$threeTexture]() { + var _a; + return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value; + } + constructor(onUpdate, threeTexture) { + super(onUpdate, new Set(threeTexture ? [threeTexture] : [])); + this[$sampler] = new Sampler(onUpdate, threeTexture); + this[$image] = new Image$1(onUpdate, threeTexture); + } + get name() { + return this[$threeTexture].name || ''; + } + set name(name) { + for (const texture of this[$correlatedObjects]) { + texture.name = name; + } + } + get sampler() { + return this[$sampler]; + } + get source() { + return this[$image]; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$4, _b$4, _c$2; +const $texture = Symbol('texture'); +const $transform = Symbol('transform'); +const $materials$1 = Symbol('materials'); +const $usage = Symbol('usage'); +const $onUpdate = Symbol('onUpdate'); +const $activeVideo = Symbol('activeVideo'); +// Defines what a texture will be used for. +var TextureUsage; +(function (TextureUsage) { + TextureUsage[TextureUsage["Base"] = 0] = "Base"; + TextureUsage[TextureUsage["MetallicRoughness"] = 1] = "MetallicRoughness"; + TextureUsage[TextureUsage["Normal"] = 2] = "Normal"; + TextureUsage[TextureUsage["Occlusion"] = 3] = "Occlusion"; + TextureUsage[TextureUsage["Emissive"] = 4] = "Emissive"; + TextureUsage[TextureUsage["Clearcoat"] = 5] = "Clearcoat"; + TextureUsage[TextureUsage["ClearcoatRoughness"] = 6] = "ClearcoatRoughness"; + TextureUsage[TextureUsage["ClearcoatNormal"] = 7] = "ClearcoatNormal"; + TextureUsage[TextureUsage["SheenColor"] = 8] = "SheenColor"; + TextureUsage[TextureUsage["SheenRoughness"] = 9] = "SheenRoughness"; + TextureUsage[TextureUsage["Transmission"] = 10] = "Transmission"; + TextureUsage[TextureUsage["Thickness"] = 11] = "Thickness"; + TextureUsage[TextureUsage["Specular"] = 12] = "Specular"; + TextureUsage[TextureUsage["SpecularColor"] = 13] = "SpecularColor"; + TextureUsage[TextureUsage["Iridescence"] = 14] = "Iridescence"; + TextureUsage[TextureUsage["IridescenceThickness"] = 15] = "IridescenceThickness"; + TextureUsage[TextureUsage["Anisotropy"] = 16] = "Anisotropy"; +})(TextureUsage || (TextureUsage = {})); +/** + * TextureInfo facade implementation for Three.js materials + */ +class TextureInfo { + constructor(onUpdate, usage, threeTexture, material) { + this[_a$4] = null; + this[_b$4] = { + rotation: 0, + scale: new Vector2(1, 1), + offset: new Vector2(0, 0) + }; + this[_c$2] = false; + // Creates image, sampler, and texture if valid texture info is provided. + if (threeTexture) { + this[$transform].rotation = threeTexture.rotation; + this[$transform].scale.copy(threeTexture.repeat); + this[$transform].offset.copy(threeTexture.offset); + this[$texture] = new Texture(onUpdate, threeTexture); + } + this[$onUpdate] = onUpdate; + this[$materials$1] = material; + this[$usage] = usage; + } + get texture() { + return this[$texture]; + } + setTexture(texture) { + var _d, _e; + const threeTexture = texture != null ? texture.source[$threeTexture$2] : null; + const oldTexture = (_d = this[$texture]) === null || _d === void 0 ? void 0 : _d.source[$threeTexture$2]; + if (oldTexture != null && oldTexture.isVideoTexture) { + this[$activeVideo] = false; + } + else if ((_e = this[$texture]) === null || _e === void 0 ? void 0 : _e.source.animation) { + this[$texture].source.animation.removeEventListener('enterFrame', this[$onUpdate]); + } + this[$texture] = texture; + if (threeTexture != null && threeTexture.isVideoTexture) { + const element = threeTexture.image; + this[$activeVideo] = true; + if (element.requestVideoFrameCallback != null) { + const update = () => { + if (!this[$activeVideo]) { + return; + } + this[$onUpdate](); + element.requestVideoFrameCallback(update); + }; + element.requestVideoFrameCallback(update); + } + else { + const update = () => { + if (!this[$activeVideo]) { + return; + } + this[$onUpdate](); + requestAnimationFrame(update); + }; + requestAnimationFrame(update); + } + } + else if ((texture === null || texture === void 0 ? void 0 : texture.source.animation) != null) { + texture.source.animation.addEventListener('enterFrame', this[$onUpdate]); + } + let colorSpace = SRGBColorSpace; + if (this[$materials$1]) { + for (const material of this[$materials$1]) { + switch (this[$usage]) { + case TextureUsage.Base: + material.map = threeTexture; + break; + case TextureUsage.MetallicRoughness: + colorSpace = LinearSRGBColorSpace; + material.metalnessMap = threeTexture; + material.roughnessMap = threeTexture; + break; + case TextureUsage.Normal: + colorSpace = LinearSRGBColorSpace; + material.normalMap = threeTexture; + break; + case TextureUsage.Occlusion: + colorSpace = LinearSRGBColorSpace; + material.aoMap = threeTexture; + break; + case TextureUsage.Emissive: + material.emissiveMap = threeTexture; + break; + case TextureUsage.Clearcoat: + material.clearcoatMap = threeTexture; + break; + case TextureUsage.ClearcoatRoughness: + material.clearcoatRoughnessMap = threeTexture; + break; + case TextureUsage.ClearcoatNormal: + material.clearcoatNormalMap = threeTexture; + break; + case TextureUsage.SheenColor: + material.sheenColorMap = threeTexture; + break; + case TextureUsage.SheenRoughness: + material.sheenRoughnessMap = threeTexture; + break; + case TextureUsage.Transmission: + material.transmissionMap = threeTexture; + break; + case TextureUsage.Thickness: + material.thicknessMap = threeTexture; + break; + case TextureUsage.Specular: + material.specularIntensityMap = threeTexture; + break; + case TextureUsage.SpecularColor: + material.specularColorMap = threeTexture; + break; + case TextureUsage.Iridescence: + material.iridescenceMap = threeTexture; + break; + case TextureUsage.IridescenceThickness: + material.iridescenceThicknessMap = threeTexture; + break; + case TextureUsage.Anisotropy: + material.anisotropyMap = threeTexture; + break; + } + material.needsUpdate = true; + } + } + if (threeTexture) { + // Updates the colorSpace for the texture, affects all references. + threeTexture.colorSpace = colorSpace; + threeTexture.rotation = this[$transform].rotation; + threeTexture.repeat = this[$transform].scale; + threeTexture.offset = this[$transform].offset; + } + this[$onUpdate](); + } +} +_a$4 = $texture, _b$4 = $transform, _c$2 = $activeVideo; + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $threeMaterial = Symbol('threeMaterial'); +const $threeMaterials = Symbol('threeMaterials'); +const $baseColorTexture = Symbol('baseColorTexture'); +const $metallicRoughnessTexture = Symbol('metallicRoughnessTexture'); +/** + * PBR material properties facade implementation for Three.js materials + */ +class PBRMetallicRoughness extends ThreeDOMElement { + get [$threeMaterials]() { + return this[$correlatedObjects]; + } + get [$threeMaterial]() { + var _a; + return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value; + } + constructor(onUpdate, correlatedMaterials) { + super(onUpdate, correlatedMaterials); + const { map, metalnessMap } = correlatedMaterials.values().next().value; + this[$baseColorTexture] = + new TextureInfo(onUpdate, TextureUsage.Base, map, correlatedMaterials); + this[$metallicRoughnessTexture] = new TextureInfo(onUpdate, TextureUsage.MetallicRoughness, metalnessMap, correlatedMaterials); + } + get baseColorFactor() { + const rgba = [0, 0, 0, this[$threeMaterial].opacity]; + this[$threeMaterial].color.toArray(rgba); + return rgba; + } + get metallicFactor() { + return this[$threeMaterial].metalness; + } + get roughnessFactor() { + return this[$threeMaterial].roughness; + } + get baseColorTexture() { + return this[$baseColorTexture]; + } + get metallicRoughnessTexture() { + return this[$metallicRoughnessTexture]; + } + setBaseColorFactor(rgba) { + const color = new Color(); + if (rgba instanceof Array) { + color.fromArray(rgba); + } + else { + color.set(rgba); + } + for (const material of this[$threeMaterials]) { + material.color.set(color); + if (rgba instanceof Array && rgba.length > 3) { + material.opacity = rgba[3]; + } + else { + rgba = [0, 0, 0, material.opacity]; + color.toArray(rgba); + } + } + this[$onUpdate$1](); + } + setMetallicFactor(value) { + for (const material of this[$threeMaterials]) { + material.metalness = value; + } + this[$onUpdate$1](); + } + setRoughnessFactor(value) { + for (const material of this[$threeMaterials]) { + material.roughness = value; + } + this[$onUpdate$1](); + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$3, _b$3; +const $pbrMetallicRoughness = Symbol('pbrMetallicRoughness'); +const $normalTexture = Symbol('normalTexture'); +const $occlusionTexture = Symbol('occlusionTexture'); +const $emissiveTexture = Symbol('emissiveTexture'); +const $backingThreeMaterial = Symbol('backingThreeMaterial'); +const $applyAlphaCutoff = Symbol('applyAlphaCutoff'); +const $getAlphaMode = Symbol('getAlphaMode'); +const $lazyLoadGLTFInfo = Symbol('lazyLoadGLTFInfo'); +const $initialize = Symbol('initialize'); +const $getLoadedMaterial = Symbol('getLoadedMaterial'); +const $ensureMaterialIsLoaded = Symbol('ensureMaterialIsLoaded'); +const $gltfIndex = Symbol('gltfIndex'); +const $setActive = Symbol('setActive'); +const $variantIndices = Symbol('variantIndices'); +const $isActive = Symbol('isActive'); +const $modelVariants = Symbol('modelVariants'); +const $name = Symbol('name'); +const $pbrTextures = Symbol('pbrTextures'); +/** + * Material facade implementation for Three.js materials + */ +class Material extends ThreeDOMElement { + get [(_a$3 = $variantIndices, _b$3 = $pbrTextures, $backingThreeMaterial)]() { + return this[$correlatedObjects] + .values() + .next() + .value; + } + constructor(onUpdate, gltfIndex, isActive, modelVariants, correlatedMaterials, name, lazyLoadInfo = undefined) { + super(onUpdate, correlatedMaterials); + this[_a$3] = new Set(); + this[_b$3] = new Map(); + this[$gltfIndex] = gltfIndex; + this[$isActive] = isActive; + this[$modelVariants] = modelVariants; + this[$name] = name; + if (lazyLoadInfo == null) { + this[$initialize](); + } + else { + this[$lazyLoadGLTFInfo] = lazyLoadInfo; + } + } + [$initialize]() { + const onUpdate = this[$onUpdate$1]; + const correlatedMaterials = this[$correlatedObjects]; + this[$pbrMetallicRoughness] = + new PBRMetallicRoughness(onUpdate, correlatedMaterials); + const { normalMap, aoMap, emissiveMap } = correlatedMaterials.values().next().value; + this[$normalTexture] = new TextureInfo(onUpdate, TextureUsage.Normal, normalMap, correlatedMaterials); + this[$occlusionTexture] = new TextureInfo(onUpdate, TextureUsage.Occlusion, aoMap, correlatedMaterials); + this[$emissiveTexture] = new TextureInfo(onUpdate, TextureUsage.Emissive, emissiveMap, correlatedMaterials); + const createTextureInfo = (usage) => { + this[$pbrTextures].set(usage, new TextureInfo(onUpdate, usage, null, correlatedMaterials)); + }; + createTextureInfo(TextureUsage.Clearcoat); + createTextureInfo(TextureUsage.ClearcoatRoughness); + createTextureInfo(TextureUsage.ClearcoatNormal); + createTextureInfo(TextureUsage.SheenColor); + createTextureInfo(TextureUsage.SheenRoughness); + createTextureInfo(TextureUsage.Transmission); + createTextureInfo(TextureUsage.Thickness); + createTextureInfo(TextureUsage.Specular); + createTextureInfo(TextureUsage.SpecularColor); + createTextureInfo(TextureUsage.Iridescence); + createTextureInfo(TextureUsage.IridescenceThickness); + createTextureInfo(TextureUsage.Anisotropy); + } + async [$getLoadedMaterial]() { + if (this[$lazyLoadGLTFInfo] != null) { + const material = await this[$lazyLoadGLTFInfo].doLazyLoad(); + this[$initialize](); + // Releases lazy load info. + this[$lazyLoadGLTFInfo] = undefined; + // Redefines the method as a noop method. + this.ensureLoaded = async () => { }; + return material; + } + return null; + } + colorFromRgb(rgb) { + const color = new Color(); + if (rgb instanceof Array) { + color.fromArray(rgb); + } + else { + color.set(rgb); + } + return color; + } + [$ensureMaterialIsLoaded]() { + if (this[$lazyLoadGLTFInfo] == null) { + return; + } + throw new Error(`Material "${this.name}" has not been loaded, call 'await + myMaterial.ensureLoaded()' before using an unloaded material.`); + } + async ensureLoaded() { + await this[$getLoadedMaterial](); + } + get isLoaded() { + return this[$lazyLoadGLTFInfo] == null; + } + get isActive() { + return this[$isActive]; + } + [$setActive](isActive) { + this[$isActive] = isActive; + } + get name() { + return this[$name] || ''; + } + set name(name) { + this[$name] = name; + if (this[$correlatedObjects] != null) { + for (const threeMaterial of this[$correlatedObjects]) { + threeMaterial.name = name; + } + } + } + get pbrMetallicRoughness() { + this[$ensureMaterialIsLoaded](); + return this[$pbrMetallicRoughness]; + } + get normalTexture() { + this[$ensureMaterialIsLoaded](); + return this[$normalTexture]; + } + get occlusionTexture() { + this[$ensureMaterialIsLoaded](); + return this[$occlusionTexture]; + } + get emissiveTexture() { + this[$ensureMaterialIsLoaded](); + return this[$emissiveTexture]; + } + get emissiveFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].emissive.toArray(); + } + get index() { + return this[$gltfIndex]; + } + hasVariant(name) { + const variantData = this[$modelVariants].get(name); + return variantData != null && this[$variantIndices].has(variantData.index); + } + setEmissiveFactor(rgb) { + this[$ensureMaterialIsLoaded](); + const color = this.colorFromRgb(rgb); + for (const material of this[$correlatedObjects]) { + material.emissive.set(color); + } + this[$onUpdate$1](); + } + [$getAlphaMode]() { + // Follows implementation of GLTFExporter from three.js + if (this[$backingThreeMaterial].transparent) { + return 'BLEND'; + } + else { + if (this[$backingThreeMaterial].alphaTest > 0.0) { + return 'MASK'; + } + } + return 'OPAQUE'; + } + [$applyAlphaCutoff]() { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + if (this[$getAlphaMode]() === 'MASK') { + if (material.alphaTest == undefined) { + material.alphaTest = 0.5; + } + } + else { + material.alphaTest = undefined; + } + material.needsUpdate = true; + } + } + setAlphaCutoff(cutoff) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.alphaTest = cutoff; + material.needsUpdate = true; + } + // Set AlphaCutoff to undefined if AlphaMode is not MASK. + this[$applyAlphaCutoff](); + this[$onUpdate$1](); + } + getAlphaCutoff() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].alphaTest; + } + setDoubleSided(doubleSided) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + // When double-sided is disabled gltf spec dictates that Back-Face culling + // must be disabled, in three.js parlance that would mean FrontSide + // rendering only. + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#double-sided + material.side = doubleSided ? DoubleSide : FrontSide; + material.needsUpdate = true; + } + this[$onUpdate$1](); + } + getDoubleSided() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].side == DoubleSide; + } + setAlphaMode(alphaMode) { + this[$ensureMaterialIsLoaded](); + const enableTransparency = (material, enabled) => { + material.transparent = enabled; + material.depthWrite = !enabled; + }; + for (const material of this[$correlatedObjects]) { + enableTransparency(material, alphaMode === 'BLEND'); + if (alphaMode === 'MASK') { + material.alphaTest = 0.5; + } + else { + material.alphaTest = undefined; + } + material.needsUpdate = true; + } + this[$onUpdate$1](); + } + getAlphaMode() { + this[$ensureMaterialIsLoaded](); + return this[$getAlphaMode](); + } + /** + * PBR Next properties. + */ + // KHR_materials_emissive_strength + get emissiveStrength() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].emissiveIntensity; + } + setEmissiveStrength(emissiveStrength) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.emissiveIntensity = emissiveStrength; + } + this[$onUpdate$1](); + } + // KHR_materials_clearcoat + get clearcoatFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].clearcoat; + } + get clearcoatRoughnessFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].clearcoatRoughness; + } + get clearcoatTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Clearcoat); + } + get clearcoatRoughnessTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.ClearcoatRoughness); + } + get clearcoatNormalTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.ClearcoatNormal); + } + get clearcoatNormalScale() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].clearcoatNormalScale.x; + } + setClearcoatFactor(clearcoatFactor) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.clearcoat = clearcoatFactor; + } + this[$onUpdate$1](); + } + setClearcoatRoughnessFactor(clearcoatRoughnessFactor) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.clearcoatRoughness = clearcoatRoughnessFactor; + } + this[$onUpdate$1](); + } + setClearcoatNormalScale(clearcoatNormalScale) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.clearcoatNormalScale = + new Vector2(clearcoatNormalScale, clearcoatNormalScale); + } + this[$onUpdate$1](); + } + // KHR_materials_ior + get ior() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].ior; + } + setIor(ior) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.ior = ior; + } + this[$onUpdate$1](); + } + // KHR_materials_sheen + get sheenColorFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].sheenColor.toArray(); + } + get sheenColorTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.SheenColor); + } + get sheenRoughnessFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].sheenRoughness; + } + get sheenRoughnessTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.SheenRoughness); + } + setSheenColorFactor(rgb) { + this[$ensureMaterialIsLoaded](); + const color = this.colorFromRgb(rgb); + for (const material of this[$correlatedObjects]) { + material.sheenColor.set(color); + // Three.js GLTFExporter checks for internal sheen value. + material.sheen = 1; + } + this[$onUpdate$1](); + } + setSheenRoughnessFactor(roughness) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.sheenRoughness = roughness; + // Three.js GLTFExporter checks for internal sheen value. + material.sheen = 1; + } + this[$onUpdate$1](); + } + // KHR_materials_transmission + get transmissionFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].transmission; + } + get transmissionTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Transmission); + } + setTransmissionFactor(transmission) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.transmission = transmission; + } + this[$onUpdate$1](); + } + // KHR_materials_volume + get thicknessFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].thickness; + } + get thicknessTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Thickness); + } + get attenuationDistance() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].attenuationDistance; + } + get attenuationColor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].attenuationColor.toArray(); + } + setThicknessFactor(thickness) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.thickness = thickness; + } + this[$onUpdate$1](); + } + setAttenuationDistance(attenuationDistance) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.attenuationDistance = attenuationDistance; + } + this[$onUpdate$1](); + } + setAttenuationColor(rgb) { + this[$ensureMaterialIsLoaded](); + const color = this.colorFromRgb(rgb); + for (const material of this[$correlatedObjects]) { + material.attenuationColor.set(color); + } + this[$onUpdate$1](); + } + // KHR_materials_specular + get specularFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].specularIntensity; + } + get specularTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Specular); + } + get specularColorFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].specularColor.toArray(); + } + get specularColorTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.SheenColor); + } + setSpecularFactor(specularFactor) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.specularIntensity = specularFactor; + } + this[$onUpdate$1](); + } + setSpecularColorFactor(rgb) { + this[$ensureMaterialIsLoaded](); + const color = this.colorFromRgb(rgb); + for (const material of this[$correlatedObjects]) { + material.specularColor.set(color); + } + this[$onUpdate$1](); + } + // KHR_materials_iridescence + get iridescenceFactor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].iridescence; + } + get iridescenceTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Iridescence); + } + get iridescenceIor() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].iridescenceIOR; + } + get iridescenceThicknessMinimum() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].iridescenceThicknessRange[0]; + } + get iridescenceThicknessMaximum() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].iridescenceThicknessRange[1]; + } + get iridescenceThicknessTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.IridescenceThickness); + } + setIridescenceFactor(iridescence) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.iridescence = iridescence; + } + this[$onUpdate$1](); + } + setIridescenceIor(ior) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.iridescenceIOR = ior; + } + this[$onUpdate$1](); + } + setIridescenceThicknessMinimum(thicknessMin) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.iridescenceThicknessRange[0] = thicknessMin; + } + this[$onUpdate$1](); + } + setIridescenceThicknessMaximum(thicknessMax) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.iridescenceThicknessRange[1] = thicknessMax; + } + this[$onUpdate$1](); + } + // KHR_materials_anisotropy + get anisotropyStrength() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].anisotropy; + } + get anisotropyRotation() { + this[$ensureMaterialIsLoaded](); + return this[$backingThreeMaterial].anisotropyRotation; + } + get anisotropyTexture() { + this[$ensureMaterialIsLoaded](); + return this[$pbrTextures].get(TextureUsage.Anisotropy); + } + setAnisotropyStrength(strength) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.anisotropy = strength; + } + this[$onUpdate$1](); + } + setAnisotropyRotation(rotation) { + this[$ensureMaterialIsLoaded](); + for (const material of this[$correlatedObjects]) { + material.anisotropyRotation = rotation; + } + this[$onUpdate$1](); + } +} + +// Defines the base level node methods and data. +let Node$1 = class Node { + constructor(name) { + this.name = ''; + this.children = new Array(); + this.name = name; + } +}; +// Represents a primitive in a glTF mesh. +class PrimitiveNode extends Node$1 { + constructor(mesh, mvMaterials, modelVariants, correlatedSceneGraph) { + super(mesh.name); + // Maps glTF material index number to a material that this primitive supports. + this.materials = new Map(); + // Maps variant index to material. + this.variantToMaterialMap = new Map(); + this.initialMaterialIdx = 0; + this.activeMaterialIdx = 0; + this.mesh = mesh; + const { gltf, threeGLTF, threeObjectMap } = correlatedSceneGraph; + this.parser = threeGLTF.parser; + this.modelVariants = modelVariants; + this.mesh.userData.variantData = modelVariants; + // Captures the primitive's initial material. + const materialMappings = threeObjectMap.get(mesh.material); + if (materialMappings.materials != null) { + this.initialMaterialIdx = this.activeMaterialIdx = + materialMappings.materials; + } + else { + console.error(`Primitive (${mesh.name}) missing initial material reference.`); + } + // Gets the mesh index from the node. + const associations = mesh.userData.associations || + {}; + if (associations.meshes == null) { + console.error('Mesh is missing primitive index association'); + return; + } + // The gltf mesh array to sample from. + const meshElementArray = gltf['meshes'] || []; + // List of primitives under the mesh. + const gltfPrimitives = (meshElementArray[associations.meshes].primitives || []); + const gltfPrimitive = gltfPrimitives[associations.primitives]; + if (gltfPrimitive == null) { + console.error('Mesh primitive definition is missing.'); + return; + } + // Maps the gltfPrimitive default to a material. + if (gltfPrimitive.material != null) { + this.materials.set(gltfPrimitive.material, mvMaterials[gltfPrimitive.material]); + } + else { + const defaultIdx = mvMaterials.findIndex((mat) => { + return mat.name === 'Default'; + }); + if (defaultIdx >= 0) { + this.materials.set(defaultIdx, mvMaterials[defaultIdx]); + } + else { + console.warn('gltfPrimitive has no material!'); + } + } + if (gltfPrimitive.extensions && + gltfPrimitive.extensions['KHR_materials_variants']) { + const variantsExtension = gltfPrimitive.extensions['KHR_materials_variants']; + const extensions = threeGLTF.parser.json.extensions; + const variantNames = extensions['KHR_materials_variants'].variants; + // Provides definition now that we know there are variants to + // support. + for (const mapping of variantsExtension.mappings) { + const mvMaterial = mvMaterials[mapping.material]; + // Maps variant indices to Materials. + this.materials.set(mapping.material, mvMaterial); + for (const variant of mapping.variants) { + const { name } = variantNames[variant]; + this.variantToMaterialMap.set(variant, mvMaterial); + // Provides variant info for material self lookup. + mvMaterial[$variantIndices].add(variant); + // Updates the models variant data. + if (!modelVariants.has(name)) { + modelVariants.set(name, { name, index: variant }); + } + } + } + } + } + async setActiveMaterial(material) { + const mvMaterial = this.materials.get(material); + if (material !== this.activeMaterialIdx) { + const backingMaterials = mvMaterial[$correlatedObjects]; + const baseMaterial = await mvMaterial[$getLoadedMaterial](); + if (baseMaterial != null) { + this.mesh.material = baseMaterial; + } + else { + this.mesh.material = backingMaterials.values().next().value; + } + this.parser.assignFinalMaterial(this.mesh); + backingMaterials.add(this.mesh.material); + this.activeMaterialIdx = material; + } + return this.mesh.material; + } + getActiveMaterial() { + return this.materials.get(this.activeMaterialIdx); + } + getMaterial(index) { + return this.materials.get(index); + } + async enableVariant(name) { + if (name == null) { + return this.setActiveMaterial(this.initialMaterialIdx); + } + if (this.variantToMaterialMap != null && this.modelVariants.has(name)) { + const modelVariants = this.modelVariants.get(name); + return this.enableVariantHelper(modelVariants.index); + } + return null; + } + async enableVariantHelper(index) { + if (this.variantToMaterialMap != null && index != null) { + const material = this.variantToMaterialMap.get(index); + if (material != null) { + return this.setActiveMaterial(material.index); + } + } + return null; + } + async instantiateVariants() { + if (this.variantToMaterialMap == null) { + return; + } + for (const index of this.variantToMaterialMap.keys()) { + const variantMaterial = this.mesh.userData.variantMaterials.get(index); + if (variantMaterial.material != null) { + continue; + } + const threeMaterial = await this.enableVariantHelper(index); + if (threeMaterial != null) { + variantMaterial.material = threeMaterial; + } + } + } + get variantInfo() { + return this.variantToMaterialMap; + } + addVariant(materialVariant, variantName) { + if (!this.ensureVariantIsUnused(variantName)) { + return false; + } + // Adds the variant to the model variants if needed. + if (!this.modelVariants.has(variantName)) { + this.modelVariants.set(variantName, { name: variantName, index: this.modelVariants.size }); + } + const modelVariantData = this.modelVariants.get(variantName); + const variantIndex = modelVariantData.index; + // Updates materials mapped to the variant. + materialVariant[$variantIndices].add(variantIndex); + // Updates internal mappings. + this.variantToMaterialMap.set(variantIndex, materialVariant); + this.materials.set(materialVariant.index, materialVariant); + this.updateVariantUserData(variantIndex, materialVariant); + return true; + } + deleteVariant(variantIndex) { + if (this.variantInfo.has(variantIndex)) { + this.variantInfo.delete(variantIndex); + const userDataMap = this.mesh.userData.variantMaterials; + if (userDataMap != null) { + userDataMap.delete(variantIndex); + } + } + } + updateVariantUserData(variantIndex, materialVariant) { + // Adds variants name to material variants set. + materialVariant[$variantIndices].add(variantIndex); + this.mesh.userData.variantData = this.modelVariants; + // Updates import data (see VariantMaterialLoaderPlugin.ts). + this.mesh.userData.variantMaterials = this.mesh.userData.variantMaterials || + new Map(); + const map = this.mesh.userData.variantMaterials; + map.set(variantIndex, { + material: materialVariant[$correlatedObjects].values().next().value, + gltfMaterialIndex: materialVariant.index, + }); + } + ensureVariantIsUnused(variantName) { + const modelVariants = this.modelVariants.get(variantName); + if (modelVariants != null && this.variantInfo.has(modelVariants.index)) { + console.warn(`Primitive cannot add variant '${variantName}' for this material, it already exists.`); + return false; + } + return true; + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var _a$2, _b$2, _c$1, _d$1, _e$1, _f$1; +const $materials = Symbol('materials'); +const $hierarchy = Symbol('hierarchy'); +const $roots = Symbol('roots'); +const $primitivesList = Symbol('primitives'); +const $prepareVariantsForExport = Symbol('prepareVariantsForExport'); +const $switchVariant = Symbol('switchVariant'); +const $materialFromPoint = Symbol('materialFromPoint'); +const $nodeFromPoint = Symbol('nodeFromPoint'); +const $nodeFromIndex = Symbol('nodeFromIndex'); +const $variantData = Symbol('variantData'); +const $availableVariants = Symbol('availableVariants'); +const $modelOnUpdate = Symbol('modelOnUpdate'); +const $cloneMaterial = Symbol('cloneMaterial'); +// Holds onto temporary scene context information needed to perform lazy loading +// of a resource. +class LazyLoader { + constructor(gltf, gltfElementMap, mapKey, doLazyLoad) { + this.gltf = gltf; + this.gltfElementMap = gltfElementMap; + this.mapKey = mapKey; + this.doLazyLoad = doLazyLoad; + } +} +/** + * A Model facades the top-level GLTF object returned by Three.js' GLTFLoader. + * Currently, the model only bothers itself with the materials in the Three.js + * scene graph. + */ +class Model { + constructor(correlatedSceneGraph, onUpdate = () => { }) { + this[_a$2] = new Array(); + this[_b$2] = new Array(); + this[_c$1] = new Array(); + this[_d$1] = new Array(); + this[_e$1] = () => { }; + this[_f$1] = new Map(); + this[$modelOnUpdate] = onUpdate; + const { gltf, threeGLTF, gltfElementMap } = correlatedSceneGraph; + for (const [i, material] of gltf.materials.entries()) { + const correlatedMaterial = gltfElementMap.get(material); + if (correlatedMaterial != null) { + this[$materials].push(new Material(onUpdate, i, true, this[$variantData], correlatedMaterial, material.name)); + } + else { + const elementArray = gltf['materials'] || []; + const gltfMaterialDef = elementArray[i]; + const threeMaterialSet = new Set(); + gltfElementMap.set(gltfMaterialDef, threeMaterialSet); + const materialLoadCallback = async () => { + const threeMaterial = await threeGLTF.parser.getDependency('material', i); + threeMaterialSet.add(threeMaterial); + return threeMaterial; + }; + // Configures the material for lazy loading. + this[$materials].push(new Material(onUpdate, i, false, this[$variantData], threeMaterialSet, material.name, new LazyLoader(gltf, gltfElementMap, gltfMaterialDef, materialLoadCallback))); + } + } + // Creates a hierarchy of Nodes. Allows not just for switching which + // material is applied to a mesh but also exposes a way to provide API + // for switching materials and general assignment/modification. + // Prepares for scene iteration. + const parentMap = new Map(); + const nodeStack = new Array(); + for (const object of threeGLTF.scene.children) { + nodeStack.push(object); + } + // Walks the hierarchy and creates a node tree. + while (nodeStack.length > 0) { + const object = nodeStack.pop(); + let node = null; + if (object instanceof Mesh) { + node = new PrimitiveNode(object, this.materials, this[$variantData], correlatedSceneGraph); + this[$primitivesList].push(node); + } + else { + node = new Node$1(object.name); + } + const parent = parentMap.get(object); + if (parent != null) { + parent.children.push(node); + } + else { + this[$roots].push(node); + } + this[$hierarchy].push(node); + for (const child of object.children) { + nodeStack.push(child); + parentMap.set(object, node); + } + } + } + /** + * Materials are listed in the order of the GLTF materials array, plus a + * default material at the end if one is used. + * + * TODO(#1003): How do we handle non-active scenes? + */ + get materials() { + return this[$materials]; + } + [(_a$2 = $materials, _b$2 = $hierarchy, _c$1 = $roots, _d$1 = $primitivesList, _e$1 = $modelOnUpdate, _f$1 = $variantData, $availableVariants)]() { + const variants = Array.from(this[$variantData].values()); + variants.sort((a, b) => { + return a.index - b.index; + }); + return variants.map((data) => { + return data.name; + }); + } + getMaterialByName(name) { + const matches = this[$materials].filter(material => { + return material.name === name; + }); + if (matches.length > 0) { + return matches[0]; + } + return null; + } + [$nodeFromIndex](mesh, primitive) { + const found = this[$hierarchy].find((node) => { + if (node instanceof PrimitiveNode) { + const { meshes, primitives } = node.mesh.userData.associations; + if (meshes == mesh && primitives == primitive) { + return true; + } + } + return false; + }); + return found == null ? null : found; + } + [$nodeFromPoint](hit) { + return this[$hierarchy].find((node) => { + if (node instanceof PrimitiveNode) { + const primitive = node; + if (primitive.mesh === hit.object) { + return true; + } + } + return false; + }); + } + /** + * Intersects a ray with the Model and returns the first material whose + * object was intersected. + */ + [$materialFromPoint](hit) { + return this[$nodeFromPoint](hit).getActiveMaterial(); + } + /** + * Switches model variant to the variant name provided, or switches to + * default/initial materials if 'null' is provided. + */ + async [$switchVariant](variantName) { + for (const primitive of this[$primitivesList]) { + await primitive.enableVariant(variantName); + } + for (const material of this.materials) { + material[$setActive](false); + } + // Marks the materials that are now in use after the variant switch. + for (const primitive of this[$primitivesList]) { + this.materials[primitive.getActiveMaterial().index][$setActive](true); + } + } + async [$prepareVariantsForExport]() { + const promises = new Array(); + for (const primitive of this[$primitivesList]) { + promises.push(primitive.instantiateVariants()); + } + await Promise.all(promises); + } + [$cloneMaterial](index, newMaterialName) { + const material = this.materials[index]; + if (!material.isLoaded) { + console.error(`Cloning an unloaded material, + call 'material.ensureLoaded() before cloning the material.`); + } + const threeMaterialSet = material[$correlatedObjects]; + const clonedSet = new Set(); + for (const [i, threeMaterial] of threeMaterialSet.entries()) { + const clone = threeMaterial.clone(); + clone.name = + newMaterialName + (threeMaterialSet.size > 1 ? '_inst' + i : ''); + clonedSet.add(clone); + } + const clonedMaterial = new Material(this[$modelOnUpdate], this[$materials].length, false, // Cloned as inactive. + this[$variantData], clonedSet, newMaterialName); + this[$materials].push(clonedMaterial); + return clonedMaterial; + } + createMaterialInstanceForVariant(originalMaterialIndex, newMaterialName, variantName, activateVariant = true) { + let variantMaterialInstance = null; + for (const primitive of this[$primitivesList]) { + const variantData = this[$variantData].get(variantName); + // Skips the primitive if the variant already exists. + if (variantData != null && primitive.variantInfo.has(variantData.index)) { + continue; + } + // Skips the primitive if the source/original material does not exist. + if (primitive.getMaterial(originalMaterialIndex) == null) { + continue; + } + if (!this.hasVariant(variantName)) { + this.createVariant(variantName); + } + if (variantMaterialInstance == null) { + variantMaterialInstance = + this[$cloneMaterial](originalMaterialIndex, newMaterialName); + } + primitive.addVariant(variantMaterialInstance, variantName); + } + if (activateVariant && variantMaterialInstance != null) { + variantMaterialInstance[$setActive](true); + this.materials[originalMaterialIndex][$setActive](false); + for (const primitive of this[$primitivesList]) { + primitive.enableVariant(variantName); + } + } + return variantMaterialInstance; + } + createVariant(variantName) { + if (!this[$variantData].has(variantName)) { + // Adds the name if it's not already in the list. + this[$variantData].set(variantName, { name: variantName, index: this[$variantData].size }); + } + else { + console.warn(`Variant '${variantName}'' already exists`); + } + } + hasVariant(variantName) { + return this[$variantData].has(variantName); + } + setMaterialToVariant(materialIndex, targetVariantName) { + if (this[$availableVariants]().find(name => name === targetVariantName) == + null) { + console.warn(`Can't add material to '${targetVariantName}', the variant does not exist.'`); + return; + } + if (materialIndex < 0 || materialIndex >= this.materials.length) { + console.error(`setMaterialToVariant(): materialIndex is out of bounds.`); + return; + } + for (const primitive of this[$primitivesList]) { + const material = primitive.getMaterial(materialIndex); + // Ensures the material exists on the primitive before setting it to a + // variant. + if (material != null) { + primitive.addVariant(material, targetVariantName); + } + } + } + updateVariantName(currentName, newName) { + const variantData = this[$variantData].get(currentName); + if (variantData == null) { + return; + } + variantData.name = newName; + this[$variantData].set(newName, variantData); + this[$variantData].delete(currentName); + } + deleteVariant(variantName) { + const variant = this[$variantData].get(variantName); + if (variant == null) { + return; + } + for (const material of this.materials) { + if (material.hasVariant(variantName)) { + material[$variantIndices].delete(variant.index); + } + } + for (const primitive of this[$primitivesList]) { + primitive.deleteVariant(variant.index); + } + this[$variantData].delete(variantName); + } +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$5 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +const $currentGLTF = Symbol('currentGLTF'); +const $originalGltfJson = Symbol('originalGltfJson'); +const $model = Symbol('model'); +const $getOnUpdateMethod = Symbol('getOnUpdateMethod'); +const $buildTexture = Symbol('buildTexture'); +/** + * SceneGraphMixin manages exposes a model API in order to support operations on + * the scene graph. + */ +const SceneGraphMixin = (ModelViewerElement) => { + var _a, _b, _c; + class SceneGraphModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this[_a] = undefined; + this[_b] = null; + this[_c] = null; + this.variantName = null; + this.orientation = '0 0 0'; + this.scale = '1 1 1'; + } + // Scene-graph API: + /** @export */ + get model() { + return this[$model]; + } + get availableVariants() { + return this.model ? this.model[$availableVariants]() : []; + } + /** + * Returns a deep copy of the gltf JSON as loaded. It will not reflect + * changes to the scene-graph, nor will editing it have any effect. + */ + get originalGltfJson() { + return this[$originalGltfJson]; + } + [(_a = $model, _b = $currentGLTF, _c = $originalGltfJson, $getOnUpdateMethod)]() { + return () => { + this[$needsRender](); + }; + } + [$buildTexture](texture) { + // Applies glTF default settings. + texture.colorSpace = SRGBColorSpace; + texture.wrapS = RepeatWrapping; + texture.wrapT = RepeatWrapping; + return new Texture(this[$getOnUpdateMethod](), texture); + } + async createTexture(uri, type = 'image/png') { + const { textureUtils } = this[$renderer]; + const texture = await textureUtils.loadImage(uri, this.withCredentials); + texture.userData.mimeType = type; + return this[$buildTexture](texture); + } + async createLottieTexture(uri, quality = 1) { + const { textureUtils } = this[$renderer]; + const texture = await textureUtils.loadLottie(uri, quality, this.withCredentials); + return this[$buildTexture](texture); + } + createVideoTexture(uri) { + const video = document.createElement('video'); + video.crossOrigin = + this.withCredentials ? 'use-credentials' : 'anonymous'; + video.src = uri; + video.muted = true; + video.playsInline = true; + video.loop = true; + video.play(); + const texture = new VideoTexture(video); + return this[$buildTexture](texture); + } + createCanvasTexture() { + const canvas = document.createElement('canvas'); + const texture = new CanvasTexture(canvas); + return this[$buildTexture](texture); + } + async updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('variantName')) { + const updateVariantProgress = this[$progressTracker].beginActivity('variant-update'); + updateVariantProgress(0.1); + const model = this[$model]; + const { variantName } = this; + if (model != null) { + await model[$switchVariant](variantName); + this[$needsRender](); + this.dispatchEvent(new CustomEvent('variant-applied')); + } + updateVariantProgress(1.0); + } + if (changedProperties.has('orientation') || + changedProperties.has('scale')) { + if (!this.loaded) { + return; + } + const scene = this[$scene]; + scene.applyTransform(); + scene.updateBoundingBox(); + scene.updateShadow(); + this[$renderer].arRenderer.onUpdateScene(); + this[$needsRender](); + } + } + [$onModelLoad]() { + super[$onModelLoad](); + const { currentGLTF } = this[$scene]; + if (currentGLTF != null) { + const { correlatedSceneGraph } = currentGLTF; + if (correlatedSceneGraph != null && + currentGLTF !== this[$currentGLTF]) { + this[$model] = + new Model(correlatedSceneGraph, this[$getOnUpdateMethod]()); + this[$originalGltfJson] = + JSON.parse(JSON.stringify(correlatedSceneGraph.gltf)); + } + // KHR_materials_variants extension spec: + // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_variants + if ('variants' in currentGLTF.userData) { + this.requestUpdate('variantName'); + } + } + this[$currentGLTF] = currentGLTF; + } + /** @export */ + async exportScene(options) { + const scene = this[$scene]; + return new Promise(async (resolve, reject) => { + // Defaults + const opts = { + binary: true, + onlyVisible: true, + maxTextureSize: Infinity, + includeCustomExtensions: false, + forceIndices: false + }; + Object.assign(opts, options); + // Not configurable + opts.animations = scene.animations; + opts.truncateDrawRange = true; + const shadow = scene.shadow; + let visible = false; + // Remove shadow from export + if (shadow != null) { + visible = shadow.visible; + shadow.visible = false; + } + await this[$model][$prepareVariantsForExport](); + const exporter = new GLTFExporter() + .register((writer) => new GLTFExporterMaterialsVariantsExtension(writer)); + exporter.parse(scene.model, (gltf) => { + return resolve(new Blob([opts.binary ? gltf : JSON.stringify(gltf)], { + type: opts.binary ? 'application/octet-stream' : + 'application/json' + })); + }, () => { + return reject('glTF export failed'); + }, opts); + if (shadow != null) { + shadow.visible = visible; + } + }); + } + materialFromPoint(pixelX, pixelY) { + const model = this[$model]; + if (model == null) { + return null; + } + const scene = this[$scene]; + const ndcCoords = scene.getNDC(pixelX, pixelY); + const hit = scene.hitFromPoint(ndcCoords); + if (hit == null || hit.face == null) { + return null; + } + return model[$materialFromPoint](hit); + } + } + __decorate$5([ + property({ type: String, attribute: 'variant-name' }) + ], SceneGraphModelViewerElement.prototype, "variantName", void 0); + __decorate$5([ + property({ type: String, attribute: 'orientation' }) + ], SceneGraphModelViewerElement.prototype, "orientation", void 0); + __decorate$5([ + property({ type: String, attribute: 'scale' }) + ], SceneGraphModelViewerElement.prototype, "scale", void 0); + return SceneGraphModelViewerElement; +}; + +/* @license + * Copyright 2023 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +class GroundedSkybox extends Mesh { + constructor() { + super(undefined, new MeshBasicMaterial({ depthWrite: false })); + this.height = 0; + this.radius = 0; + this.resolution = 0; + this.userData.noHit = true; + } + get map() { + return this.material.map; + } + set map(skybox) { + this.material.map = skybox; + } + isUsable() { + return this.height > 0 && this.radius > 0 && this.geometry != null && + this.map != null; + } + updateGeometry(height = this.height, radius = this.radius, resolution = 128) { + if (height != this.height || radius != this.radius || + resolution != this.resolution) { + this.height = height; + this.radius = radius; + this.resolution = resolution; + if (height > 0 && radius > 0) { + this.geometry.dispose(); + this.geometry = makeGeometry(height, radius, resolution); + } + } + } +} +function makeGeometry(height, radius, resolution) { + const geometry = new SphereGeometry(radius, 2 * resolution, resolution); + geometry.scale(1, 1, -1); + const pos = geometry.getAttribute('position'); + const tmp = new Vector3(); + for (let i = 0; i < pos.count; ++i) { + tmp.fromBufferAttribute(pos, i); + if (tmp.y < 0) { + // Smooth out the transition from flat floor to sphere: + const y1 = -height * 3 / 2; + const f = tmp.y < y1 ? -height / tmp.y : (1 - tmp.y * tmp.y / (3 * y1 * y1)); + tmp.multiplyScalar(f); + tmp.toArray(pos.array, 3 * i); + } + } + pos.needsUpdate = true; + return geometry; +} + +/* @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const a = new Vector3(); +const b = new Vector3(); +const c = new Vector3(); +const mat = new Matrix3(); +const triangle = new Triangle(); +const quat = new Quaternion(); +/** + * The Hotspot object is a reference-counted slot. If decrement() returns true, + * it should be removed from the tree so it can be garbage-collected. + */ +class Hotspot extends CSS2DObject { + constructor(config) { + super(document.createElement('div')); + this.normal = new Vector3(0, 1, 0); + this.initialized = false; + this.referenceCount = 1; + this.pivot = document.createElement('div'); + this.slot = document.createElement('slot'); + this.element.classList.add('annotation-wrapper'); + this.slot.name = config.name; + this.element.appendChild(this.pivot); + this.pivot.appendChild(this.slot); + this.updatePosition(config.position); + this.updateNormal(config.normal); + this.surface = config.surface; + } + get facingCamera() { + return !this.element.classList.contains('hide'); + } + /** + * Sets the hotspot to be in the highly visible foreground state. + */ + show() { + if (!this.facingCamera || !this.initialized) { + this.updateVisibility(true); + } + } + /** + * Sets the hotspot to be in the diminished background state. + */ + hide() { + if (this.facingCamera || !this.initialized) { + this.updateVisibility(false); + } + } + /** + * Call this when adding elements to the same slot to keep track. + */ + increment() { + this.referenceCount++; + } + /** + * Call this when removing elements from the slot; returns true when the slot + * is unused. + */ + decrement() { + if (this.referenceCount > 0) { + --this.referenceCount; + } + return this.referenceCount === 0; + } + /** + * Change the position of the hotspot to the input string, in the same format + * as the data-position attribute. + */ + updatePosition(position) { + if (position == null) + return; + const positionNodes = parseExpressions(position)[0].terms; + for (let i = 0; i < 3; ++i) { + this.position.setComponent(i, normalizeUnit(positionNodes[i]).number); + } + this.updateMatrixWorld(); + } + /** + * Change the hotspot's normal to the input string, in the same format as the + * data-normal attribute. + */ + updateNormal(normal) { + if (normal == null) + return; + const normalNodes = parseExpressions(normal)[0].terms; + for (let i = 0; i < 3; ++i) { + this.normal.setComponent(i, normalNodes[i].number); + } + } + updateSurface() { + const { mesh, tri, bary } = this; + if (mesh == null || tri == null || bary == null) { + return; + } + mesh.getVertexPosition(tri.x, a); + mesh.getVertexPosition(tri.y, b); + mesh.getVertexPosition(tri.z, c); + a.toArray(mat.elements, 0); + b.toArray(mat.elements, 3); + c.toArray(mat.elements, 6); + this.position.copy(bary).applyMatrix3(mat); + const target = this.parent; + target.worldToLocal(mesh.localToWorld(this.position)); + triangle.set(a, b, c); + triangle.getNormal(this.normal).transformDirection(mesh.matrixWorld); + const pivot = target.parent; + quat.setFromAxisAngle(a.set(0, 1, 0), -pivot.rotation.y); + this.normal.applyQuaternion(quat); + } + orient(radians) { + this.pivot.style.transform = `rotate(${radians}rad)`; + } + updateVisibility(show) { + this.element.classList.toggle('hide', !show); + // NOTE: ShadyDOM doesn't support slot.assignedElements, otherwise we could + // use that here. + this.slot.assignedNodes().forEach((node) => { + if (node.nodeType !== Node.ELEMENT_NODE) { + return; + } + const element = node; + // Visibility attribute can be configured per-node in the hotspot: + const visibilityAttribute = element.dataset.visibilityAttribute; + if (visibilityAttribute != null) { + const attributeName = `data-${visibilityAttribute}`; + element.toggleAttribute(attributeName, show); + } + element.dispatchEvent(new CustomEvent('hotspot-visibility', { + detail: { + visible: show, + }, + })); + }); + this.initialized = true; + } +} + +/** + * Two pass Gaussian blur filter (horizontal and vertical blur shaders) + * - see http://www.cake23.de/traveling-wavefronts-lit-up.html + * + * - 9 samples per pass + * - standard deviation 2.7 + * - "h" and "v" parameters should be set to "1 / width" and "1 / height" + */ + +const HorizontalBlurShader = { + + name: 'HorizontalBlurShader', + + uniforms: { + + 'tDiffuse': { value: null }, + 'h': { value: 1.0 / 512.0 } + + }, + + vertexShader: /* glsl */` + + varying vec2 vUv; + + void main() { + + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + }`, + + fragmentShader: /* glsl */` + + uniform sampler2D tDiffuse; + uniform float h; + + varying vec2 vUv; + + void main() { + + vec4 sum = vec4( 0.0 ); + + sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051; + sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918; + sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245; + sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633; + sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531; + sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245; + sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918; + sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051; + + gl_FragColor = sum; + + }` + +}; + +/** + * Two pass Gaussian blur filter (horizontal and vertical blur shaders) + * - see http://www.cake23.de/traveling-wavefronts-lit-up.html + * + * - 9 samples per pass + * - standard deviation 2.7 + * - "h" and "v" parameters should be set to "1 / width" and "1 / height" + */ + +const VerticalBlurShader = { + + name: 'VerticalBlurShader', + + uniforms: { + + 'tDiffuse': { value: null }, + 'v': { value: 1.0 / 512.0 } + + }, + + vertexShader: /* glsl */` + + varying vec2 vUv; + + void main() { + + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + }`, + + fragmentShader: /* glsl */` + + uniform sampler2D tDiffuse; + uniform float v; + + varying vec2 vUv; + + void main() { + + vec4 sum = vec4( 0.0 ); + + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918; + sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051; + + gl_FragColor = sum; + + }` + +}; + +/** + * Returns a value linearly interpolated from two known points based on the given interval - + * `t = 0` will return `x` and `t = 1` will return `y`. + * + * @param {number} x - The start point + * @param {number} y - The end point. + * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. + * @return {number} The interpolated value. + */ +function lerp( x, y, t ) { + + return ( 1 - t ) * x + t * y; + +} + +/* @license + * Copyright 2022 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// The softness [0, 1] of the shadow is mapped to a resolution between +// 2^LOG_MAX_RESOLUTION and 2^LOG_MIN_RESOLUTION. +const LOG_MAX_RESOLUTION = 9; +const LOG_MIN_RESOLUTION = 6; +// Animated models are not in general contained in their bounding box, as this +// is calculated only for their resting pose. We create a cubic shadow volume +// for animated models sized to their largest bounding box dimension multiplied +// by this scale factor. +const ANIMATION_SCALING = 2; +// Since hard shadows are not lightened by blurring and depth, set a lower +// default intensity to make them more perceptually similar to the intensity of +// the soft shadows. +const DEFAULT_HARD_INTENSITY = 0.3; +/** + * The Shadow class creates a shadow that fits a given scene and follows a + * target. This shadow will follow the scene without any updates needed so long + * as the shadow and scene are both parented to the same object (call it the + * scene) and this scene is passed as the target parameter to the shadow's + * constructor. We also must constrain the scene to motion within the horizontal + * plane and call the setRotation() method whenever the scene's Y-axis rotation + * changes. For motion outside of the horizontal plane, this.needsUpdate must be + * set to true. + * + * The softness of the shadow is controlled by changing its resolution, making + * softer shadows faster, but less precise. + */ +class Shadow extends Object3D { + constructor(scene, softness, side) { + super(); + this.camera = new OrthographicCamera(); + // private cameraHelper = new CameraHelper(this.camera); + this.renderTarget = null; + this.renderTargetBlur = null; + this.depthMaterial = new MeshDepthMaterial(); + this.horizontalBlurMaterial = new ShaderMaterial(HorizontalBlurShader); + this.verticalBlurMaterial = new ShaderMaterial(VerticalBlurShader); + this.intensity = 0; + this.softness = 1; + this.boundingBox = new Box3; + this.size = new Vector3; + this.maxDimension = 0; + this.isAnimated = false; + this.needsUpdate = false; + const { camera } = this; + camera.rotation.x = Math.PI / 2; + camera.left = -0.5; + camera.right = 0.5; + camera.bottom = -0.5; + camera.top = 0.5; + this.add(camera); + // this.add(this.cameraHelper); + // this.cameraHelper.updateMatrixWorld = function() { + // this.matrixWorld = this.camera.matrixWorld; + // }; + const plane = new PlaneGeometry(); + const shadowMaterial = new MeshBasicMaterial({ + // color: new Color(1, 0, 0), + opacity: 1, + transparent: true, + side: BackSide, + }); + this.floor = new Mesh(plane, shadowMaterial); + this.floor.userData.noHit = true; + camera.add(this.floor); + // the plane onto which to blur the texture + this.blurPlane = new Mesh(plane); + this.blurPlane.visible = false; + camera.add(this.blurPlane); + scene.target.add(this); + // like MeshDepthMaterial, but goes from black to transparent + this.depthMaterial.onBeforeCompile = function (shader) { + shader.fragmentShader = shader.fragmentShader.replace('gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );', 'gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * opacity );'); + }; + // Render both sides, back sides face the light source and + // front sides supply depth information for soft shadows + this.depthMaterial.side = DoubleSide; + this.horizontalBlurMaterial.depthTest = false; + this.verticalBlurMaterial.depthTest = false; + this.setScene(scene, softness, side); + } + /** + * Update the shadow's size and position for a new scene. Softness is also + * needed, as this controls the shadow's resolution. + */ + setScene(scene, softness, side) { + const { boundingBox, size, rotation, position } = this; + this.isAnimated = scene.animationNames.length > 0; + this.boundingBox.copy(scene.boundingBox); + this.size.copy(scene.size); + this.maxDimension = Math.max(size.x, size.y, size.z) * + (this.isAnimated ? ANIMATION_SCALING : 1); + this.boundingBox.getCenter(position); + if (side === 'back') { + const { min, max } = boundingBox; + [min.y, min.z] = [min.z, min.y]; + [max.y, max.z] = [max.z, max.y]; + [size.y, size.z] = [size.z, size.y]; + rotation.x = Math.PI / 2; + rotation.y = Math.PI; + } + else { + rotation.x = 0; + rotation.y = 0; + } + if (this.isAnimated) { + const minY = boundingBox.min.y; + const maxY = boundingBox.max.y; + size.y = this.maxDimension; + boundingBox.expandByVector(size.subScalar(this.maxDimension).multiplyScalar(-0.5)); + boundingBox.min.y = minY; + boundingBox.max.y = maxY; + size.set(this.maxDimension, maxY - minY, this.maxDimension); + } + if (side === 'bottom') { + position.y = boundingBox.min.y; + } + else { + position.z = boundingBox.min.y; + } + this.setSoftness(softness); + } + /** + * Update the shadow's resolution based on softness (between 0 and 1). Should + * not be called frequently, as this results in reallocation. + */ + setSoftness(softness) { + this.softness = softness; + const { size, camera } = this; + const scaleY = (this.isAnimated ? ANIMATION_SCALING : 1); + const resolution = scaleY * + Math.pow(2, LOG_MAX_RESOLUTION - + softness * (LOG_MAX_RESOLUTION - LOG_MIN_RESOLUTION)); + this.setMapSize(resolution); + const softFar = size.y / 2; + const hardFar = size.y * scaleY; + camera.near = 0; + camera.far = lerp(hardFar, softFar, softness); + // we have co-opted opacity to scale the depth to clip + this.depthMaterial.opacity = 1.0 / softness; + camera.updateProjectionMatrix(); + // this.cameraHelper.update(); + this.setIntensity(this.intensity); + this.setOffset(0); + } + /** + * Lower-level version of the above function. + */ + setMapSize(maxMapSize) { + const { size } = this; + if (this.isAnimated) { + maxMapSize *= ANIMATION_SCALING; + } + const baseWidth = Math.floor(size.x > size.z ? maxMapSize : maxMapSize * size.x / size.z); + const baseHeight = Math.floor(size.x > size.z ? maxMapSize * size.z / size.x : maxMapSize); + // width of blur filter in pixels (not adjustable) + const TAP_WIDTH = 10; + const width = TAP_WIDTH + baseWidth; + const height = TAP_WIDTH + baseHeight; + if (this.renderTarget != null && + (this.renderTarget.width !== width || + this.renderTarget.height !== height)) { + this.renderTarget.dispose(); + this.renderTarget = null; + this.renderTargetBlur.dispose(); + this.renderTargetBlur = null; + } + if (this.renderTarget == null) { + const params = { format: RGBAFormat }; + this.renderTarget = new WebGLRenderTarget(width, height, params); + this.renderTargetBlur = new WebGLRenderTarget(width, height, params); + this.floor.material.map = + this.renderTarget.texture; + } + // These pads account for the softening radius around the shadow. + this.camera.scale.set(size.x * (1 + TAP_WIDTH / baseWidth), size.z * (1 + TAP_WIDTH / baseHeight), 1); + this.needsUpdate = true; + } + /** + * Set the shadow's intensity (0 to 1), which is just its opacity. Turns off + * shadow rendering if zero. + */ + setIntensity(intensity) { + this.intensity = intensity; + if (intensity > 0) { + this.visible = true; + this.floor.visible = true; + this.floor.material.opacity = intensity * + lerp(DEFAULT_HARD_INTENSITY, 1, this.softness * this.softness); + } + else { + this.visible = false; + this.floor.visible = false; + } + } + getIntensity() { + return this.intensity; + } + /** + * An offset can be specified to move the + * shadow vertically relative to the bottom of the scene. Positive is up, so + * values are generally negative. A small offset keeps our shadow from + * z-fighting with any baked-in shadow plane. + */ + setOffset(offset) { + this.floor.position.z = -offset + this.gap(); + } + gap() { + return 0.001 * this.maxDimension; + } + render(renderer, scene) { + // this.cameraHelper.visible = false; + // force the depthMaterial to everything + scene.overrideMaterial = this.depthMaterial; + // set renderer clear alpha + const initialClearAlpha = renderer.getClearAlpha(); + renderer.setClearAlpha(0); + this.floor.visible = false; + // disable XR for offscreen rendering + const xrEnabled = renderer.xr.enabled; + renderer.xr.enabled = false; + // render to the render target to get the depths + const oldRenderTarget = renderer.getRenderTarget(); + renderer.setRenderTarget(this.renderTarget); + renderer.render(scene, this.camera); + // and reset the override material + scene.overrideMaterial = null; + this.floor.visible = true; + this.blurShadow(renderer); + // reset and render the normal scene + renderer.xr.enabled = xrEnabled; + renderer.setRenderTarget(oldRenderTarget); + renderer.setClearAlpha(initialClearAlpha); + // this.cameraHelper.visible = true; + } + blurShadow(renderer) { + const { camera, horizontalBlurMaterial, verticalBlurMaterial, renderTarget, renderTargetBlur, blurPlane } = this; + blurPlane.visible = true; + // blur horizontally and draw in the renderTargetBlur + blurPlane.material = horizontalBlurMaterial; + horizontalBlurMaterial.uniforms.h.value = 1 / this.renderTarget.width; + horizontalBlurMaterial.uniforms.tDiffuse.value = this.renderTarget.texture; + renderer.setRenderTarget(renderTargetBlur); + renderer.render(blurPlane, camera); + // blur vertically and draw in the main renderTarget + blurPlane.material = verticalBlurMaterial; + verticalBlurMaterial.uniforms.v.value = 1 / this.renderTarget.height; + verticalBlurMaterial.uniforms.tDiffuse.value = + this.renderTargetBlur.texture; + renderer.setRenderTarget(renderTarget); + renderer.render(blurPlane, camera); + blurPlane.visible = false; + } + dispose() { + if (this.renderTarget != null) { + this.renderTarget.dispose(); + } + if (this.renderTargetBlur != null) { + this.renderTargetBlur.dispose(); + } + this.depthMaterial.dispose(); + this.horizontalBlurMaterial.dispose(); + this.verticalBlurMaterial.dispose(); + this.floor.material.dispose(); + this.floor.geometry.dispose(); + this.blurPlane.geometry.dispose(); + this.removeFromParent(); + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const GROUNDED_SKYBOX_SIZE = 10; +const MIN_SHADOW_RATIO = 100; +const view = new Vector3(); +const target = new Vector3(); +const normalWorld = new Vector3(); +const raycaster = new Raycaster(); +const vector3 = new Vector3(); +const ndc = new Vector2(); +/** + * A THREE.Scene object that takes a Model and CanvasHTMLElement and + * constructs a framed scene based off of the canvas dimensions. + * Provides lights and cameras to be used in a renderer. + */ +class ModelScene extends Scene { + constructor({ canvas, element, width, height }) { + super(); + this.annotationRenderer = new CSS2DRenderer(); + this.effectRenderer = null; + this.schemaElement = document.createElement('script'); + this.width = 1; + this.height = 1; + this.aspect = 1; + this.scaleStep = 0; + this.renderCount = 0; + this.externalRenderer = null; + this.appendedAnimations = []; + this.markedAnimations = []; + // These default camera values are never used, as they are reset once the + // model is loaded and framing is computed. + this.camera = new PerspectiveCamera(45, 1, 0.1, 100); + this.xrCamera = null; + this.url = null; + this.pivot = new Object3D(); + this.target = new Object3D(); + this.animationNames = []; + this.boundingBox = new Box3(); + this.boundingSphere = new Sphere(); + this.size = new Vector3(); + this.idealAspect = 0; + this.framedFoVDeg = 0; + this.shadow = null; + this.shadowIntensity = 0; + this.shadowSoftness = 1; + this.bakedShadows = new Set(); + this.exposure = 1; + this.toneMapping = NeutralToneMapping; + this.canScale = true; + this.isDirty = false; + this.goalTarget = new Vector3(); + this.targetDamperX = new Damper(); + this.targetDamperY = new Damper(); + this.targetDamperZ = new Damper(); + this._currentGLTF = null; + this._model = null; + this.cancelPendingSourceChange = null; + this.animationsByName = new Map(); + this.currentAnimationAction = null; + this.groundedSkybox = new GroundedSkybox(); + this.name = 'ModelScene'; + this.element = element; + this.canvas = canvas; + // These default camera values are never used, as they are reset once the + // model is loaded and framing is computed. + this.camera = new PerspectiveCamera(45, 1, 0.1, 100); + this.camera.name = 'MainCamera'; + this.add(this.pivot); + this.pivot.name = 'Pivot'; + this.pivot.add(this.target); + this.setSize(width, height); + this.target.name = 'Target'; + this.mixer = new AnimationMixer(this.target); + const { domElement } = this.annotationRenderer; + const { style } = domElement; + style.display = 'none'; + style.pointerEvents = 'none'; + style.position = 'absolute'; + style.top = '0'; + this.element.shadowRoot.querySelector('.default').appendChild(domElement); + this.schemaElement.setAttribute('type', 'application/ld+json'); + } + /** + * Function to create the context lazily, as when there is only one + * element, the renderer's 3D context can be displayed + * directly. This extra context is necessary to copy the renderings into when + * there are more than one. + */ + get context() { + return this.canvas.getContext('2d'); + } + getCamera() { + return this.xrCamera != null ? this.xrCamera : this.camera; + } + queueRender() { + this.isDirty = true; + } + shouldRender() { + return this.isDirty; + } + hasRendered() { + this.isDirty = false; + } + forceRescale() { + this.scaleStep = -1; + this.queueRender(); + } + /** + * Pass in a THREE.Object3D to be controlled + * by this model. + */ + async setObject(model) { + this.reset(); + this._model = model; + this.target.add(model); + await this.setupScene(); + } + /** + * Sets the model via URL. + */ + async setSource(url, progressCallback = () => { }) { + if (!url || url === this.url) { + progressCallback(1); + return; + } + this.reset(); + this.url = url; + if (this.externalRenderer != null) { + const framingInfo = await this.externalRenderer.load(progressCallback); + this.boundingSphere.radius = framingInfo.framedRadius; + this.idealAspect = framingInfo.fieldOfViewAspect; + return; + } + // If we have pending work due to a previous source change in progress, + // cancel it so that we do not incur a race condition: + if (this.cancelPendingSourceChange != null) { + this.cancelPendingSourceChange(); + this.cancelPendingSourceChange = null; + } + let gltf; + try { + gltf = await new Promise(async (resolve, reject) => { + this.cancelPendingSourceChange = () => reject(); + try { + const result = await this.element[$renderer].loader.load(url, this.element, progressCallback); + resolve(result); + } + catch (error) { + reject(error); + } + }); + } + catch (error) { + if (error == null) { + // Loading was cancelled, so silently return + return; + } + throw error; + } + this.cancelPendingSourceChange = null; + this.reset(); + this.url = url; + this._currentGLTF = gltf; + if (gltf != null) { + this._model = gltf.scene; + this.target.add(gltf.scene); + } + const { animations } = gltf; + const animationsByName = new Map(); + const animationNames = []; + for (const animation of animations) { + animationsByName.set(animation.name, animation); + animationNames.push(animation.name); + } + this.animations = animations; + this.animationsByName = animationsByName; + this.animationNames = animationNames; + await this.setupScene(); + } + async setupScene() { + this.applyTransform(); + this.updateBoundingBox(); + await this.updateFraming(); + this.updateShadow(); + this.setShadowIntensity(this.shadowIntensity); + this.setGroundedSkybox(); + } + reset() { + this.url = null; + this.renderCount = 0; + this.queueRender(); + if (this.shadow != null) { + this.shadow.setIntensity(0); + } + this.bakedShadows.clear(); + const { _model } = this; + if (_model != null) { + _model.removeFromParent(); + this._model = null; + } + const gltf = this._currentGLTF; + if (gltf != null) { + gltf.dispose(); + this._currentGLTF = null; + } + if (this.currentAnimationAction != null) { + this.currentAnimationAction.stop(); + this.currentAnimationAction = null; + } + this.mixer.stopAllAction(); + this.mixer.uncacheRoot(this); + } + dispose() { + this.reset(); + if (this.shadow != null) { + this.shadow.dispose(); + this.shadow = null; + } + this.element[$currentGLTF] = null; + this.element[$originalGltfJson] = null; + this.element[$model] = null; + } + get currentGLTF() { + return this._currentGLTF; + } + /** + * Updates the ModelScene for a new container size in CSS pixels. + */ + setSize(width, height) { + if (this.width === width && this.height === height) { + return; + } + this.width = Math.max(width, 1); + this.height = Math.max(height, 1); + this.annotationRenderer.setSize(width, height); + this.aspect = this.width / this.height; + if (this.externalRenderer != null) { + const dpr = window.devicePixelRatio; + this.externalRenderer.resize(width * dpr, height * dpr); + } + this.queueRender(); + } + markBakedShadow(mesh) { + mesh.userData.noHit = true; + this.bakedShadows.add(mesh); + } + unmarkBakedShadow(mesh) { + mesh.userData.noHit = false; + mesh.visible = true; + this.bakedShadows.delete(mesh); + this.boundingBox.expandByObject(mesh); + } + findBakedShadows(group) { + const boundingBox = new Box3(); + group.traverse((object) => { + const mesh = object; + if (!mesh.material) { + return; + } + const material = mesh.material; + if (!material.transparent) { + return; + } + boundingBox.setFromObject(mesh); + const size = boundingBox.getSize(vector3); + const minDim = Math.min(size.x, size.y, size.z); + const maxDim = Math.max(size.x, size.y, size.z); + if (maxDim < MIN_SHADOW_RATIO * minDim) { + return; + } + this.markBakedShadow(mesh); + }); + } + checkBakedShadows() { + const { min, max } = this.boundingBox; + const shadowBox = new Box3(); + this.boundingBox.getSize(this.size); + for (const mesh of this.bakedShadows) { + shadowBox.setFromObject(mesh); + if (shadowBox.min.y < min.y + this.size.y / MIN_SHADOW_RATIO && + shadowBox.min.x <= min.x && shadowBox.max.x >= max.x && + shadowBox.min.z <= min.z && shadowBox.max.z >= max.z) { + // floor shadow + continue; + } + if (shadowBox.min.z < min.z + this.size.z / MIN_SHADOW_RATIO && + shadowBox.min.x <= min.x && shadowBox.max.x >= max.x && + shadowBox.min.y <= min.y && shadowBox.max.y >= max.y) { + // wall shadow + continue; + } + this.unmarkBakedShadow(mesh); + } + } + applyTransform() { + const { model } = this; + if (model == null) { + return; + } + const orientation = parseExpressions(this.element.orientation)[0] + .terms; + const roll = normalizeUnit(orientation[0]).number; + const pitch = normalizeUnit(orientation[1]).number; + const yaw = normalizeUnit(orientation[2]).number; + model.quaternion.setFromEuler(new Euler(pitch, yaw, roll, 'YXZ')); + const scale = parseExpressions(this.element.scale)[0] + .terms; + model.scale.set(scale[0].number, scale[1].number, scale[2].number); + } + updateBoundingBox() { + const { model } = this; + if (model == null) { + return; + } + this.target.remove(model); + this.findBakedShadows(model); + const bound = (box, vertex) => { + return box.expandByPoint(vertex); + }; + this.setBakedShadowVisibility(false); + this.boundingBox = reduceVertices(model, bound, new Box3()); + // If there's nothing but the baked shadow, then it's not a baked shadow. + if (this.boundingBox.isEmpty()) { + this.setBakedShadowVisibility(true); + this.bakedShadows.forEach((mesh) => this.unmarkBakedShadow(mesh)); + this.boundingBox = reduceVertices(model, bound, new Box3()); + } + this.checkBakedShadows(); + this.setBakedShadowVisibility(); + this.boundingBox.getSize(this.size); + this.target.add(model); + } + /** + * Calculates the boundingSphere and idealAspect that allows the 3D + * object to be framed tightly in a 2D window of any aspect ratio without + * clipping at any camera orbit. The camera's center target point can be + * optionally specified. If no center is specified, it defaults to the center + * of the bounding box, which means asymmetric models will tend to be tight on + * one side instead of both. Proper choice of center can correct this. + */ + async updateFraming() { + const { model } = this; + if (model == null) { + return; + } + this.target.remove(model); + this.setBakedShadowVisibility(false); + const { center } = this.boundingSphere; + this.element.requestUpdate('cameraTarget'); + await this.element.updateComplete; + center.copy(this.getTarget()); + const radiusSquared = (value, vertex) => { + return Math.max(value, center.distanceToSquared(vertex)); + }; + this.boundingSphere.radius = + Math.sqrt(reduceVertices(model, radiusSquared, 0)); + const horizontalTanFov = (value, vertex) => { + vertex.sub(center); + const radiusXZ = Math.sqrt(vertex.x * vertex.x + vertex.z * vertex.z); + return Math.max(value, radiusXZ / (this.idealCameraDistance() - Math.abs(vertex.y))); + }; + this.idealAspect = reduceVertices(model, horizontalTanFov, 0) / + Math.tan((this.framedFoVDeg / 2) * Math.PI / 180); + this.setBakedShadowVisibility(); + this.target.add(model); + } + setBakedShadowVisibility(visible = this.shadowIntensity <= 0) { + for (const shadow of this.bakedShadows) { + shadow.visible = visible; + } + } + idealCameraDistance() { + const halfFovRad = (this.framedFoVDeg / 2) * Math.PI / 180; + return this.boundingSphere.radius / Math.sin(halfFovRad); + } + /** + * Set's the framedFieldOfView based on the aspect ratio of the window in + * order to keep the model fully visible at any camera orientation. + */ + adjustedFoV(fovDeg) { + const vertical = Math.tan((fovDeg / 2) * Math.PI / 180) * + Math.max(1, this.idealAspect / this.aspect); + return 2 * Math.atan(vertical) * 180 / Math.PI; + } + getNDC(clientX, clientY) { + if (this.xrCamera != null) { + ndc.set(clientX / window.screen.width, clientY / window.screen.height); + } + else { + const rect = this.element.getBoundingClientRect(); + ndc.set((clientX - rect.x) / this.width, (clientY - rect.y) / this.height); + } + ndc.multiplyScalar(2).subScalar(1); + ndc.y *= -1; + return ndc; + } + /** + * Returns the size of the corresponding canvas element. + */ + getSize() { + return { width: this.width, height: this.height }; + } + setEnvironmentAndSkybox(environment, skybox) { + if (this.element[$renderer].arRenderer.presentedScene === this) { + return; + } + this.environment = environment; + this.setBackground(skybox); + this.queueRender(); + } + setBackground(skybox) { + this.groundedSkybox.map = skybox; + if (this.groundedSkybox.isUsable()) { + this.target.add(this.groundedSkybox); + this.background = null; + } + else { + this.target.remove(this.groundedSkybox); + this.background = skybox; + } + } + farRadius() { + return this.boundingSphere.radius * + (this.groundedSkybox.parent != null ? GROUNDED_SKYBOX_SIZE : 1); + } + setGroundedSkybox() { + const heightNode = parseExpressions(this.element.skyboxHeight)[0].terms[0]; + const height = normalizeUnit(heightNode).number; + const radius = GROUNDED_SKYBOX_SIZE * this.boundingSphere.radius; + this.groundedSkybox.updateGeometry(height, radius); + this.groundedSkybox.position.y = + height - (this.shadow ? 2 * this.shadow.gap() : 0); + this.setBackground(this.groundedSkybox.map); + } + /** + * Sets the point in model coordinates the model should orbit/pivot around. + */ + setTarget(modelX, modelY, modelZ) { + this.goalTarget.set(-modelX, -modelY, -modelZ); + } + /** + * Set the decay time of, affects the speed of target transitions. + */ + setTargetDamperDecayTime(decayMilliseconds) { + this.targetDamperX.setDecayTime(decayMilliseconds); + this.targetDamperY.setDecayTime(decayMilliseconds); + this.targetDamperZ.setDecayTime(decayMilliseconds); + } + /** + * Gets the point in model coordinates the model should orbit/pivot around. + */ + getTarget() { + return this.goalTarget.clone().multiplyScalar(-1); + } + /** + * Gets the current target point, which may not equal the goal returned by + * getTarget() due to finite input decay smoothing. + */ + getDynamicTarget() { + return this.target.position.clone().multiplyScalar(-1); + } + /** + * Shifts the model to the target point immediately instead of easing in. + */ + jumpToGoal() { + this.updateTarget(SETTLING_TIME); + } + /** + * This should be called every frame with the frame delta to cause the target + * to transition to its set point. + */ + updateTarget(delta) { + const goal = this.goalTarget; + const target = this.target.position; + if (!goal.equals(target)) { + const normalization = this.boundingSphere.radius / 10; + let { x, y, z } = target; + x = this.targetDamperX.update(x, goal.x, delta, normalization); + y = this.targetDamperY.update(y, goal.y, delta, normalization); + z = this.targetDamperZ.update(z, goal.z, delta, normalization); + this.groundedSkybox.position.x = -x; + this.groundedSkybox.position.z = -z; + this.target.position.set(x, y, z); + this.target.updateMatrixWorld(); + this.queueRender(); + return true; + } + else { + return false; + } + } + /** + * Yaw the +z (front) of the model toward the indicated world coordinates. + */ + pointTowards(worldX, worldZ) { + const { x, z } = this.position; + this.yaw = Math.atan2(worldX - x, worldZ - z); + } + get model() { + return this._model; + } + /** + * Yaw is the scene's orientation about the y-axis, around the rotation + * center. + */ + set yaw(radiansY) { + this.pivot.rotation.y = radiansY; + this.groundedSkybox.rotation.y = -radiansY; + this.queueRender(); + } + get yaw() { + return this.pivot.rotation.y; + } + set animationTime(value) { + this.mixer.setTime(value); + this.queueShadowRender(); + } + get animationTime() { + if (this.currentAnimationAction != null) { + const loopCount = Math.max(this.currentAnimationAction._loopCount, 0); + if (this.currentAnimationAction.loop === LoopPingPong && + (loopCount & 1) === 1) { + return this.duration - this.currentAnimationAction.time; + } + else { + return this.currentAnimationAction.time; + } + } + return 0; + } + set animationTimeScale(value) { + this.mixer.timeScale = value; + } + get animationTimeScale() { + return this.mixer.timeScale; + } + get duration() { + if (this.currentAnimationAction != null && + this.currentAnimationAction.getClip()) { + return this.currentAnimationAction.getClip().duration; + } + return 0; + } + get hasActiveAnimation() { + return this.currentAnimationAction != null; + } + /** + * Plays an animation if there are any associated with the current model. + * Accepts an optional string name of an animation to play. If no name is + * provided, or if no animation is found by the given name, always falls back + * to playing the first animation. + */ + playAnimation(name = null, crossfadeTime = 0, loopMode = LoopRepeat, repetitionCount = Infinity) { + if (this._currentGLTF == null) { + return; + } + const { animations } = this; + if (animations == null || animations.length === 0) { + return; + } + let animationClip = null; + if (name != null) { + animationClip = this.animationsByName.get(name); + if (animationClip == null) { + const parsedAnimationIndex = parseInt(name); + if (!isNaN(parsedAnimationIndex) && parsedAnimationIndex >= 0 && + parsedAnimationIndex < animations.length) { + animationClip = animations[parsedAnimationIndex]; + } + } + } + if (animationClip == null) { + animationClip = animations[0]; + } + try { + const { currentAnimationAction: lastAnimationAction } = this; + const action = this.mixer.clipAction(animationClip, this); + // Reset animationAction timeScale + if (action.timeScale != this.element.timeScale) { + action.timeScale = this.element.timeScale; + } + this.currentAnimationAction = action; + if (this.element.paused) { + this.mixer.stopAllAction(); + } + else { + action.paused = false; + if (lastAnimationAction != null && action !== lastAnimationAction) { + action.crossFadeFrom(lastAnimationAction, crossfadeTime, false); + } + else if (this.animationTimeScale > 0 && + this.animationTime == this.duration) { + // This is a workaround for what I believe is a three.js bug. + this.animationTime = 0; + } + } + action.setLoop(loopMode, repetitionCount); + action.enabled = true; + action.clampWhenFinished = true; + action.play(); + } + catch (error) { + console.error(error); + } + } + appendAnimation(name = '', loopMode = LoopRepeat, repetitionCount = Infinity, weight = 1, timeScale = 1, fade = false, warp = false, relativeWarp = true, time = null, needsToStop = false) { + if (this._currentGLTF == null || name === this.element.animationName) { + return; + } + const { animations } = this; + if (animations == null || animations.length === 0) { + return; + } + let animationClip = null; + const defaultFade = 1.25; + if (name) { + animationClip = this.animationsByName.get(name); + } + if (animationClip == null) { + return; + } + // validate function parameters + if (typeof repetitionCount === 'string') { + if (!isNaN(repetitionCount)) { + repetitionCount = Math.max(parseInt(repetitionCount), 1); + } + else { + repetitionCount = Infinity; + console.warn('Invalid repetitionCount value, repetitionCount is set to Infinity'); + } + } + else if (typeof repetitionCount === 'number' && repetitionCount < 1) { + repetitionCount = 1; + } + if (repetitionCount === 1 && loopMode !== LoopOnce) { + loopMode = LoopOnce; + } + if (typeof weight === 'string') { + if (!isNaN(weight)) { + weight = parseFloat(weight); + } + else { + weight = 1; + console.warn('Invalid weight value, weight is set to 1'); + } + } + if (typeof timeScale === 'string') { + if (!isNaN(timeScale)) { + timeScale = parseFloat(timeScale); + } + else { + timeScale = 1; + console.warn('Invalid timeScale value, timeScale is set to 1'); + } + } + if (typeof fade === 'string') { + // @ts-ignore: Unreachable code error + if (fade.toLowerCase().trim() === 'true') { + fade = true; + // @ts-ignore: Unreachable code error + } + else if (fade.toLowerCase().trim() === 'false') { + fade = false; + } + else if (!isNaN(fade)) { + fade = parseFloat(fade); + } + else { + fade = false; + console.warn('Invalid fade value, fade is set to false'); + } + } + if (typeof warp === 'string') { + // @ts-ignore: Unreachable code error + if (warp.toLowerCase().trim() === 'true') { + warp = true; + // @ts-ignore: Unreachable code error + } + else if (warp.toLowerCase().trim() === 'false') { + warp = false; + } + else if (!isNaN(warp)) { + warp = parseFloat(warp); + } + else { + warp = false; + console.warn('Invalid warp value, warp is set to false'); + } + } + if (typeof time === 'string') { + if (!isNaN(time)) { + time = parseFloat(time); + } + } + try { + const action = this.mixer.existingAction(animationClip) || + this.mixer.clipAction(animationClip, this); + const currentTimeScale = action.timeScale; + if (needsToStop && this.appendedAnimations.includes(name)) { + if (!this.markedAnimations.map(e => e.name).includes(name)) { + this.markedAnimations.push({ name, loopMode, repetitionCount }); + } + } + if (typeof time === 'number') { + action.time = Math.min(Math.max(time, 0), animationClip.duration); + } + if (typeof fade === 'boolean' && fade) { + action.fadeIn(defaultFade); + } + else if (typeof fade === 'number') { + action.fadeIn(Math.max(fade, 0)); + } + else { + if (weight >= 0) { + action.weight = Math.min(Math.max(weight, 0), 1); + } + } + if (typeof warp === 'boolean' && warp) { + action.warp(relativeWarp ? currentTimeScale : 0, timeScale, defaultFade); + } + else if (typeof warp === 'number') { + action.warp(relativeWarp ? currentTimeScale : 0, timeScale, Math.max(warp, 0)); + } + else { + action.timeScale = timeScale; + } + if (!action.isRunning()) { + if (action.time == animationClip.duration) { + action.stop(); + } + action.setLoop(loopMode, repetitionCount); + action.paused = false; + action.enabled = true; + action.clampWhenFinished = true; + action.play(); + } + if (!this.appendedAnimations.includes(name)) { + this.element[$scene].appendedAnimations.push(name); + } + } + catch (error) { + console.error(error); + } + } + detachAnimation(name = '', fade = true) { + if (this._currentGLTF == null || name === this.element.animationName) { + return; + } + const { animations } = this; + if (animations == null || animations.length === 0) { + return; + } + let animationClip = null; + const defaultFade = 1.5; + if (name) { + animationClip = this.animationsByName.get(name); + } + if (animationClip == null) { + return; + } + if (typeof fade === 'string') { + // @ts-ignore: Unreachable code error + if (fade.toLowerCase().trim() === 'true') { + fade = true; + // @ts-ignore: Unreachable code error + } + else if (fade.toLowerCase().trim() === 'false') { + fade = false; + } + else if (!isNaN(fade)) { + fade = parseFloat(fade); + } + else { + fade = true; + console.warn('Invalid fade value, fade is set to true'); + } + } + try { + const action = this.mixer.existingAction(animationClip) || + this.mixer.clipAction(animationClip, this); + if (typeof fade === 'boolean' && fade) { + action.fadeOut(defaultFade); + } + else if (typeof fade === 'number') { + action.fadeOut(Math.max(fade, 0)); + } + else { + action.stop(); + } + const result = this.element[$scene].appendedAnimations.filter(i => i !== name); + this.element[$scene].appendedAnimations = result; + } + catch (error) { + console.error(error); + } + } + updateAnimationLoop(name = '', loopMode = LoopRepeat, repetitionCount = Infinity) { + if (this._currentGLTF == null || name === this.element.animationName) { + return; + } + const { animations } = this; + if (animations == null || animations.length === 0) { + return; + } + let animationClip = null; + if (name) { + animationClip = this.animationsByName.get(name); + } + if (animationClip == null) { + return; + } + try { + const action = this.mixer.existingAction(animationClip) || + this.mixer.clipAction(animationClip, this); + action.stop(); + action.setLoop(loopMode, repetitionCount); + action.play(); + } + catch (error) { + console.error(error); + } + } + stopAnimation() { + this.currentAnimationAction = null; + this.mixer.stopAllAction(); + } + updateAnimation(step) { + this.mixer.update(step); + this.queueShadowRender(); + } + subscribeMixerEvent(event, callback) { + this.mixer.addEventListener(event, callback); + } + /** + * Call if the object has been changed in such a way that the shadow's + * shape has changed (not a rotation about the Y axis). + */ + updateShadow() { + const shadow = this.shadow; + if (shadow != null) { + const side = this.element.arPlacement === 'wall' ? 'back' : + this.element.arPlacement === 'ceiling' ? 'top' : 'bottom'; + shadow.setScene(this, this.shadowSoftness, side); + shadow.needsUpdate = true; + } + } + renderShadow(renderer) { + const shadow = this.shadow; + if (shadow != null && shadow.needsUpdate == true) { + shadow.render(renderer, this); + shadow.needsUpdate = false; + } + } + queueShadowRender() { + if (this.shadow != null) { + this.shadow.needsUpdate = true; + } + } + /** + * Sets the shadow's intensity, lazily creating the shadow as necessary. + */ + setShadowIntensity(shadowIntensity) { + this.shadowIntensity = shadowIntensity; + if (this._currentGLTF == null) { + return; + } + this.setBakedShadowVisibility(); + if (shadowIntensity <= 0 && this.shadow == null) { + return; + } + if (this.shadow == null) { + const side = this.element.arPlacement === 'wall' ? 'back' : 'bottom'; + this.shadow = new Shadow(this, this.shadowSoftness, side); + } + this.shadow.setIntensity(shadowIntensity); + } + /** + * Sets the shadow's softness by mapping a [0, 1] softness parameter to + * the shadow's resolution. This involves reallocation, so it should not + * be changed frequently. Softer shadows are cheaper to render. + */ + setShadowSoftness(softness) { + this.shadowSoftness = softness; + const shadow = this.shadow; + if (shadow != null) { + shadow.setSoftness(softness); + } + } + /** + * Shift the floor vertically from the bottom of the model's bounding box + * by offset (should generally be negative). + */ + setShadowOffset(offset) { + const shadow = this.shadow; + if (shadow != null) { + shadow.setOffset(offset); + } + } + getHit(object = this) { + const hits = raycaster.intersectObject(object, true); + return hits.find((hit) => hit.object.visible && !hit.object.userData.noHit); + } + hitFromController(controller, object = this) { + raycaster.setFromXRController(controller); + return this.getHit(object); + } + hitFromPoint(ndcPosition, object = this) { + raycaster.setFromCamera(ndcPosition, this.getCamera()); + return this.getHit(object); + } + /** + * This method returns the world position, model-space normal and texture + * coordinate of the point on the mesh corresponding to the input pixel + * coordinates given relative to the model-viewer element. If the mesh + * is not hit, the result is null. + */ + positionAndNormalFromPoint(ndcPosition, object = this) { + var _a; + const hit = this.hitFromPoint(ndcPosition, object); + if (hit == null) { + return null; + } + const position = hit.point; + const normal = hit.face != null ? + hit.face.normal.clone().applyNormalMatrix(new Matrix3().getNormalMatrix(hit.object.matrixWorld)) : + raycaster.ray.direction.clone().multiplyScalar(-1); + const uv = (_a = hit.uv) !== null && _a !== void 0 ? _a : null; + return { position, normal, uv }; + } + /** + * This method returns a dynamic hotspot ID string of the point on the + * mesh corresponding to the input pixel coordinates given relative to the + * model-viewer element. The ID string can be used in the data-surface + * attribute of the hotspot to make it follow this point on the surface + * even as the model animates. If the mesh is not hit, the result is null. + */ + surfaceFromPoint(ndcPosition, object = this) { + const model = this.element.model; + if (model == null) { + return null; + } + const hit = this.hitFromPoint(ndcPosition, object); + if (hit == null || hit.face == null) { + return null; + } + const node = model[$nodeFromPoint](hit); + const { meshes, primitives } = node.mesh.userData.associations; + const va = new Vector3(); + const vb = new Vector3(); + const vc = new Vector3(); + const { a, b, c } = hit.face; + const mesh = hit.object; + mesh.getVertexPosition(a, va); + mesh.getVertexPosition(b, vb); + mesh.getVertexPosition(c, vc); + const tri = new Triangle(va, vb, vc); + const uvw = new Vector3(); + tri.getBarycoord(mesh.worldToLocal(hit.point), uvw); + return `${meshes} ${primitives} ${a} ${b} ${c} ${uvw.x.toFixed(3)} ${uvw.y.toFixed(3)} ${uvw.z.toFixed(3)}`; + } + /** + * The following methods are for operating on the set of Hotspot objects + * attached to the scene. These come from DOM elements, provided to slots + * by the Annotation Mixin. + */ + addHotspot(hotspot) { + this.target.add(hotspot); + // This happens automatically in render(), but we do it early so that + // the slots appear in the shadow DOM and the elements get attached, + // allowing us to dispatch events on them. + this.annotationRenderer.domElement.appendChild(hotspot.element); + this.updateSurfaceHotspot(hotspot); + } + removeHotspot(hotspot) { + this.target.remove(hotspot); + } + /** + * Helper method to apply a function to all hotspots. + */ + forHotspots(func) { + const { children } = this.target; + for (let i = 0, l = children.length; i < l; i++) { + const hotspot = children[i]; + if (hotspot instanceof Hotspot) { + func(hotspot); + } + } + } + /** + * Lazy initializer for surface hotspots - will only run once. + */ + updateSurfaceHotspot(hotspot) { + if (hotspot.surface == null || this.element.model == null) { + return; + } + const nodes = parseExpressions(hotspot.surface)[0].terms; + if (nodes.length != 8) { + console.warn(hotspot.surface + ' does not have exactly 8 numbers.'); + return; + } + const primitiveNode = this.element.model[$nodeFromIndex](nodes[0].number, nodes[1].number); + if (primitiveNode == null) { + console.warn(hotspot.surface + + ' does not match a node/primitive in this glTF! Skipping this hotspot.'); + return; + } + const numVert = primitiveNode.mesh.geometry.attributes.position.count; + const tri = new Vector3(nodes[2].number, nodes[3].number, nodes[4].number); + if (tri.x >= numVert || tri.y >= numVert || tri.z >= numVert) { + console.warn(hotspot.surface + + ' vertex indices out of range in this glTF! Skipping this hotspot.'); + return; + } + const bary = new Vector3(nodes[5].number, nodes[6].number, nodes[7].number); + hotspot.mesh = primitiveNode.mesh; + hotspot.tri = tri; + hotspot.bary = bary; + hotspot.updateSurface(); + } + /** + * Update positions of surface hotspots to follow model animation. + */ + animateSurfaceHotspots() { + if (this.element.paused) { + return; + } + this.forHotspots((hotspot) => { + hotspot.updateSurface(); + }); + } + /** + * Update the CSS visibility of the hotspots based on whether their + * normals point toward the camera. + */ + updateHotspotsVisibility(viewerPosition) { + this.forHotspots((hotspot) => { + view.copy(viewerPosition); + target.setFromMatrixPosition(hotspot.matrixWorld); + view.sub(target); + normalWorld.copy(hotspot.normal) + .transformDirection(this.target.matrixWorld); + if (view.dot(normalWorld) < 0) { + hotspot.hide(); + } + else { + hotspot.show(); + } + }); + } + /** + * Rotate all hotspots to an absolute orientation given by the input + * number of radians. Zero returns them to upright. + */ + orientHotspots(radians) { + this.forHotspots((hotspot) => { + hotspot.orient(radians); + }); + } + /** + * Set the rendering visibility of all hotspots. This is used to hide them + * during transitions and such. + */ + setHotspotsVisibility(visible) { + this.forHotspots((hotspot) => { + hotspot.visible = visible; + }); + } + updateSchema(src) { + var _a; + const { schemaElement, element } = this; + const { alt, poster, iosSrc } = element; + if (src != null) { + const encoding = [{ + '@type': 'MediaObject', + contentUrl: src, + encodingFormat: ((_a = src.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'gltf' ? + 'model/gltf+json' : + 'model/gltf-binary' + }]; + if (iosSrc) { + encoding.push({ + '@type': 'MediaObject', + contentUrl: iosSrc, + encodingFormat: 'model/vnd.usdz+zip' + }); + } + const structuredData = { + '@context': 'http://schema.org/', + '@type': '3DModel', + image: poster !== null && poster !== void 0 ? poster : undefined, + name: alt !== null && alt !== void 0 ? alt : undefined, + encoding + }; + schemaElement.textContent = JSON.stringify(structuredData); + document.head.appendChild(schemaElement); + } + else if (schemaElement.parentElement != null) { + schemaElement.parentElement.removeChild(schemaElement); + } + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * ProgressTracker is an event emitter that helps to track the ongoing progress + * of many simultaneous actions. + * + * ProgressTracker reports progress activity in the form of a progress event. + * The event.detail.totalProgress value indicates the elapsed progress of all + * activities being tracked by the ProgressTracker. + * + * The value of totalProgress is a number that progresses from 0 to 1. The + * ProgressTracker allows for the lazy accumulation of tracked actions, so the + * total progress represents an abstract, non-absolute progress towards the + * completion of all currently tracked events. + * + * When all currently tracked activities are finished, the ProgressTracker + * emits one final progress event and then resets the list of its currently + * tracked activities. This means that from an observer's perspective, + * ongoing activities will accumulate and collectively contribute to the notion + * of total progress until all currently tracked ongoing activities have + * completed. + */ +class ProgressTracker extends EventTarget { + constructor() { + super(...arguments); + this.ongoingActivities = new Set(); + this.totalProgress = 0; + } + /** + * The total number of activities currently being tracked. + */ + get ongoingActivityCount() { + return this.ongoingActivities.size; + } + /** + * Registers a new activity to be tracked by the progress tracker. The method + * returns a special callback that should be invoked whenever new progress is + * ready to be reported. The progress should be reported as a value between 0 + * and 1, where 0 would represent the beginning of the action and 1 would + * represent its completion. + * + * There is no built-in notion of a time-out for ongoing activities, so once + * an ongoing activity is begun, it is up to the consumer of this API to + * update the progress until that activity is no longer ongoing. + * + * Progress is only allowed to move forward for any given activity. If a lower + * progress is reported than the previously reported progress, it will be + * ignored. + */ + beginActivity(reason) { + const activity = { progress: 0, completed: false }; + this.ongoingActivities.add(activity); + if (this.ongoingActivityCount === 1) { + // Announce the first progress event (which should always be 0 / 1 + // total progress): + this.announceTotalProgress(activity, 0, reason); + } + return (progress) => { + let nextProgress; + nextProgress = Math.max(clamp(progress, 0, 1), activity.progress); + if (nextProgress !== activity.progress) { + this.announceTotalProgress(activity, nextProgress, reason); + } + return activity.progress; + }; + } + announceTotalProgress(updatedActivity, nextProgress, reason) { + let progressLeft = 0; + let completedActivities = 0; + if (nextProgress == 1.0) + updatedActivity.completed = true; + for (const activity of this.ongoingActivities) { + const { progress } = activity; + progressLeft += 1.0 - progress; + if (activity.completed) { + completedActivities++; + } + } + const lastProgress = updatedActivity.progress; + updatedActivity.progress = nextProgress; + // Advance the total progress by the fraction of total remaining progress + // due to this activity. + this.totalProgress += (nextProgress - lastProgress) * + (1.0 - this.totalProgress) / progressLeft; + const totalProgress = completedActivities === this.ongoingActivityCount ? + 1.0 : + this.totalProgress; + this.dispatchEvent(new CustomEvent('progress', { detail: { totalProgress, reason } })); + if (completedActivities === this.ongoingActivityCount) { + this.totalProgress = 0.0; + this.ongoingActivities.clear(); + } + } +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$4 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var _a$1, _b$1, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; +const CLEAR_MODEL_TIMEOUT_MS = 10; +const FALLBACK_SIZE_UPDATE_THRESHOLD_MS = 50; +const ANNOUNCE_MODEL_VISIBILITY_DEBOUNCE_THRESHOLD = 0; +const UNSIZED_MEDIA_WIDTH = 300; +const UNSIZED_MEDIA_HEIGHT = 150; +const blobCanvas = document.createElement('canvas'); +const $fallbackResizeHandler = Symbol('fallbackResizeHandler'); +const $defaultAriaLabel = Symbol('defaultAriaLabel'); +const $resizeObserver = Symbol('resizeObserver'); +const $clearModelTimeout = Symbol('clearModelTimeout'); +const $onContextLost = Symbol('onContextLost'); +const $loaded = Symbol('loaded'); +const $status = Symbol('status'); +const $onFocus = Symbol('onFocus'); +const $onBlur = Symbol('onBlur'); +const $updateSize = Symbol('updateSize'); +const $intersectionObserver = Symbol('intersectionObserver'); +const $isElementInViewport = Symbol('isElementInViewport'); +const $announceModelVisibility = Symbol('announceModelVisibility'); +const $ariaLabel = Symbol('ariaLabel'); +const $altDefaulted = Symbol('altDefaulted'); +const $statusElement = Symbol('statusElement'); +const $updateStatus = Symbol('updateStatus'); +const $loadedTime = Symbol('loadedTime'); +const $updateSource = Symbol('updateSource'); +const $markLoaded = Symbol('markLoaded'); +const $container = Symbol('container'); +const $userInputElement = Symbol('input'); +const $canvas = Symbol('canvas'); +const $scene = Symbol('scene'); +const $needsRender = Symbol('needsRender'); +const $tick = Symbol('tick'); +const $onModelLoad = Symbol('onModelLoad'); +const $onResize = Symbol('onResize'); +const $renderer = Symbol('renderer'); +const $progressTracker = Symbol('progressTracker'); +const $getLoaded = Symbol('getLoaded'); +const $getModelIsVisible = Symbol('getModelIsVisible'); +const $shouldAttemptPreload = Symbol('shouldAttemptPreload'); +const toVector3D = (v) => { + return { + x: v.x, + y: v.y, + z: v.z, + toString() { + return `${this.x}m ${this.y}m ${this.z}m`; + } + }; +}; +const toVector2D = (v) => { + return { + u: v.x, + v: v.y, + toString() { + return `${this.u} ${this.v}`; + } + }; +}; +/** + * Definition for a basic element. + */ +class ModelViewerElementBase extends ReactiveElement { + static get is() { + return 'model-viewer'; + } + /** @export */ + static set modelCacheSize(value) { + CachingGLTFLoader[$evictionPolicy].evictionThreshold = value; + } + /** @export */ + static get modelCacheSize() { + return CachingGLTFLoader[$evictionPolicy].evictionThreshold; + } + /** @export */ + static set minimumRenderScale(value) { + if (value > 1) { + console.warn(' minimumRenderScale has been clamped to a maximum value of 1.'); + } + if (value <= 0) { + console.warn(' minimumRenderScale has been clamped to a minimum value of 0.25.'); + } + Renderer.singleton.minScale = value; + } + /** @export */ + static get minimumRenderScale() { + return Renderer.singleton.minScale; + } + /** @export */ + get loaded() { + return this[$getLoaded](); + } + get [(_a$1 = $isElementInViewport, _b$1 = $loaded, _c = $loadedTime, _d = $status, _e = $clearModelTimeout, _f = $fallbackResizeHandler, _g = $announceModelVisibility, _h = $resizeObserver, _j = $intersectionObserver, _k = $progressTracker, $renderer)]() { + return Renderer.singleton; + } + /** @export */ + get modelIsVisible() { + return this[$getModelIsVisible](); + } + /** + * Creates a new ModelViewerElement. + */ + constructor() { + super(); + this.alt = null; + this.src = null; + this.withCredentials = false; + /** + * Generates a 3D model schema https://schema.org/3DModel associated with + * the loaded src and inserts it into the header of the page for search + * engines to crawl. + */ + this.generateSchema = false; + this[_a$1] = false; + this[_b$1] = false; + this[_c] = 0; + this[_d] = ''; + this[_e] = null; + this[_f] = debounce(() => { + const boundingRect = this.getBoundingClientRect(); + this[$updateSize](boundingRect); + }, FALLBACK_SIZE_UPDATE_THRESHOLD_MS); + this[_g] = debounce((oldVisibility) => { + const newVisibility = this.modelIsVisible; + if (newVisibility !== oldVisibility) { + this.dispatchEvent(new CustomEvent('model-visibility', { detail: { visible: newVisibility } })); + } + }, ANNOUNCE_MODEL_VISIBILITY_DEBOUNCE_THRESHOLD); + this[_h] = null; + this[_j] = null; + this[_k] = new ProgressTracker(); + this[_l] = () => { + this[$statusElement].textContent = this[$status]; + }; + this[_m] = () => { + this[$statusElement].textContent = ''; + }; + this[_o] = (event) => { + this.dispatchEvent(new CustomEvent('error', { detail: { type: 'webglcontextlost', sourceError: event.sourceEvent } })); + }; + this.attachShadow({ mode: 'open' }); + const shadowRoot = this.shadowRoot; + makeTemplate(shadowRoot); + this[$container] = shadowRoot.querySelector('.container'); + this[$userInputElement] = + shadowRoot.querySelector('.userInput'); + this[$canvas] = shadowRoot.querySelector('canvas'); + this[$statusElement] = + shadowRoot.querySelector('#status'); + this[$defaultAriaLabel] = + this[$userInputElement].getAttribute('aria-label'); + // Because of potential race conditions related to invoking the constructor + // we only use the bounding rect to set the initial size if the element is + // already connected to the document: + let width, height; + if (this.isConnected) { + const rect = this.getBoundingClientRect(); + width = rect.width; + height = rect.height; + } + else { + width = UNSIZED_MEDIA_WIDTH; + height = UNSIZED_MEDIA_HEIGHT; + } + // Create the underlying ModelScene. + this[$scene] = + new ModelScene({ canvas: this[$canvas], element: this, width, height }); + // Update initial size on microtask timing so that subclasses have a + // chance to initialize + Promise.resolve().then(() => { + this[$updateSize](this.getBoundingClientRect()); + }); + if (HAS_RESIZE_OBSERVER) { + // Set up a resize observer so we can scale our canvas + // if our changes + this[$resizeObserver] = + new ResizeObserver((entries) => { + // Don't resize anything if in AR mode; otherwise the canvas + // scaling to fullscreen on entering AR will clobber the flat/2d + // dimensions of the element. + if (this[$renderer].isPresenting) { + return; + } + for (let entry of entries) { + if (entry.target === this) { + this[$updateSize](entry.contentRect); + } + } + }); + } + if (HAS_INTERSECTION_OBSERVER) { + this[$intersectionObserver] = new IntersectionObserver(entries => { + for (let entry of entries) { + if (entry.target === this) { + const oldVisibility = this.modelIsVisible; + this[$isElementInViewport] = entry.isIntersecting; + this[$announceModelVisibility](oldVisibility); + if (this[$isElementInViewport] && !this.loaded) { + this[$updateSource](); + } + } + } + }, { + root: null, + // We used to have margin here, but it was causing animated models below + // the fold to steal the frame budget. Weirder still, it would also + // cause input events to be swallowed, sometimes for seconds on the + // model above the fold, but only when the animated model was completely + // below. Setting this margin to zero fixed it. + rootMargin: '0px', + // With zero threshold, an element adjacent to but not intersecting the + // viewport will be reported as intersecting, which will cause + // unnecessary rendering. Any slight positive threshold alleviates this. + threshold: 0.00001, + }); + } + else { + // If there is no intersection observer, then all models should be visible + // at all times: + this[$isElementInViewport] = true; + } + } + connectedCallback() { + super.connectedCallback && super.connectedCallback(); + if (HAS_RESIZE_OBSERVER) { + this[$resizeObserver].observe(this); + } + else { + self.addEventListener('resize', this[$fallbackResizeHandler]); + } + if (HAS_INTERSECTION_OBSERVER) { + this[$intersectionObserver].observe(this); + } + this.addEventListener('focus', this[$onFocus]); + this.addEventListener('blur', this[$onBlur]); + const renderer = this[$renderer]; + renderer.addEventListener('contextlost', this[$onContextLost]); + renderer.registerScene(this[$scene]); + if (this[$clearModelTimeout] != null) { + self.clearTimeout(this[$clearModelTimeout]); + this[$clearModelTimeout] = null; + // Force an update in case the model has been evicted from our GLTF cache + // @see https://lit-element.polymer-project.org/guide/lifecycle#requestupdate + this.requestUpdate('src', null); + } + } + disconnectedCallback() { + super.disconnectedCallback && super.disconnectedCallback(); + if (HAS_RESIZE_OBSERVER) { + this[$resizeObserver].unobserve(this); + } + else { + self.removeEventListener('resize', this[$fallbackResizeHandler]); + } + if (HAS_INTERSECTION_OBSERVER) { + this[$intersectionObserver].unobserve(this); + } + this.removeEventListener('focus', this[$onFocus]); + this.removeEventListener('blur', this[$onBlur]); + const renderer = this[$renderer]; + renderer.removeEventListener('contextlost', this[$onContextLost]); + renderer.unregisterScene(this[$scene]); + this[$clearModelTimeout] = self.setTimeout(() => { + this[$scene].dispose(); + this[$clearModelTimeout] = null; + }, CLEAR_MODEL_TIMEOUT_MS); + } + updated(changedProperties) { + super.updated(changedProperties); + // NOTE(cdata): If a property changes from values A -> B -> A in the space + // of a microtask, LitElement/UpdatingElement will notify of a change even + // though the value has effectively not changed, so we need to check to make + // sure that the value has actually changed before changing the loaded flag. + if (changedProperties.has('src')) { + if (this.src == null) { + this[$loaded] = false; + this[$loadedTime] = 0; + this[$scene].reset(); + } + else if (this.src !== this[$scene].url) { + this[$loaded] = false; + this[$loadedTime] = 0; + this[$updateSource](); + } + } + if (changedProperties.has('alt')) { + this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]); + } + if (changedProperties.has('generateSchema')) { + if (this.generateSchema) { + this[$scene].updateSchema(this.src); + } + else { + this[$scene].updateSchema(null); + } + } + } + /** @export */ + toDataURL(type, encoderOptions) { + return this[$renderer] + .displayCanvas(this[$scene]) + .toDataURL(type, encoderOptions); + } + /** @export */ + async toBlob(options) { + const mimeType = options ? options.mimeType : undefined; + const qualityArgument = options ? options.qualityArgument : undefined; + const useIdealAspect = options ? options.idealAspect : undefined; + const { width, height, idealAspect, aspect } = this[$scene]; + const { dpr, scaleFactor } = this[$renderer]; + let outputWidth = width * scaleFactor * dpr; + let outputHeight = height * scaleFactor * dpr; + let offsetX = 0; + let offsetY = 0; + if (useIdealAspect === true) { + if (idealAspect > aspect) { + const oldHeight = outputHeight; + outputHeight = Math.round(outputWidth / idealAspect); + offsetY = (oldHeight - outputHeight) / 2; + } + else { + const oldWidth = outputWidth; + outputWidth = Math.round(outputHeight * idealAspect); + offsetX = (oldWidth - outputWidth) / 2; + } + } + blobCanvas.width = outputWidth; + blobCanvas.height = outputHeight; + try { + return new Promise(async (resolve, reject) => { + blobCanvas.getContext('2d').drawImage(this[$renderer].displayCanvas(this[$scene]), offsetX, offsetY, outputWidth, outputHeight, 0, 0, outputWidth, outputHeight); + blobCanvas.toBlob((blob) => { + if (!blob) { + return reject(new Error('Unable to retrieve canvas blob')); + } + resolve(blob); + }, mimeType, qualityArgument); + }); + } + finally { + this[$updateSize]({ width, height }); + } + } + /** + * Registers a new EffectComposer as the main rendering pipeline, + * instead of the default ThreeJs renderer. + * This method also calls setRenderer, setMainScene, and setMainCamera on + * your effectComposer. + * @param effectComposer An EffectComposer from `pmndrs/postprocessing` + */ + registerEffectComposer(effectComposer) { + effectComposer.setRenderer(this[$renderer].threeRenderer); + effectComposer.setMainCamera(this[$scene].getCamera()); + effectComposer.setMainScene(this[$scene]); + this[$scene].effectRenderer = effectComposer; + } + /** + * Removes the registered EffectComposer + */ + unregisterEffectComposer() { + this[$scene].effectRenderer = null; + } + registerRenderer(renderer) { + this[$scene].externalRenderer = renderer; + } + unregisterRenderer() { + this[$scene].externalRenderer = null; + } + get [$ariaLabel]() { + return this[$altDefaulted]; + } + get [$altDefaulted]() { + return (this.alt == null || this.alt === 'null') ? this[$defaultAriaLabel] : + this.alt; + } + // NOTE(cdata): Although this may seem extremely redundant, it is required in + // order to support overloading when TypeScript is compiled to ES5 + // @see https://github.com/Polymer/lit-element/pull/745 + // @see https://github.com/microsoft/TypeScript/issues/338 + [$getLoaded]() { + return this[$loaded]; + } + // @see [$getLoaded] + [$getModelIsVisible]() { + return this.loaded && this[$isElementInViewport]; + } + [$shouldAttemptPreload]() { + return !!this.src && this[$isElementInViewport]; + } + /** + * Called on initialization and when the resize observer fires. + */ + [$updateSize]({ width, height }) { + if (width === 0 || height === 0) { + return; + } + this[$container].style.width = `${width}px`; + this[$container].style.height = `${height}px`; + this[$onResize]({ width, height }); + } + [$tick](time, delta) { + var _p; + (_p = this[$scene].effectRenderer) === null || _p === void 0 ? void 0 : _p.beforeRender(time, delta); + } + [$markLoaded]() { + if (this[$loaded]) { + return; + } + this[$loaded] = true; + this[$loadedTime] = performance.now(); + } + [$needsRender]() { + this[$scene].queueRender(); + } + [$onModelLoad]() { + } + [$updateStatus](status) { + this[$status] = status; + const rootNode = this.getRootNode(); + // Only change the aria-label if is currently focused: + if (rootNode != null && rootNode.activeElement === this && + this[$statusElement].textContent != status) { + this[$statusElement].textContent = status; + } + } + [(_l = $onFocus, _m = $onBlur, $onResize)](e) { + this[$scene].setSize(e.width, e.height); + } + /** + * Parses the element for an appropriate source URL and + * sets the views to use the new model based. + */ + async [(_o = $onContextLost, $updateSource)]() { + const scene = this[$scene]; + if (this.loaded || !this[$shouldAttemptPreload]() || + this.src === scene.url) { + return; + } + if (this.generateSchema) { + scene.updateSchema(this.src); + } + this[$updateStatus]('Loading'); + // If we are loading a new model, we need to stop the animation of + // the current one (if any is playing). Otherwise, we might lose + // the reference to the scene root and running actions start to + // throw exceptions and/or behave in unexpected ways: + scene.stopAnimation(); + const updateSourceProgress = this[$progressTracker].beginActivity('model-load'); + const source = this.src; + try { + const srcUpdated = scene.setSource(source, (progress) => updateSourceProgress(clamp(progress, 0, 1) * 0.95)); + const envUpdated = this[$updateEnvironment](); + await Promise.all([srcUpdated, envUpdated]); + this[$markLoaded](); + this[$onModelLoad](); + this.updateComplete.then(() => { + this.dispatchEvent(new CustomEvent('before-render')); + }); + // Wait for shaders to compile and pixels to be drawn. + await new Promise(resolve => { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + this.dispatchEvent(new CustomEvent('load', { detail: { url: source } })); + resolve(); + }); + }); + }); + } + catch (error) { + this.dispatchEvent(new CustomEvent('error', { detail: { type: 'loadfailure', sourceError: error } })); + } + finally { + updateSourceProgress(1.0); + } + } +} +__decorate$4([ + property({ type: String }) +], ModelViewerElementBase.prototype, "alt", void 0); +__decorate$4([ + property({ type: String }) +], ModelViewerElementBase.prototype, "src", void 0); +__decorate$4([ + property({ type: Boolean, attribute: 'with-credentials' }) +], ModelViewerElementBase.prototype, "withCredentials", void 0); +__decorate$4([ + property({ type: Boolean, attribute: 'generate-schema' }) +], ModelViewerElementBase.prototype, "generateSchema", void 0); + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$3 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +const MILLISECONDS_PER_SECOND = 1000.0; +const $changeAnimation = Symbol('changeAnimation'); +const $appendAnimation = Symbol('appendAnimation'); +const $detachAnimation = Symbol('detachAnimation'); +const $paused = Symbol('paused'); +const DEFAULT_PLAY_OPTIONS = { + repetitions: Infinity, + pingpong: false +}; +const DEFAULT_APPEND_OPTIONS = { + pingpong: false, + repetitions: null, + weight: 1, + timeScale: 1, + fade: false, + warp: false, + relativeWarp: true, + time: null +}; +const DEFAULT_DETACH_OPTIONS = { + fade: true +}; +const AnimationMixin = (ModelViewerElement) => { + var _a; + class AnimationModelViewerElement extends ModelViewerElement { + constructor(...args) { + super(args); + this.autoplay = false; + this.animationName = undefined; + this.animationCrossfadeDuration = 300; + this[_a] = true; + this[$scene].subscribeMixerEvent('loop', (e) => { + const count = e.action._loopCount; + const name = e.action._clip.name; + const uuid = e.action._clip.uuid; + const targetAnimation = this[$scene].markedAnimations.find(e => e.name === name); + if (targetAnimation) { + this[$scene].updateAnimationLoop(targetAnimation.name, targetAnimation.loopMode, targetAnimation.repetitionCount); + const filtredArr = this[$scene].markedAnimations.filter(e => e.name !== name); + this[$scene].markedAnimations = filtredArr; + } + this.dispatchEvent(new CustomEvent('loop', { detail: { count, name, uuid } })); + }); + this[$scene].subscribeMixerEvent('finished', (e) => { + if (!this[$scene].appendedAnimations.includes(e.action._clip.name)) { + this[$paused] = true; + } + else { + const filteredList = this[$scene].appendedAnimations.filter(i => i !== e.action._clip.name); + this[$scene].appendedAnimations = filteredList; + } + this.dispatchEvent(new CustomEvent('finished')); + }); + } + /** + * Returns an array + */ + get availableAnimations() { + if (this.loaded) { + return this[$scene].animationNames; + } + return []; + } + get duration() { + return this[$scene].duration; + } + get paused() { + return this[$paused]; + } + get currentTime() { + return this[$scene].animationTime; + } + get appendedAnimations() { + return this[$scene].appendedAnimations; + } + set currentTime(value) { + this[$scene].animationTime = value; + this[$needsRender](); + } + get timeScale() { + return this[$scene].animationTimeScale; + } + set timeScale(value) { + this[$scene].animationTimeScale = value; + } + pause() { + if (this[$paused]) { + return; + } + this[$paused] = true; + this.dispatchEvent(new CustomEvent('pause')); + } + play(options) { + if (this.availableAnimations.length > 0) { + this[$paused] = false; + this[$changeAnimation](options); + this.dispatchEvent(new CustomEvent('play')); + } + } + appendAnimation(animationName, options) { + if (this.availableAnimations.length > 0) { + this[$paused] = false; + this[$appendAnimation](animationName, options); + this.dispatchEvent(new CustomEvent('append-animation')); + } + } + detachAnimation(animationName, options) { + if (this.availableAnimations.length > 0) { + this[$paused] = false; + this[$detachAnimation](animationName, options); + this.dispatchEvent(new CustomEvent('detach-animation')); + } + } + [(_a = $paused, $onModelLoad)]() { + super[$onModelLoad](); + this[$paused] = true; + if (this.animationName != null) { + this[$changeAnimation](); + } + if (this.autoplay) { + this.play(); + } + } + [$tick](_time, delta) { + super[$tick](_time, delta); + if (this[$paused] || + (!this[$getModelIsVisible]() && !this[$renderer].isPresenting)) { + return; + } + this[$scene].updateAnimation(delta / MILLISECONDS_PER_SECOND); + this[$needsRender](); + } + updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('autoplay') && this.autoplay) { + this.play(); + } + if (changedProperties.has('animationName')) { + this[$changeAnimation](); + } + } + [$changeAnimation](options = DEFAULT_PLAY_OPTIONS) { + var _b; + const repetitions = (_b = options.repetitions) !== null && _b !== void 0 ? _b : Infinity; + const mode = options.pingpong ? + LoopPingPong : + (repetitions === 1 ? LoopOnce : LoopRepeat); + this[$scene].playAnimation(this.animationName, this.animationCrossfadeDuration / MILLISECONDS_PER_SECOND, mode, repetitions); + // If we are currently paused, we need to force a render so that + // the scene updates to the first frame of the new animation + if (this[$paused]) { + this[$scene].updateAnimation(0); + this[$needsRender](); + } + } + [$appendAnimation](animationName = '', options = DEFAULT_APPEND_OPTIONS) { + var _b; + const repetitions = (_b = options.repetitions) !== null && _b !== void 0 ? _b : Infinity; + const mode = options.pingpong ? + LoopPingPong : + (repetitions === 1 ? LoopOnce : LoopRepeat); + const needsToStop = !!options.repetitions || 'pingpong' in options; + this[$scene].appendAnimation(animationName ? animationName : this.animationName, mode, repetitions, options.weight, options.timeScale, options.fade, options.warp, options.relativeWarp, options.time, needsToStop); + // If we are currently paused, we need to force a render so that + // the scene updates to the first frame of the new animation + if (this[$paused]) { + this[$scene].updateAnimation(0); + this[$needsRender](); + } + } + [$detachAnimation](animationName = '', options = DEFAULT_DETACH_OPTIONS) { + this[$scene].detachAnimation(animationName ? animationName : this.animationName, options.fade); + // If we are currently paused, we need to force a render so that + // the scene updates to the first frame of the new animation + if (this[$paused]) { + this[$scene].updateAnimation(0); + this[$needsRender](); + } + } + } + __decorate$3([ + property({ type: Boolean }) + ], AnimationModelViewerElement.prototype, "autoplay", void 0); + __decorate$3([ + property({ type: String, attribute: 'animation-name' }) + ], AnimationModelViewerElement.prototype, "animationName", void 0); + __decorate$3([ + property({ type: Number, attribute: 'animation-crossfade-duration' }) + ], AnimationModelViewerElement.prototype, "animationCrossfadeDuration", void 0); + return AnimationModelViewerElement; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const $hotspotMap = Symbol('hotspotMap'); +const $mutationCallback = Symbol('mutationCallback'); +const $observer = Symbol('observer'); +const $addHotspot = Symbol('addHotspot'); +const $removeHotspot = Symbol('removeHotspot'); +const worldToModel = new Matrix4(); +/** + * AnnotationMixin implements a declarative API to add hotspots and annotations. + * Child elements of the element that have a slot name that + * begins with "hotspot" and data-position and data-normal attributes in + * the format of the camera-target attribute will be added to the scene and + * track the specified model coordinates. + */ +const AnnotationMixin = (ModelViewerElement) => { + var _a, _b, _c; + class AnnotationModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this[_a] = new Map(); + this[_b] = (mutations) => { + mutations.forEach((mutation) => { + // NOTE: Be wary that in ShadyDOM cases, the MutationRecord + // only has addedNodes and removedNodes (and no other details). + if (!(mutation instanceof MutationRecord) || + mutation.type === 'childList') { + mutation.addedNodes.forEach((node) => { + this[$addHotspot](node); + }); + mutation.removedNodes.forEach((node) => { + this[$removeHotspot](node); + }); + this[$needsRender](); + } + }); + }; + this[_c] = new MutationObserver(this[$mutationCallback]); + } + connectedCallback() { + super.connectedCallback(); + for (let i = 0; i < this.children.length; ++i) { + this[$addHotspot](this.children[i]); + } + const { ShadyDOM } = self; + if (ShadyDOM == null) { + this[$observer].observe(this, { childList: true }); + } + else { + this[$observer] = + ShadyDOM.observeChildren(this, this[$mutationCallback]); + } + } + disconnectedCallback() { + super.disconnectedCallback(); + const { ShadyDOM } = self; + if (ShadyDOM == null) { + this[$observer].disconnect(); + } + else { + ShadyDOM.unobserveChildren(this[$observer]); + } + } + [(_a = $hotspotMap, _b = $mutationCallback, _c = $observer, $onModelLoad)]() { + super[$onModelLoad](); + const scene = this[$scene]; + scene.forHotspots((hotspot) => { + scene.updateSurfaceHotspot(hotspot); + }); + } + [$tick](time, delta) { + super[$tick](time, delta); + const scene = this[$scene]; + const { annotationRenderer } = scene; + const camera = scene.getCamera(); + if (scene.shouldRender()) { + scene.animateSurfaceHotspots(); + scene.updateHotspotsVisibility(camera.position); + annotationRenderer.domElement.style.display = ''; + annotationRenderer.render(scene, camera); + } + } + /** + * Since the data-position and data-normal attributes are not observed, use + * this method to move a hotspot. Keep in mind that all hotspots with the + * same slot name use a single location and the first definition takes + * precedence, until updated with this method. + */ + updateHotspot(config) { + const hotspot = this[$hotspotMap].get(config.name); + if (hotspot == null) { + return; + } + hotspot.updatePosition(config.position); + hotspot.updateNormal(config.normal); + hotspot.surface = config.surface; + this[$scene].updateSurfaceHotspot(hotspot); + this[$needsRender](); + } + /** + * This method returns in-scene data about a requested hotspot including + * its position in screen (canvas) space and its current visibility. + */ + queryHotspot(name) { + const hotspot = this[$hotspotMap].get(name); + if (hotspot == null) { + return null; + } + const position = toVector3D(hotspot.position); + const normal = toVector3D(hotspot.normal); + const facingCamera = hotspot.facingCamera; + const scene = this[$scene]; + const camera = scene.getCamera(); + const vector = new Vector3(); + vector.setFromMatrixPosition(hotspot.matrixWorld); + vector.project(camera); + const widthHalf = scene.width / 2; + const heightHalf = scene.height / 2; + vector.x = (vector.x * widthHalf) + widthHalf; + vector.y = -(vector.y * heightHalf) + heightHalf; + const canvasPosition = toVector3D(new Vector3(vector.x, vector.y, vector.z)); + if (!Number.isFinite(canvasPosition.x) || + !Number.isFinite(canvasPosition.y)) { + return null; + } + return { position, normal, canvasPosition, facingCamera }; + } + /** + * This method returns the model position, normal and texture coordinate + * of the point on the mesh corresponding to the input pixel coordinates + * given relative to the model-viewer element. The position and normal + * are returned as strings in the format suitable for putting in a + * hotspot's data-position and data-normal attributes. If the mesh is + * not hit, the result is null. + */ + positionAndNormalFromPoint(pixelX, pixelY) { + const scene = this[$scene]; + const ndcPosition = scene.getNDC(pixelX, pixelY); + const hit = scene.positionAndNormalFromPoint(ndcPosition); + if (hit == null) { + return null; + } + worldToModel.copy(scene.target.matrixWorld).invert(); + const position = toVector3D(hit.position.applyMatrix4(worldToModel)); + const normal = toVector3D(hit.normal.transformDirection(worldToModel)); + let uv = null; + if (hit.uv != null) { + uv = toVector2D(hit.uv); + } + return { position: position, normal: normal, uv: uv }; + } + /** + * This method returns a dynamic hotspot ID string of the point on the mesh + * corresponding to the input pixel coordinates given relative to the + * model-viewer element. The ID string can be used in the data-surface + * attribute of the hotspot to make it follow this point on the surface even + * as the model animates. If the mesh is not hit, the result is null. + */ + surfaceFromPoint(pixelX, pixelY) { + const scene = this[$scene]; + const ndcPosition = scene.getNDC(pixelX, pixelY); + return scene.surfaceFromPoint(ndcPosition); + } + [$addHotspot](node) { + if (!(node instanceof HTMLElement && + node.slot.indexOf('hotspot') === 0)) { + return; + } + let hotspot = this[$hotspotMap].get(node.slot); + if (hotspot != null) { + hotspot.increment(); + } + else { + hotspot = new Hotspot({ + name: node.slot, + position: node.dataset.position, + normal: node.dataset.normal, + surface: node.dataset.surface, + }); + this[$hotspotMap].set(node.slot, hotspot); + this[$scene].addHotspot(hotspot); + } + this[$scene].queueRender(); + } + [$removeHotspot](node) { + if (!(node instanceof HTMLElement)) { + return; + } + const hotspot = this[$hotspotMap].get(node.slot); + if (!hotspot) { + return; + } + if (hotspot.decrement()) { + this[$scene].removeHotspot(hotspot); + this[$hotspotMap].delete(node.slot); + } + this[$scene].queueRender(); + } + } + return AnnotationModelViewerElement; +}; + +/*! +fflate - fast JavaScript compression/decompression + +Licensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE +version 0.8.2 +*/ + + +// aliases for shorter compressed code (most minifers don't do this) +var u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array; +// fixed length extra bits +var fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]); +// fixed distance extra bits +var fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]); +// code length index map +var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +// get base, reverse index map from extra bits +var freb = function (eb, start) { + var b = new u16(31); + for (var i = 0; i < 31; ++i) { + b[i] = start += 1 << eb[i - 1]; + } + // numbers here are at max 18 bits + var r = new i32(b[30]); + for (var i = 1; i < 30; ++i) { + for (var j = b[i]; j < b[i + 1]; ++j) { + r[j] = ((j - b[i]) << 5) | i; + } + } + return { b: b, r: r }; +}; +var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r; +// we can ignore the fact that the other numbers are wrong; they never happen anyway +fl[28] = 258, revfl[258] = 28; +var _b = freb(fdeb, 0), revfd = _b.r; +// map of value to reverse (assuming 16 bits) +var rev = new u16(32768); +for (var i = 0; i < 32768; ++i) { + // reverse table algorithm from SO + var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1); + x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2); + x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4); + rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1; +} +// create huffman tree from u8 "map": index -> code length for code index +// mb (max bits) must be at most 15 +// TODO: optimize/split up? +var hMap = (function (cd, mb, r) { + var s = cd.length; + // index + var i = 0; + // u16 "map": index -> # of codes with bit length = index + var l = new u16(mb); + // length of cd must be 288 (total # of codes) + for (; i < s; ++i) { + if (cd[i]) + ++l[cd[i] - 1]; + } + // u16 "map": index -> minimum code for bit length = index + var le = new u16(mb); + for (i = 1; i < mb; ++i) { + le[i] = (le[i - 1] + l[i - 1]) << 1; + } + var co; + if (r) { + // u16 "map": index -> number of actual bits, symbol for code + co = new u16(1 << mb); + // bits to remove for reverser + var rvb = 15 - mb; + for (i = 0; i < s; ++i) { + // ignore 0 lengths + if (cd[i]) { + // num encoding both symbol and bits read + var sv = (i << 4) | cd[i]; + // free bits + var r_1 = mb - cd[i]; + // start value + var v = le[cd[i] - 1]++ << r_1; + // m is end value + for (var m = v | ((1 << r_1) - 1); v <= m; ++v) { + // every 16 bit value starting with the code yields the same result + co[rev[v] >> rvb] = sv; + } + } + } + } + else { + co = new u16(s); + for (i = 0; i < s; ++i) { + if (cd[i]) { + co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]); + } + } + } + return co; +}); +// fixed length tree +var flt = new u8(288); +for (var i = 0; i < 144; ++i) + flt[i] = 8; +for (var i = 144; i < 256; ++i) + flt[i] = 9; +for (var i = 256; i < 280; ++i) + flt[i] = 7; +for (var i = 280; i < 288; ++i) + flt[i] = 8; +// fixed distance tree +var fdt = new u8(32); +for (var i = 0; i < 32; ++i) + fdt[i] = 5; +// fixed length map +var flm = /*#__PURE__*/ hMap(flt, 9, 0); +// fixed distance map +var fdm = /*#__PURE__*/ hMap(fdt, 5, 0); +// get end of byte +var shft = function (p) { return ((p + 7) / 8) | 0; }; +// typed array slice - allows garbage collector to free original reference, +// while being more compatible than .slice +var slc = function (v, s, e) { + if (e == null || e > v.length) + e = v.length; + // can't use .constructor in case user-supplied + return new u8(v.subarray(s, e)); +}; +// error codes +var ec = [ + 'unexpected EOF', + 'invalid block type', + 'invalid length/literal', + 'invalid distance', + 'stream finished', + 'no stream handler', + , + 'no callback', + 'invalid UTF-8 data', + 'extra field too long', + 'date not in range 1980-2099', + 'filename too long', + 'stream finishing', + 'invalid zip data' + // determined by unknown compression method +]; +var err = function (ind, msg, nt) { + var e = new Error(msg || ec[ind]); + e.code = ind; + if (Error.captureStackTrace) + Error.captureStackTrace(e, err); + if (!nt) + throw e; + return e; +}; +// starting at p, write the minimum number of bits that can hold v to d +var wbits = function (d, p, v) { + v <<= p & 7; + var o = (p / 8) | 0; + d[o] |= v; + d[o + 1] |= v >> 8; +}; +// starting at p, write the minimum number of bits (>8) that can hold v to d +var wbits16 = function (d, p, v) { + v <<= p & 7; + var o = (p / 8) | 0; + d[o] |= v; + d[o + 1] |= v >> 8; + d[o + 2] |= v >> 16; +}; +// creates code lengths from a frequency table +var hTree = function (d, mb) { + // Need extra info to make a tree + var t = []; + for (var i = 0; i < d.length; ++i) { + if (d[i]) + t.push({ s: i, f: d[i] }); + } + var s = t.length; + var t2 = t.slice(); + if (!s) + return { t: et, l: 0 }; + if (s == 1) { + var v = new u8(t[0].s + 1); + v[t[0].s] = 1; + return { t: v, l: 1 }; + } + t.sort(function (a, b) { return a.f - b.f; }); + // after i2 reaches last ind, will be stopped + // freq must be greater than largest possible number of symbols + t.push({ s: -1, f: 25001 }); + var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2; + t[0] = { s: -1, f: l.f + r.f, l: l, r: r }; + // efficient algorithm from UZIP.js + // i0 is lookbehind, i2 is lookahead - after processing two low-freq + // symbols that combined have high freq, will start processing i2 (high-freq, + // non-composite) symbols instead + // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/ + while (i1 != s - 1) { + l = t[t[i0].f < t[i2].f ? i0++ : i2++]; + r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++]; + t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r }; + } + var maxSym = t2[0].s; + for (var i = 1; i < s; ++i) { + if (t2[i].s > maxSym) + maxSym = t2[i].s; + } + // code lengths + var tr = new u16(maxSym + 1); + // max bits in tree + var mbt = ln(t[i1 - 1], tr, 0); + if (mbt > mb) { + // more algorithms from UZIP.js + // TODO: find out how this code works (debt) + // ind debt + var i = 0, dt = 0; + // left cost + var lft = mbt - mb, cst = 1 << lft; + t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; }); + for (; i < s; ++i) { + var i2_1 = t2[i].s; + if (tr[i2_1] > mb) { + dt += cst - (1 << (mbt - tr[i2_1])); + tr[i2_1] = mb; + } + else + break; + } + dt >>= lft; + while (dt > 0) { + var i2_2 = t2[i].s; + if (tr[i2_2] < mb) + dt -= 1 << (mb - tr[i2_2]++ - 1); + else + ++i; + } + for (; i >= 0 && dt; --i) { + var i2_3 = t2[i].s; + if (tr[i2_3] == mb) { + --tr[i2_3]; + ++dt; + } + } + mbt = mb; + } + return { t: new u8(tr), l: mbt }; +}; +// get the max length and assign length codes +var ln = function (n, l, d) { + return n.s == -1 + ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) + : (l[n.s] = d); +}; +// length codes generation +var lc = function (c) { + var s = c.length; + // Note that the semicolon was intentional + while (s && !c[--s]) + ; + var cl = new u16(++s); + // ind num streak + var cli = 0, cln = c[0], cls = 1; + var w = function (v) { cl[cli++] = v; }; + for (var i = 1; i <= s; ++i) { + if (c[i] == cln && i != s) + ++cls; + else { + if (!cln && cls > 2) { + for (; cls > 138; cls -= 138) + w(32754); + if (cls > 2) { + w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305); + cls = 0; + } + } + else if (cls > 3) { + w(cln), --cls; + for (; cls > 6; cls -= 6) + w(8304); + if (cls > 2) + w(((cls - 3) << 5) | 8208), cls = 0; + } + while (cls--) + w(cln); + cls = 1; + cln = c[i]; + } + } + return { c: cl.subarray(0, cli), n: s }; +}; +// calculate the length of output from tree, code lengths +var clen = function (cf, cl) { + var l = 0; + for (var i = 0; i < cl.length; ++i) + l += cf[i] * cl[i]; + return l; +}; +// writes a fixed block +// returns the new bit pos +var wfblk = function (out, pos, dat) { + // no need to write 00 as type: TypedArray defaults to 0 + var s = dat.length; + var o = shft(pos + 2); + out[o] = s & 255; + out[o + 1] = s >> 8; + out[o + 2] = out[o] ^ 255; + out[o + 3] = out[o + 1] ^ 255; + for (var i = 0; i < s; ++i) + out[o + i + 4] = dat[i]; + return (o + 4 + s) * 8; +}; +// writes a block +var wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) { + wbits(out, p++, final); + ++lf[256]; + var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l; + var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l; + var _c = lc(dlt), lclt = _c.c, nlc = _c.n; + var _d = lc(ddt), lcdt = _d.c, ndc = _d.n; + var lcfreq = new u16(19); + for (var i = 0; i < lclt.length; ++i) + ++lcfreq[lclt[i] & 31]; + for (var i = 0; i < lcdt.length; ++i) + ++lcfreq[lcdt[i] & 31]; + var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l; + var nlcc = 19; + for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc) + ; + var flen = (bl + 5) << 3; + var ftlen = clen(lf, flt) + clen(df, fdt) + eb; + var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]; + if (bs >= 0 && flen <= ftlen && flen <= dtlen) + return wfblk(out, p, dat.subarray(bs, bs + bl)); + var lm, ll, dm, dl; + wbits(out, p, 1 + (dtlen < ftlen)), p += 2; + if (dtlen < ftlen) { + lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt; + var llm = hMap(lct, mlcb, 0); + wbits(out, p, nlc - 257); + wbits(out, p + 5, ndc - 1); + wbits(out, p + 10, nlcc - 4); + p += 14; + for (var i = 0; i < nlcc; ++i) + wbits(out, p + 3 * i, lct[clim[i]]); + p += 3 * nlcc; + var lcts = [lclt, lcdt]; + for (var it = 0; it < 2; ++it) { + var clct = lcts[it]; + for (var i = 0; i < clct.length; ++i) { + var len = clct[i] & 31; + wbits(out, p, llm[len]), p += lct[len]; + if (len > 15) + wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12; + } + } + } + else { + lm = flm, ll = flt, dm = fdm, dl = fdt; + } + for (var i = 0; i < li; ++i) { + var sym = syms[i]; + if (sym > 255) { + var len = (sym >> 18) & 31; + wbits16(out, p, lm[len + 257]), p += ll[len + 257]; + if (len > 7) + wbits(out, p, (sym >> 23) & 31), p += fleb[len]; + var dst = sym & 31; + wbits16(out, p, dm[dst]), p += dl[dst]; + if (dst > 3) + wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst]; + } + else { + wbits16(out, p, lm[sym]), p += ll[sym]; + } + } + wbits16(out, p, lm[256]); + return p + ll[256]; +}; +// deflate options (nice << 13) | chain +var deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]); +// empty +var et = /*#__PURE__*/ new u8(0); +// compresses data into a raw DEFLATE buffer +var dflt = function (dat, lvl, plvl, pre, post, st) { + var s = st.z || dat.length; + var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post); + // writing to this writes to the output buffer + var w = o.subarray(pre, o.length - post); + var lst = st.l; + var pos = (st.r || 0) & 7; + if (lvl) { + if (pos) + w[0] = st.r >> 3; + var opt = deo[lvl - 1]; + var n = opt >> 13, c = opt & 8191; + var msk_1 = (1 << plvl) - 1; + // prev 2-byte val map curr 2-byte val map + var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1); + var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1; + var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; }; + // 24576 is an arbitrary number of maximum symbols per block + // 424 buffer for last block + var syms = new i32(25000); + // length/literal freq distance freq + var lf = new u16(288), df = new u16(32); + // l/lcnt exbits index l/lind waitdx blkpos + var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0; + for (; i + 2 < s; ++i) { + // hash value + var hv = hsh(i); + // index mod 32768 previous index mod + var imod = i & 32767, pimod = head[hv]; + prev[imod] = pimod; + head[hv] = imod; + // We always should modify head and prev, but only add symbols if + // this data is not yet processed ("wait" for wait index) + if (wi <= i) { + // bytes remaining + var rem = s - i; + if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) { + pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos); + li = lc_1 = eb = 0, bs = i; + for (var j = 0; j < 286; ++j) + lf[j] = 0; + for (var j = 0; j < 30; ++j) + df[j] = 0; + } + // len dist chain + var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767; + if (rem > 2 && hv == hsh(i - dif)) { + var maxn = Math.min(n, rem) - 1; + var maxd = Math.min(32767, i); + // max possible length + // not capped at dif because decompressors implement "rolling" index population + var ml = Math.min(258, rem); + while (dif <= maxd && --ch_1 && imod != pimod) { + if (dat[i + l] == dat[i + l - dif]) { + var nl = 0; + for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl) + ; + if (nl > l) { + l = nl, d = dif; + // break out early when we reach "nice" (we are satisfied enough) + if (nl > maxn) + break; + // now, find the rarest 2-byte sequence within this + // length of literals and search for that instead. + // Much faster than just using the start + var mmd = Math.min(dif, nl - 2); + var md = 0; + for (var j = 0; j < mmd; ++j) { + var ti = i - dif + j & 32767; + var pti = prev[ti]; + var cd = ti - pti & 32767; + if (cd > md) + md = cd, pimod = ti; + } + } + } + // check the previous match + imod = pimod, pimod = prev[imod]; + dif += imod - pimod & 32767; + } + } + // d will be nonzero only when a match was found + if (d) { + // store both dist and len data in one int32 + // Make sure this is recognized as a len/dist with 28th bit (2^28) + syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d]; + var lin = revfl[l] & 31, din = revfd[d] & 31; + eb += fleb[lin] + fdeb[din]; + ++lf[257 + lin]; + ++df[din]; + wi = i + l; + ++lc_1; + } + else { + syms[li++] = dat[i]; + ++lf[dat[i]]; + } + } + } + for (i = Math.max(i, wi); i < s; ++i) { + syms[li++] = dat[i]; + ++lf[dat[i]]; + } + pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos); + if (!lst) { + st.r = (pos & 7) | w[(pos / 8) | 0] << 3; + // shft(pos) now 1 less if pos & 7 != 0 + pos -= 7; + st.h = head, st.p = prev, st.i = i, st.w = wi; + } + } + else { + for (var i = st.w || 0; i < s + lst; i += 65535) { + // end + var e = i + 65535; + if (e >= s) { + // write final block + w[(pos / 8) | 0] = lst; + e = s; + } + pos = wfblk(w, pos + 1, dat.subarray(i, e)); + } + st.i = s; + } + return slc(o, 0, pre + shft(pos) + post); +}; +// CRC32 table +var crct = /*#__PURE__*/ (function () { + var t = new Int32Array(256); + for (var i = 0; i < 256; ++i) { + var c = i, k = 9; + while (--k) + c = ((c & 1) && -306674912) ^ (c >>> 1); + t[i] = c; + } + return t; +})(); +// CRC32 +var crc = function () { + var c = -1; + return { + p: function (d) { + // closures have awful performance + var cr = c; + for (var i = 0; i < d.length; ++i) + cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8); + c = cr; + }, + d: function () { return ~c; } + }; +}; +// deflate with opts +var dopt = function (dat, opt, pre, post, st) { + if (!st) { + st = { l: 1 }; + if (opt.dictionary) { + var dict = opt.dictionary.subarray(-32768); + var newDat = new u8(dict.length + dat.length); + newDat.set(dict); + newDat.set(dat, dict.length); + dat = newDat; + st.w = dict.length; + } + } + return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st); +}; +// Walmart object spread +var mrg = function (a, b) { + var o = {}; + for (var k in a) + o[k] = a[k]; + for (var k in b) + o[k] = b[k]; + return o; +}; +// write bytes +var wbytes = function (d, b, v) { + for (; v; ++b) + d[b] = v, v >>>= 8; +}; +/** + * Compresses data with DEFLATE without any wrapper + * @param data The data to compress + * @param opts The compression options + * @returns The deflated version of the data + */ +function deflateSync(data, opts) { + return dopt(data, opts || {}, 0, 0); +} +// flatten a directory structure +var fltn = function (d, p, t, o) { + for (var k in d) { + var val = d[k], n = p + k, op = o; + if (Array.isArray(val)) + op = mrg(o, val[1]), val = val[0]; + if (val instanceof u8) + t[n] = [val, op]; + else { + t[n += '/'] = [new u8(0), op]; + fltn(val, n, t, o); + } + } +}; +// text encoder +var te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder(); +// text decoder +var td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder(); +// text decoder stream +var tds = 0; +try { + td.decode(et, { stream: true }); + tds = 1; +} +catch (e) { } +/** + * Converts a string into a Uint8Array for use with compression/decompression methods + * @param str The string to encode + * @param latin1 Whether or not to interpret the data as Latin-1. This should + * not need to be true unless decoding a binary string. + * @returns The string encoded in UTF-8/Latin-1 binary + */ +function strToU8(str, latin1) { + var i; + if (te) + return te.encode(str); + var l = str.length; + var ar = new u8(str.length + (str.length >> 1)); + var ai = 0; + var w = function (v) { ar[ai++] = v; }; + for (var i = 0; i < l; ++i) { + if (ai + 5 > ar.length) { + var n = new u8(ai + 8 + ((l - i) << 1)); + n.set(ar); + ar = n; + } + var c = str.charCodeAt(i); + if (c < 128 || latin1) + w(c); + else if (c < 2048) + w(192 | (c >> 6)), w(128 | (c & 63)); + else if (c > 55295 && c < 57344) + c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023), + w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63)); + else + w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63)); + } + return slc(ar, 0, ai); +} +// extra field length +var exfl = function (ex) { + var le = 0; + if (ex) { + for (var k in ex) { + var l = ex[k].length; + if (l > 65535) + err(9); + le += l + 4; + } + } + return le; +}; +// write zip header +var wzh = function (d, b, f, fn, u, c, ce, co) { + var fl = fn.length, ex = f.extra, col = co && co.length; + var exl = exfl(ex); + wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4; + if (ce != null) + d[b++] = 20, d[b++] = f.os; + d[b] = 20, b += 2; // spec compliance? what's that? + d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8; + d[b++] = f.compression & 255, d[b++] = f.compression >> 8; + var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980; + if (y < 0 || y > 119) + err(10); + wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4; + if (c != -1) { + wbytes(d, b, f.crc); + wbytes(d, b + 4, c < 0 ? -c - 2 : c); + wbytes(d, b + 8, f.size); + } + wbytes(d, b + 12, fl); + wbytes(d, b + 14, exl), b += 16; + if (ce != null) { + wbytes(d, b, col); + wbytes(d, b + 6, f.attrs); + wbytes(d, b + 10, ce), b += 14; + } + d.set(fn, b); + b += fl; + if (exl) { + for (var k in ex) { + var exf = ex[k], l = exf.length; + wbytes(d, b, +k); + wbytes(d, b + 2, l); + d.set(exf, b + 4), b += 4 + l; + } + } + if (col) + d.set(co, b), b += col; + return b; +}; +// write zip footer (end of central directory) +var wzf = function (o, b, c, d, e) { + wbytes(o, b, 0x6054B50); // skip disk + wbytes(o, b + 8, c); + wbytes(o, b + 10, c); + wbytes(o, b + 12, d); + wbytes(o, b + 16, e); +}; +/** + * Synchronously creates a ZIP file. Prefer using `zip` for better performance + * with more than one file. + * @param data The directory structure for the ZIP archive + * @param opts The main options, merged with per-file options + * @returns The generated ZIP archive + */ +function zipSync(data, opts) { + if (!opts) + opts = {}; + var r = {}; + var files = []; + fltn(data, '', r, opts); + var o = 0; + var tot = 0; + for (var fn in r) { + var _a = r[fn], file = _a[0], p = _a[1]; + var compression = p.level == 0 ? 0 : 8; + var f = strToU8(fn), s = f.length; + var com = p.comment, m = com && strToU8(com), ms = m && m.length; + var exl = exfl(p.extra); + if (s > 65535) + err(11); + var d = compression ? deflateSync(file, p) : file, l = d.length; + var c = crc(); + c.p(file); + files.push(mrg(p, { + size: file.length, + crc: c.d(), + c: d, + f: f, + m: m, + u: s != fn.length || (m && (com.length != ms)), + o: o, + compression: compression + })); + o += 30 + s + exl + l; + tot += 76 + 2 * (s + exl) + (ms || 0) + l; + } + var out = new u8(tot + 22), oe = o, cdl = tot - o; + for (var i = 0; i < files.length; ++i) { + var f = files[i]; + wzh(out, f.o, f, f.f, f.u, f.c.length); + var badd = 30 + f.f.length + exfl(f.extra); + out.set(f.c, f.o + badd); + wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0); + } + wzf(out, o, files.length, cdl, oe); + return out; +} + +class USDZExporter { + + constructor() { + + this.textureUtils = null; + + } + + setTextureUtils( utils ) { + + this.textureUtils = utils; + + } + + parse( scene, onDone, onError, options ) { + + this.parseAsync( scene, options ).then( onDone ).catch( onError ); + + } + + async parseAsync( scene, options = {} ) { + + options = Object.assign( { + ar: { + anchoring: { type: 'plane' }, + planeAnchoring: { alignment: 'horizontal' } + }, + includeAnchoringProperties: true, + quickLookCompatible: false, + maxTextureSize: 1024, + }, options ); + + const files = {}; + const modelFileName = 'model.usda'; + + // model file should be first in USDZ archive so we init it here + files[ modelFileName ] = null; + + let output = buildHeader(); + + output += buildSceneStart( options ); + + const materials = {}; + const textures = {}; + + scene.traverseVisible( ( object ) => { + + if ( object.isMesh ) { + + const geometry = object.geometry; + const material = object.material; + + if ( material.isMeshStandardMaterial ) { + + const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usda'; + + if ( ! ( geometryFileName in files ) ) { + + const meshObject = buildMeshObject( geometry ); + files[ geometryFileName ] = buildUSDFileAsString( meshObject ); + + } + + if ( ! ( material.uuid in materials ) ) { + + materials[ material.uuid ] = material; + + } + + output += buildXform( object, geometry, material ); + + } else { + + console.warn( 'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)', object ); + + } + + } else if ( object.isCamera ) { + + output += buildCamera( object ); + + } + + } ); + + + output += buildSceneEnd(); + + output += buildMaterials( materials, textures, options.quickLookCompatible ); + + files[ modelFileName ] = strToU8( output ); + output = null; + + for ( const id in textures ) { + + let texture = textures[ id ]; + + if ( texture.isCompressedTexture === true ) { + + if ( this.textureUtils === null ) { + + throw new Error( 'THREE.USDZExporter: setTextureUtils() must be called to process compressed textures.' ); + + } else { + + texture = await this.textureUtils.decompress( texture ); + + } + + } + + const canvas = imageToCanvas( texture.image, texture.flipY, options.maxTextureSize ); + const blob = await new Promise( resolve => canvas.toBlob( resolve, 'image/png', 1 ) ); + + files[ `textures/Texture_${ id }.png` ] = new Uint8Array( await blob.arrayBuffer() ); + + } + + // 64 byte alignment + // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109 + + let offset = 0; + + for ( const filename in files ) { + + const file = files[ filename ]; + const headerSize = 34 + filename.length; + + offset += headerSize; + + const offsetMod64 = offset & 63; + + if ( offsetMod64 !== 4 ) { + + const padLength = 64 - offsetMod64; + const padding = new Uint8Array( padLength ); + + files[ filename ] = [ file, { extra: { 12345: padding } } ]; + + } + + offset = file.length; + + } + + return zipSync( files, { level: 0 } ); + + } + +} + +function imageToCanvas( image, flipY, maxTextureSize ) { + + if ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || + ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) || + ( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) || + ( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) { + + const scale = maxTextureSize / Math.max( image.width, image.height ); + + const canvas = document.createElement( 'canvas' ); + canvas.width = image.width * Math.min( 1, scale ); + canvas.height = image.height * Math.min( 1, scale ); + + const context = canvas.getContext( '2d' ); + + // TODO: We should be able to do this in the UsdTransform2d? + + if ( flipY === true ) { + + context.translate( 0, canvas.height ); + context.scale( 1, -1 ); + + } + + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + return canvas; + + } else { + + throw new Error( 'THREE.USDZExporter: No valid image data found. Unable to process texture.' ); + + } + +} + +// + +const PRECISION = 7; + +function buildHeader() { + + return `#usda 1.0 +( + customLayerData = { + string creator = "Three.js USDZExporter" + } + defaultPrim = "Root" + metersPerUnit = 1 + upAxis = "Y" +) + +`; + +} + +function buildSceneStart( options ) { + + const alignment = options.includeAnchoringProperties === true ? ` + token preliminary:anchoring:type = "${options.ar.anchoring.type}" + token preliminary:planeAnchoring:alignment = "${options.ar.planeAnchoring.alignment}" + ` : ''; + return `def Xform "Root" +{ + def Scope "Scenes" ( + kind = "sceneLibrary" + ) + { + def Xform "Scene" ( + customData = { + bool preliminary_collidesWithEnvironment = 0 + string sceneName = "Scene" + } + sceneName = "Scene" + ) + {${alignment} +`; + +} + +function buildSceneEnd() { + + return ` + } + } +} + +`; + +} + +function buildUSDFileAsString( dataToInsert ) { + + let output = buildHeader(); + output += dataToInsert; + return strToU8( output ); + +} + +// Xform + +function buildXform( object, geometry, material ) { + + const name = 'Object_' + object.id; + const transform = buildMatrix( object.matrixWorld ); + + if ( object.matrixWorld.determinant() < 0 ) { + + console.warn( 'THREE.USDZExporter: USDZ does not support negative scales', object ); + + } + + return `def Xform "${ name }" ( + prepend references = @./geometries/Geometry_${ geometry.id }.usda@ + prepend apiSchemas = ["MaterialBindingAPI"] +) +{ + matrix4d xformOp:transform = ${ transform } + uniform token[] xformOpOrder = ["xformOp:transform"] + + rel material:binding = +} + +`; + +} + +function buildMatrix( matrix ) { + + const array = matrix.elements; + + return `( ${ buildMatrixRow( array, 0 ) }, ${ buildMatrixRow( array, 4 ) }, ${ buildMatrixRow( array, 8 ) }, ${ buildMatrixRow( array, 12 ) } )`; + +} + +function buildMatrixRow( array, offset ) { + + return `(${ array[ offset + 0 ] }, ${ array[ offset + 1 ] }, ${ array[ offset + 2 ] }, ${ array[ offset + 3 ] })`; + +} + +// Mesh + +function buildMeshObject( geometry ) { + + const mesh = buildMesh( geometry ); + return ` +def "Geometry" +{ +${mesh} +} +`; + +} + +function buildMesh( geometry ) { + + const name = 'Geometry'; + const attributes = geometry.attributes; + const count = attributes.position.count; + + return ` + def Mesh "${ name }" + { + int[] faceVertexCounts = [${ buildMeshVertexCount( geometry ) }] + int[] faceVertexIndices = [${ buildMeshVertexIndices( geometry ) }] + normal3f[] normals = [${ buildVector3Array( attributes.normal, count )}] ( + interpolation = "vertex" + ) + point3f[] points = [${ buildVector3Array( attributes.position, count )}] +${ buildPrimvars( attributes ) } + uniform token subdivisionScheme = "none" + } +`; + +} + +function buildMeshVertexCount( geometry ) { + + const count = geometry.index !== null ? geometry.index.count : geometry.attributes.position.count; + + return Array( count / 3 ).fill( 3 ).join( ', ' ); + +} + +function buildMeshVertexIndices( geometry ) { + + const index = geometry.index; + const array = []; + + if ( index !== null ) { + + for ( let i = 0; i < index.count; i ++ ) { + + array.push( index.getX( i ) ); + + } + + } else { + + const length = geometry.attributes.position.count; + + for ( let i = 0; i < length; i ++ ) { + + array.push( i ); + + } + + } + + return array.join( ', ' ); + +} + +function buildVector3Array( attribute, count ) { + + if ( attribute === undefined ) { + + console.warn( 'USDZExporter: Normals missing.' ); + return Array( count ).fill( '(0, 0, 0)' ).join( ', ' ); + + } + + const array = []; + + for ( let i = 0; i < attribute.count; i ++ ) { + + const x = attribute.getX( i ); + const y = attribute.getY( i ); + const z = attribute.getZ( i ); + + array.push( `(${ x.toPrecision( PRECISION ) }, ${ y.toPrecision( PRECISION ) }, ${ z.toPrecision( PRECISION ) })` ); + + } + + return array.join( ', ' ); + +} + +function buildVector2Array( attribute ) { + + const array = []; + + for ( let i = 0; i < attribute.count; i ++ ) { + + const x = attribute.getX( i ); + const y = attribute.getY( i ); + + array.push( `(${ x.toPrecision( PRECISION ) }, ${ 1 - y.toPrecision( PRECISION ) })` ); + + } + + return array.join( ', ' ); + +} + +function buildPrimvars( attributes ) { + + let string = ''; + + for ( let i = 0; i < 4; i ++ ) { + + const id = ( i > 0 ? i : '' ); + const attribute = attributes[ 'uv' + id ]; + + if ( attribute !== undefined ) { + + string += ` + texCoord2f[] primvars:st${ id } = [${ buildVector2Array( attribute )}] ( + interpolation = "vertex" + )`; + + } + + } + + // vertex colors + + const colorAttribute = attributes.color; + + if ( colorAttribute !== undefined ) { + + const count = colorAttribute.count; + + string += ` + color3f[] primvars:displayColor = [${buildVector3Array( colorAttribute, count )}] ( + interpolation = "vertex" + )`; + + } + + return string; + +} + +// Materials + +function buildMaterials( materials, textures, quickLookCompatible = false ) { + + const array = []; + + for ( const uuid in materials ) { + + const material = materials[ uuid ]; + + array.push( buildMaterial( material, textures, quickLookCompatible ) ); + + } + + return `def "Materials" +{ +${ array.join( '' ) } +} + +`; + +} + +function buildMaterial( material, textures, quickLookCompatible = false ) { + + // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html + + const pad = ' '; + const inputs = []; + const samplers = []; + + function buildTexture( texture, mapType, color ) { + + const id = texture.source.id + '_' + texture.flipY; + + textures[ id ] = texture; + + const uv = texture.channel > 0 ? 'st' + texture.channel : 'st'; + + const WRAPPINGS = { + 1000: 'repeat', // RepeatWrapping + 1001: 'clamp', // ClampToEdgeWrapping + 1002: 'mirror' // MirroredRepeatWrapping + }; + + const repeat = texture.repeat.clone(); + const offset = texture.offset.clone(); + const rotation = texture.rotation; + + // rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot + const xRotationOffset = Math.sin( rotation ); + const yRotationOffset = Math.cos( rotation ); + + // texture coordinates start in the opposite corner, need to correct + offset.y = 1 - offset.y - repeat.y; + + // turns out QuickLook is buggy and interprets texture repeat inverted/applies operations in a different order. + // Apple Feedback: FB10036297 and FB11442287 + if ( quickLookCompatible ) { + + // This is NOT correct yet in QuickLook, but comes close for a range of models. + // It becomes more incorrect the bigger the offset is + + offset.x = offset.x / repeat.x; + offset.y = offset.y / repeat.y; + + offset.x += xRotationOffset / repeat.x; + offset.y += yRotationOffset - 1; + + } else { + + // results match glTF results exactly. verified correct in usdview. + offset.x += xRotationOffset * repeat.x; + offset.y += ( 1 - yRotationOffset ) * repeat.y; + + } + + return ` + def Shader "PrimvarReader_${ mapType }" + { + uniform token info:id = "UsdPrimvarReader_float2" + float2 inputs:fallback = (0.0, 0.0) + token inputs:varname = "${ uv }" + float2 outputs:result + } + + def Shader "Transform2d_${ mapType }" + { + uniform token info:id = "UsdTransform2d" + token inputs:in.connect = + float inputs:rotation = ${ ( rotation * ( 180 / Math.PI ) ).toFixed( PRECISION ) } + float2 inputs:scale = ${ buildVector2( repeat ) } + float2 inputs:translation = ${ buildVector2( offset ) } + float2 outputs:result + } + + def Shader "Texture_${ texture.id }_${ mapType }" + { + uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/Texture_${ id }.png@ + float2 inputs:st.connect = + ${ color !== undefined ? 'float4 inputs:scale = ' + buildColor4( color ) : '' } + token inputs:sourceColorSpace = "${ texture.colorSpace === NoColorSpace ? 'raw' : 'sRGB' }" + token inputs:wrapS = "${ WRAPPINGS[ texture.wrapS ] }" + token inputs:wrapT = "${ WRAPPINGS[ texture.wrapT ] }" + float outputs:r + float outputs:g + float outputs:b + float3 outputs:rgb + ${ material.transparent || material.alphaTest > 0.0 ? 'float outputs:a' : '' } + }`; + + } + + + if ( material.side === DoubleSide ) { + + console.warn( 'THREE.USDZExporter: USDZ does not support double sided materials', material ); + + } + + if ( material.map !== null ) { + + inputs.push( `${ pad }color3f inputs:diffuseColor.connect = ` ); + + if ( material.transparent ) { + + inputs.push( `${ pad }float inputs:opacity.connect = ` ); + + } else if ( material.alphaTest > 0.0 ) { + + inputs.push( `${ pad }float inputs:opacity.connect = ` ); + inputs.push( `${ pad }float inputs:opacityThreshold = ${material.alphaTest}` ); + + } + + samplers.push( buildTexture( material.map, 'diffuse', material.color ) ); + + } else { + + inputs.push( `${ pad }color3f inputs:diffuseColor = ${ buildColor( material.color ) }` ); + + } + + if ( material.emissiveMap !== null ) { + + inputs.push( `${ pad }color3f inputs:emissiveColor.connect = ` ); + + samplers.push( buildTexture( material.emissiveMap, 'emissive', new Color( material.emissive.r * material.emissiveIntensity, material.emissive.g * material.emissiveIntensity, material.emissive.b * material.emissiveIntensity ) ) ); + + } else if ( material.emissive.getHex() > 0 ) { + + inputs.push( `${ pad }color3f inputs:emissiveColor = ${ buildColor( material.emissive ) }` ); + + } + + if ( material.normalMap !== null ) { + + inputs.push( `${ pad }normal3f inputs:normal.connect = ` ); + + samplers.push( buildTexture( material.normalMap, 'normal' ) ); + + } + + if ( material.aoMap !== null ) { + + inputs.push( `${ pad }float inputs:occlusion.connect = ` ); + + samplers.push( buildTexture( material.aoMap, 'occlusion', new Color( material.aoMapIntensity, material.aoMapIntensity, material.aoMapIntensity ) ) ); + + } + + if ( material.roughnessMap !== null ) { + + inputs.push( `${ pad }float inputs:roughness.connect = ` ); + + samplers.push( buildTexture( material.roughnessMap, 'roughness', new Color( material.roughness, material.roughness, material.roughness ) ) ); + + } else { + + inputs.push( `${ pad }float inputs:roughness = ${ material.roughness }` ); + + } + + if ( material.metalnessMap !== null ) { + + inputs.push( `${ pad }float inputs:metallic.connect = ` ); + + samplers.push( buildTexture( material.metalnessMap, 'metallic', new Color( material.metalness, material.metalness, material.metalness ) ) ); + + } else { + + inputs.push( `${ pad }float inputs:metallic = ${ material.metalness }` ); + + } + + if ( material.alphaMap !== null ) { + + inputs.push( `${pad}float inputs:opacity.connect = ` ); + inputs.push( `${pad}float inputs:opacityThreshold = 0.0001` ); + + samplers.push( buildTexture( material.alphaMap, 'opacity' ) ); + + } else { + + inputs.push( `${pad}float inputs:opacity = ${material.opacity}` ); + + } + + if ( material.isMeshPhysicalMaterial ) { + + if ( material.clearcoatMap !== null ) { + + inputs.push( `${pad}float inputs:clearcoat.connect = ` ); + samplers.push( buildTexture( material.clearcoatMap, 'clearcoat', new Color( material.clearcoat, material.clearcoat, material.clearcoat ) ) ); + + } else { + + inputs.push( `${pad}float inputs:clearcoat = ${material.clearcoat}` ); + + } + + if ( material.clearcoatRoughnessMap !== null ) { + + inputs.push( `${pad}float inputs:clearcoatRoughness.connect = ` ); + samplers.push( buildTexture( material.clearcoatRoughnessMap, 'clearcoatRoughness', new Color( material.clearcoatRoughness, material.clearcoatRoughness, material.clearcoatRoughness ) ) ); + + } else { + + inputs.push( `${pad}float inputs:clearcoatRoughness = ${material.clearcoatRoughness}` ); + + } + + inputs.push( `${ pad }float inputs:ior = ${ material.ior }` ); + + } + + return ` + def Material "Material_${ material.id }" + { + def Shader "PreviewSurface" + { + uniform token info:id = "UsdPreviewSurface" +${ inputs.join( '\n' ) } + int inputs:useSpecularWorkflow = 0 + token outputs:surface + } + + token outputs:surface.connect = + +${ samplers.join( '\n' ) } + + } +`; + +} + +function buildColor( color ) { + + return `(${ color.r }, ${ color.g }, ${ color.b })`; + +} + +function buildColor4( color ) { + + return `(${ color.r }, ${ color.g }, ${ color.b }, 1.0)`; + +} + +function buildVector2( vector ) { + + return `(${ vector.x }, ${ vector.y })`; + +} + + +function buildCamera( camera ) { + + const name = camera.name ? camera.name : 'Camera_' + camera.id; + + const transform = buildMatrix( camera.matrixWorld ); + + if ( camera.matrixWorld.determinant() < 0 ) { + + console.warn( 'THREE.USDZExporter: USDZ does not support negative scales', camera ); + + } + + if ( camera.isOrthographicCamera ) { + + return `def Camera "${name}" + { + matrix4d xformOp:transform = ${ transform } + uniform token[] xformOpOrder = ["xformOp:transform"] + + float2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) }) + float horizontalAperture = ${ ( ( Math.abs( camera.left ) + Math.abs( camera.right ) ) * 10 ).toPrecision( PRECISION ) } + float verticalAperture = ${ ( ( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) * 10 ).toPrecision( PRECISION ) } + token projection = "orthographic" + } + + `; + + } else { + + return `def Camera "${name}" + { + matrix4d xformOp:transform = ${ transform } + uniform token[] xformOpOrder = ["xformOp:transform"] + + float2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) }) + float focalLength = ${ camera.getFocalLength().toPrecision( PRECISION ) } + float focusDistance = ${ camera.focus.toPrecision( PRECISION ) } + float horizontalAperture = ${ camera.getFilmWidth().toPrecision( PRECISION ) } + token projection = "perspective" + float verticalAperture = ${ camera.getFilmHeight().toPrecision( PRECISION ) } + } + + `; + + } + +} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * For our purposes, an enumeration is a fixed set of CSS-expression-compatible + * names. When serialized, a selected subset of the members may be specified as + * whitespace-separated strings. An enumeration deserializer is a function that + * parses a serialized subset of an enumeration and returns any members that are + * found as a Set. + * + * The following example will produce a deserializer for the days of the + * week: + * + * const deserializeDaysOfTheWeek = enumerationDeserializer([ + * 'Monday', + * 'Tuesday', + * 'Wednesday', + * 'Thursday', + * 'Friday', + * 'Saturday', + * 'Sunday' + * ]); + */ +const enumerationDeserializer = (allowedNames) => (valueString) => { + try { + const expressions = parseExpressions(valueString); + const names = (expressions.length ? expressions[0].terms : []) + .filter((valueNode) => valueNode && valueNode.type === 'ident') + .map(valueNode => valueNode.value) + .filter(name => allowedNames.indexOf(name) > -1); + return new Set(names); + } + catch (_error) { + } + return new Set(); +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$2 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +let isWebXRBlocked = false; +let isSceneViewerBlocked = false; +const noArViewerSigil = '#model-viewer-no-ar-fallback'; +const deserializeARModes = enumerationDeserializer(['quick-look', 'scene-viewer', 'webxr', 'none']); +const DEFAULT_AR_MODES = 'webxr scene-viewer quick-look'; +const ARMode = { + QUICK_LOOK: 'quick-look', + SCENE_VIEWER: 'scene-viewer', + WEBXR: 'webxr', + NONE: 'none' +}; +const $arButtonContainer = Symbol('arButtonContainer'); +const $enterARWithWebXR = Symbol('enterARWithWebXR'); +const $openSceneViewer = Symbol('openSceneViewer'); +const $openIOSARQuickLook = Symbol('openIOSARQuickLook'); +const $canActivateAR = Symbol('canActivateAR'); +const $arMode = Symbol('arMode'); +const $arModes = Symbol('arModes'); +const $arAnchor = Symbol('arAnchor'); +const $preload = Symbol('preload'); +const $onARButtonContainerClick = Symbol('onARButtonContainerClick'); +const $onARStatus = Symbol('onARStatus'); +const $onARTracking = Symbol('onARTracking'); +const $onARTap = Symbol('onARTap'); +const $selectARMode = Symbol('selectARMode'); +const $triggerLoad = Symbol('triggerLoad'); +const ARMixin = (ModelViewerElement) => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; + class ARModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this.ar = false; + this.arScale = 'auto'; + this.arUsdzMaxTextureSize = 'auto'; + this.arPlacement = 'floor'; + this.arModes = DEFAULT_AR_MODES; + this.iosSrc = null; + this.xrEnvironment = false; + this[_a] = false; + // TODO: Add this to the shadow root as part of this mixin's + // implementation: + this[_b] = this.shadowRoot.querySelector('.ar-button'); + this[_c] = document.createElement('a'); + this[_d] = new Set(); + this[_e] = ARMode.NONE; + this[_f] = false; + this[_g] = (event) => { + event.preventDefault(); + this.activateAR(); + }; + this[_h] = ({ status }) => { + if (status === ARStatus.NOT_PRESENTING || + this[$renderer].arRenderer.presentedScene === this[$scene]) { + this.setAttribute('ar-status', status); + this.dispatchEvent(new CustomEvent('ar-status', { detail: { status } })); + if (status === ARStatus.NOT_PRESENTING) { + this.removeAttribute('ar-tracking'); + } + else if (status === ARStatus.SESSION_STARTED) { + this.setAttribute('ar-tracking', ARTracking.TRACKING); + } + } + }; + this[_j] = ({ status }) => { + this.setAttribute('ar-tracking', status); + this.dispatchEvent(new CustomEvent('ar-tracking', { detail: { status } })); + }; + this[_k] = (event) => { + if (event.data == '_apple_ar_quicklook_button_tapped') { + this.dispatchEvent(new CustomEvent('quick-look-button-tapped')); + } + }; + } + get canActivateAR() { + return this[$arMode] !== ARMode.NONE; + } + connectedCallback() { + super.connectedCallback(); + this[$renderer].arRenderer.addEventListener('status', this[$onARStatus]); + this.setAttribute('ar-status', ARStatus.NOT_PRESENTING); + this[$renderer].arRenderer.addEventListener('tracking', this[$onARTracking]); + this[$arAnchor].addEventListener('message', this[$onARTap]); + } + disconnectedCallback() { + super.disconnectedCallback(); + this[$renderer].arRenderer.removeEventListener('status', this[$onARStatus]); + this[$renderer].arRenderer.removeEventListener('tracking', this[$onARTracking]); + this[$arAnchor].removeEventListener('message', this[$onARTap]); + } + update(changedProperties) { + super.update(changedProperties); + if (changedProperties.has('arScale')) { + this[$scene].canScale = this.arScale !== 'fixed'; + } + if (changedProperties.has('arPlacement')) { + this[$scene].updateShadow(); + this[$needsRender](); + } + if (changedProperties.has('arModes')) { + this[$arModes] = deserializeARModes(this.arModes); + } + if (changedProperties.has('ar') || changedProperties.has('arModes') || + changedProperties.has('src') || changedProperties.has('iosSrc') || + changedProperties.has('arUsdzMaxTextureSize')) { + this[$selectARMode](); + } + } + /** + * Activates AR. Note that for any mode that is not WebXR-based, this + * method most likely has to be called synchronous from a user + * interaction handler. Otherwise, attempts to activate modes that + * require user interaction will most likely be ignored. + */ + async activateAR() { + switch (this[$arMode]) { + case ARMode.QUICK_LOOK: + await this[$openIOSARQuickLook](); + break; + case ARMode.WEBXR: + await this[$enterARWithWebXR](); + break; + case ARMode.SCENE_VIEWER: + this[$openSceneViewer](); + break; + default: + console.warn('No AR Mode can be activated. This is probably due to missing \ +configuration or device capabilities'); + break; + } + } + async [(_a = $canActivateAR, _b = $arButtonContainer, _c = $arAnchor, _d = $arModes, _e = $arMode, _f = $preload, _g = $onARButtonContainerClick, _h = $onARStatus, _j = $onARTracking, _k = $onARTap, $selectARMode)]() { + var _l; + let arMode = ARMode.NONE; + if (this.ar) { + if (this.src != null) { + for (const value of this[$arModes]) { + if (value === 'webxr' && IS_WEBXR_AR_CANDIDATE && !isWebXRBlocked && + await this[$renderer].arRenderer.supportsPresentation()) { + arMode = ARMode.WEBXR; + break; + } + if (value === 'scene-viewer' && !isSceneViewerBlocked && + (IS_SCENEVIEWER_CANDIDATE || + (navigator.userAgentData && + navigator.userAgentData.getHighEntropyValues && + ((_l = (await navigator.userAgentData.getHighEntropyValues([ + 'formFactor' + ])).formFactor) === null || _l === void 0 ? void 0 : _l.includes('XR'))))) { + arMode = ARMode.SCENE_VIEWER; + break; + } + if (value === 'quick-look' && IS_AR_QUICKLOOK_CANDIDATE) { + arMode = ARMode.QUICK_LOOK; + break; + } + } + } + // The presence of ios-src overrides the absence of quick-look + // ar-mode. + if (arMode === ARMode.NONE && this.iosSrc != null && + IS_AR_QUICKLOOK_CANDIDATE) { + arMode = ARMode.QUICK_LOOK; + } + } + if (arMode !== ARMode.NONE) { + this[$arButtonContainer].classList.add('enabled'); + this[$arButtonContainer].addEventListener('click', this[$onARButtonContainerClick]); + } + else if (this[$arButtonContainer].classList.contains('enabled')) { + this[$arButtonContainer].removeEventListener('click', this[$onARButtonContainerClick]); + this[$arButtonContainer].classList.remove('enabled'); + // If AR went from working to not, notify the element. + const status = ARStatus.FAILED; + this.setAttribute('ar-status', status); + this.dispatchEvent(new CustomEvent('ar-status', { detail: { status } })); + } + this[$arMode] = arMode; + } + async [$enterARWithWebXR]() { + console.log('Attempting to present in AR with WebXR...'); + await this[$triggerLoad](); + try { + this[$arButtonContainer].removeEventListener('click', this[$onARButtonContainerClick]); + const { arRenderer } = this[$renderer]; + if (this.arPlacement === 'wall') { + arRenderer.placementMode = 'wall'; + } + else if (this.arPlacement === 'ceiling') { + arRenderer.placementMode = 'ceiling'; + } + else { + arRenderer.placementMode = 'floor'; + } + await arRenderer.present(this[$scene], this.xrEnvironment); + } + catch (error) { + console.warn('Error while trying to present in AR with WebXR'); + console.error(error); + await this[$renderer].arRenderer.stopPresenting(); + isWebXRBlocked = true; + console.warn('Falling back to next ar-mode'); + await this[$selectARMode](); + this.activateAR(); + } + finally { + this[$selectARMode](); + } + } + async [$triggerLoad]() { + if (!this.loaded) { + this[$preload] = true; + this[$updateSource](); + await waitForEvent(this, 'load'); + this[$preload] = false; + } + } + [$shouldAttemptPreload]() { + return super[$shouldAttemptPreload]() || this[$preload]; + } + /** + * Takes a URL and a title string, and attempts to launch Scene Viewer on + * the current device. + */ + [$openSceneViewer]() { + const location = self.location.toString(); + const locationUrl = new URL(location); + const modelUrl = new URL(this.src, location); + if (modelUrl.hash) + modelUrl.hash = ''; + const params = new URLSearchParams(modelUrl.search); + locationUrl.hash = noArViewerSigil; + // modelUrl can contain title/link/sound etc. + params.set('mode', 'ar_preferred'); + if (!params.has('disable_occlusion')) { + params.set('disable_occlusion', 'true'); + } + if (this.arScale === 'fixed') { + params.set('resizable', 'false'); + } + if (this.arPlacement === 'wall') { + params.set('enable_vertical_placement', 'true'); + } + if (params.has('sound')) { + const soundUrl = new URL(params.get('sound'), location); + params.set('sound', soundUrl.toString()); + } + if (params.has('link')) { + const linkUrl = new URL(params.get('link'), location); + params.set('link', linkUrl.toString()); + } + const intent = `intent://arvr.google.com/scene-viewer/1.2?${params.toString() + '&file=' + + encodeURIComponent(modelUrl + .toString())}#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=${encodeURIComponent(locationUrl.toString())};end;`; + const undoHashChange = () => { + if (self.location.hash === noArViewerSigil) { + isSceneViewerBlocked = true; + // The new history will be the current URL with a new hash. + // Go back one step so that we reset to the expected URL. + // NOTE(cdata): this should not invoke any browser-level navigation + // because hash-only changes modify the URL in-place without + // navigating: + self.history.back(); + console.warn('Error while trying to present in AR with Scene Viewer'); + console.warn('Falling back to next ar-mode'); + this[$selectARMode](); + // Would be nice to activateAR() here, but webXR fails due to not + // seeing a user activation. + } + }; + self.addEventListener('hashchange', undoHashChange, { once: true }); + this[$arAnchor].setAttribute('href', intent); + console.log('Attempting to present in AR with Scene Viewer...'); + this[$arAnchor].click(); + } + /** + * Takes a URL to a USDZ file and sets the appropriate fields so that + * Safari iOS can intent to their AR Quick Look. + */ + async [$openIOSARQuickLook]() { + const generateUsdz = !this.iosSrc; + this[$arButtonContainer].classList.remove('enabled'); + const objectURL = generateUsdz ? await this.prepareUSDZ() : this.iosSrc; + const modelUrl = new URL(objectURL, self.location.toString()); + if (generateUsdz) { + const location = self.location.toString(); + const locationUrl = new URL(location); + const srcUrl = new URL(this.src, locationUrl); + if (srcUrl.hash) { + modelUrl.hash = srcUrl.hash; + } + } + if (this.arScale === 'fixed') { + if (modelUrl.hash) { + modelUrl.hash += '&'; + } + modelUrl.hash += 'allowsContentScaling=0'; + } + const anchor = this[$arAnchor]; + anchor.setAttribute('rel', 'ar'); + const img = document.createElement('img'); + anchor.appendChild(img); + anchor.setAttribute('href', modelUrl.toString()); + if (generateUsdz) { + anchor.setAttribute('download', 'model.usdz'); + } + // attach anchor to shadow DOM to ensure iOS16 ARQL banner click message + // event propagation + anchor.style.display = 'none'; + if (!anchor.isConnected) + this.shadowRoot.appendChild(anchor); + console.log('Attempting to present in AR with Quick Look...'); + anchor.click(); + anchor.removeChild(img); + if (generateUsdz) { + URL.revokeObjectURL(objectURL); + } + this[$arButtonContainer].classList.add('enabled'); + } + async prepareUSDZ() { + const updateSourceProgress = this[$progressTracker].beginActivity('usdz-conversion'); + await this[$triggerLoad](); + const { model, shadow, target } = this[$scene]; + if (model == null) { + return ''; + } + let visible = false; + // Remove shadow from export + if (shadow != null) { + visible = shadow.visible; + shadow.visible = false; + } + updateSourceProgress(0.2); + const exporter = new USDZExporter(); + target.remove(model); + model.position.copy(target.position); + model.updateWorldMatrix(false, true); + const arraybuffer = await exporter.parseAsync(model, { + maxTextureSize: isNaN(this.arUsdzMaxTextureSize) ? + Infinity : + Math.max(parseInt(this.arUsdzMaxTextureSize), 16), + }); + model.position.set(0, 0, 0); + target.add(model); + const blob = new Blob([arraybuffer], { + type: 'model/vnd.usdz+zip', + }); + const url = URL.createObjectURL(blob); + updateSourceProgress(1); + if (shadow != null) { + shadow.visible = visible; + } + return url; + } + } + __decorate$2([ + property({ type: Boolean, attribute: 'ar' }) + ], ARModelViewerElement.prototype, "ar", void 0); + __decorate$2([ + property({ type: String, attribute: 'ar-scale' }) + ], ARModelViewerElement.prototype, "arScale", void 0); + __decorate$2([ + property({ type: String, attribute: 'ar-usdz-max-texture-size' }) + ], ARModelViewerElement.prototype, "arUsdzMaxTextureSize", void 0); + __decorate$2([ + property({ type: String, attribute: 'ar-placement' }) + ], ARModelViewerElement.prototype, "arPlacement", void 0); + __decorate$2([ + property({ type: String, attribute: 'ar-modes' }) + ], ARModelViewerElement.prototype, "arModes", void 0); + __decorate$2([ + property({ type: String, attribute: 'ios-src' }) + ], ARModelViewerElement.prototype, "iosSrc", void 0); + __decorate$2([ + property({ type: Boolean, attribute: 'xr-environment' }) + ], ARModelViewerElement.prototype, "xrEnvironment", void 0); + return ARModelViewerElement; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$1 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +const PROGRESS_BAR_UPDATE_THRESHOLD = 100; +const DEFAULT_DRACO_DECODER_LOCATION = 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/'; +const DEFAULT_KTX2_TRANSCODER_LOCATION = 'https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/'; +const DEFAULT_LOTTIE_LOADER_LOCATION = 'https://cdn.jsdelivr.net/npm/three@0.149.0/examples/jsm/loaders/LottieLoader.js'; +const RevealStrategy = { + AUTO: 'auto'}; +const LoadingStrategy = { + AUTO: 'auto', + EAGER: 'eager' +}; +const $defaultProgressBarElement = Symbol('defaultProgressBarElement'); +const $posterContainerElement = Symbol('posterContainerElement'); +const $defaultPosterElement = Symbol('defaultPosterElement'); +const $shouldDismissPoster = Symbol('shouldDismissPoster'); +const $hidePoster = Symbol('hidePoster'); +const $modelIsRevealed = Symbol('modelIsRevealed'); +const $updateProgressBar = Symbol('updateProgressBar'); +const $ariaLabelCallToAction = Symbol('ariaLabelCallToAction'); +const $onProgress = Symbol('onProgress'); +/** + * LoadingMixin implements features related to lazy loading, as well as + * presentation details related to the pre-load / pre-render presentation of a + * + * + * This mixin implements support for models with DRACO-compressed meshes. + * The DRACO decoder will be loaded on-demand if a glTF that uses the DRACO mesh + * compression extension is encountered. + * + * By default, the DRACO decoder will be loaded from a Google CDN. It is + * possible to customize where the decoder is loaded from by defining a global + * configuration option for `` like so: + * + * ```html + * + * ``` + * + * Note that the above configuration strategy must be performed *before* the + * first `` element is created in the browser. The configuration + * can be done anywhere, but the easiest way to ensure it is done at the right + * time is to do it in the `` of the HTML document. This is the + * recommended way to set the location because it is most compatible with + * scenarios where the `` library is lazily loaded. + * + * If you absolutely have to set the DRACO decoder location *after* the first + * `` element is created, you can do it this way: + * + * ```html + * + * ``` + * + * Note that the above configuration approach will not work until *after* + * `` is defined in the browser. Also note that this configuration + * *must* be set *before* the first DRACO model is fully loaded. + * + * It is recommended that users who intend to take advantage of DRACO mesh + * compression consider whether or not it is acceptable for their use case to + * have code side-loaded from a Google CDN. If it is not acceptable, then the + * location must be customized before loading any DRACO models in order to cause + * the decoder to be loaded from an alternative, acceptable location. + */ +const LoadingMixin = (ModelViewerElement) => { + var _a, _b, _c, _d, _e, _f, _g, _h; + class LoadingModelViewerElement extends ModelViewerElement { + static set dracoDecoderLocation(value) { + CachingGLTFLoader.setDRACODecoderLocation(value); + } + static get dracoDecoderLocation() { + return CachingGLTFLoader.getDRACODecoderLocation(); + } + static set ktx2TranscoderLocation(value) { + CachingGLTFLoader.setKTX2TranscoderLocation(value); + } + static get ktx2TranscoderLocation() { + return CachingGLTFLoader.getKTX2TranscoderLocation(); + } + static set meshoptDecoderLocation(value) { + CachingGLTFLoader.setMeshoptDecoderLocation(value); + } + static get meshoptDecoderLocation() { + return CachingGLTFLoader.getMeshoptDecoderLocation(); + } + static set lottieLoaderLocation(value) { + Renderer.singleton.textureUtils.lottieLoaderUrl = value; + } + static get lottieLoaderLocation() { + return Renderer.singleton.textureUtils.lottieLoaderUrl; + } + /** + * If provided, the callback will be passed each resource URL before a + * request is sent. The callback may return the original URL, or a new URL + * to override loading behavior. This behavior can be used to load assets + * from .ZIP files, drag-and-drop APIs, and Data URIs. + */ + static mapURLs(callback) { + Renderer.singleton.loader[$loader].manager.setURLModifier(callback); + } + /** + * Dismisses the poster, causing the model to load and render if + * necessary. This is currently effectively the same as interacting with + * the poster via user input. + */ + dismissPoster() { + if (this.loaded) { + this[$hidePoster](); + } + else { + this[$shouldDismissPoster] = true; + this[$updateSource](); + } + } + /** + * Displays the poster, hiding the 3D model. If this is called after the 3D + * model has been revealed, then it must be dismissed by a call to + * dismissPoster(). + */ + showPoster() { + const posterContainerElement = this[$posterContainerElement]; + if (posterContainerElement.classList.contains('show')) { + return; + } + posterContainerElement.classList.add('show'); + this[$userInputElement].classList.remove('show'); + const defaultPosterElement = this[$defaultPosterElement]; + defaultPosterElement.removeAttribute('tabindex'); + defaultPosterElement.removeAttribute('aria-hidden'); + const oldVisibility = this.modelIsVisible; + this[$modelIsRevealed] = false; + this[$announceModelVisibility](oldVisibility); + } + /** + * Returns the model's bounding box dimensions in meters, independent of + * turntable rotation. + */ + getDimensions() { + return toVector3D(this[$scene].size); + } + getBoundingBoxCenter() { + return toVector3D(this[$scene].boundingBox.getCenter(new Vector3())); + } + constructor(...args) { + super(...args); + /** + * A URL pointing to the image to use as a poster in scenarios where the + * is not ready to reveal a rendered model to the viewer. + */ + this.poster = null; + /** + * An enumerable attribute describing under what conditions the + * should reveal a model to the viewer. + * + * The default value is "auto". The only supported alternative values is + * "manual". + */ + this.reveal = RevealStrategy.AUTO; + /** + * An enumerable attribute describing under what conditions the + * should preload a model. + * + * The default value is "auto". The only supported alternative values are + * "lazy" and "eager". Auto is equivalent to lazy, which loads the model + * when it is near the viewport for reveal = "auto", and when interacted + * with for reveal = "interaction". Eager loads the model immediately. + */ + this.loading = LoadingStrategy.AUTO; + this[_a] = false; + this[_b] = false; + // TODO: Add this to the shadow root as part of this mixin's + // implementation: + this[_c] = this.shadowRoot.querySelector('.slot.poster'); + this[_d] = this.shadowRoot.querySelector('#default-poster'); + this[_e] = this.shadowRoot.querySelector('#default-progress-bar > .bar'); + this[_f] = this[$defaultPosterElement].getAttribute('aria-label'); + this[_g] = throttle((progress) => { + const parentNode = this[$defaultProgressBarElement].parentNode; + requestAnimationFrame(() => { + this[$defaultProgressBarElement].style.transform = + `scaleX(${progress})`; + if (progress === 0) { + // NOTE(cdata): We remove and re-append the progress bar in this + // condition so that the progress bar does not appear to + // transition backwards from the right when we reset to 0 (or + // otherwise <1) progress after having already reached 1 progress + // previously. + parentNode.removeChild(this[$defaultProgressBarElement]); + parentNode.appendChild(this[$defaultProgressBarElement]); + } + this[$defaultProgressBarElement].classList.toggle('hide', progress === 1.0); + }); + }, PROGRESS_BAR_UPDATE_THRESHOLD); + this[_h] = (event) => { + const progress = event.detail.totalProgress; + const reason = event.detail.reason; + if (progress === 1.0) { + this[$updateProgressBar].flush(); + if (this.loaded && + (this[$shouldDismissPoster] || + this.reveal === RevealStrategy.AUTO)) { + this[$hidePoster](); + } + } + this[$updateProgressBar](progress); + this.dispatchEvent(new CustomEvent('progress', { detail: { totalProgress: progress, reason } })); + }; + const ModelViewerElement = self.ModelViewerElement || {}; + const dracoDecoderLocation = ModelViewerElement.dracoDecoderLocation || + DEFAULT_DRACO_DECODER_LOCATION; + CachingGLTFLoader.setDRACODecoderLocation(dracoDecoderLocation); + const ktx2TranscoderLocation = ModelViewerElement.ktx2TranscoderLocation || + DEFAULT_KTX2_TRANSCODER_LOCATION; + CachingGLTFLoader.setKTX2TranscoderLocation(ktx2TranscoderLocation); + if (ModelViewerElement.meshoptDecoderLocation) { + CachingGLTFLoader.setMeshoptDecoderLocation(ModelViewerElement.meshoptDecoderLocation); + } + const lottieLoaderLocation = ModelViewerElement.lottieLoaderLocation || + DEFAULT_LOTTIE_LOADER_LOCATION; + Renderer.singleton.textureUtils.lottieLoaderUrl = lottieLoaderLocation; + } + connectedCallback() { + super.connectedCallback(); + if (!this.loaded) { + this.showPoster(); + } + this[$progressTracker].addEventListener('progress', this[$onProgress]); + } + disconnectedCallback() { + super.disconnectedCallback(); + this[$progressTracker].removeEventListener('progress', this[$onProgress]); + } + async updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('poster') && this.poster != null) { + this[$defaultPosterElement].style.backgroundImage = + `url(${this.poster})`; + } + if (changedProperties.has('alt')) { + this[$defaultPosterElement].setAttribute('aria-label', this[$altDefaulted]); + } + if (changedProperties.has('reveal') || changedProperties.has('loading')) { + this[$updateSource](); + } + } + [(_a = $modelIsRevealed, _b = $shouldDismissPoster, _c = $posterContainerElement, _d = $defaultPosterElement, _e = $defaultProgressBarElement, _f = $ariaLabelCallToAction, _g = $updateProgressBar, _h = $onProgress, $shouldAttemptPreload)]() { + return !!this.src && + (this[$shouldDismissPoster] || + this.loading === LoadingStrategy.EAGER || + (this.reveal === RevealStrategy.AUTO && this[$isElementInViewport])); + } + [$hidePoster]() { + this[$shouldDismissPoster] = false; + const posterContainerElement = this[$posterContainerElement]; + if (!posterContainerElement.classList.contains('show')) { + return; + } + posterContainerElement.classList.remove('show'); + this[$userInputElement].classList.add('show'); + const oldVisibility = this.modelIsVisible; + this[$modelIsRevealed] = true; + this[$announceModelVisibility](oldVisibility); + const root = this.getRootNode(); + // If the is still focused, forward the focus to + // the canvas that has just been revealed + if (root && root.activeElement === this) { + this[$userInputElement].focus(); + } + // Ensure that the poster is no longer focusable or visible to + // screen readers + const defaultPosterElement = this[$defaultPosterElement]; + defaultPosterElement.setAttribute('aria-hidden', 'true'); + defaultPosterElement.tabIndex = -1; + this.dispatchEvent(new CustomEvent('poster-dismissed')); + } + [$getModelIsVisible]() { + return super[$getModelIsVisible]() && this[$modelIsRevealed]; + } + } + __decorate$1([ + property({ type: String }) + ], LoadingModelViewerElement.prototype, "poster", void 0); + __decorate$1([ + property({ type: String }) + ], LoadingModelViewerElement.prototype, "reveal", void 0); + __decorate$1([ + property({ type: String }) + ], LoadingModelViewerElement.prototype, "loading", void 0); + return LoadingModelViewerElement; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +// How much the model will rotate per +// second in radians: +const DEFAULT_ROTATION_SPEED = Math.PI / 32; +const AUTO_ROTATE_DELAY_DEFAULT = 3000; +const rotationRateIntrinsics = { + basis: [degreesToRadians(numberNode(DEFAULT_ROTATION_SPEED, 'rad'))], + keywords: { auto: [null] } +}; +const $autoRotateStartTime = Symbol('autoRotateStartTime'); +const $radiansPerSecond = Symbol('radiansPerSecond'); +const $syncRotationRate = Symbol('syncRotationRate'); +const $onCameraChange = Symbol('onCameraChange'); +const StagingMixin = (ModelViewerElement) => { + var _a, _b, _c; + class StagingModelViewerElement extends ModelViewerElement { + constructor() { + super(...arguments); + this.autoRotate = false; + this.autoRotateDelay = AUTO_ROTATE_DELAY_DEFAULT; + this.rotationPerSecond = 'auto'; + this[_a] = performance.now(); + this[_b] = 0; + this[_c] = (event) => { + if (!this.autoRotate) { + return; + } + if (event.detail.source === 'user-interaction') { + this[$autoRotateStartTime] = performance.now(); + } + }; + } + connectedCallback() { + super.connectedCallback(); + this.addEventListener('camera-change', this[$onCameraChange]); + this[$autoRotateStartTime] = performance.now(); + } + disconnectedCallback() { + super.disconnectedCallback(); + this.removeEventListener('camera-change', this[$onCameraChange]); + this[$autoRotateStartTime] = performance.now(); + } + updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('autoRotate')) { + this[$autoRotateStartTime] = performance.now(); + } + } + [(_a = $autoRotateStartTime, _b = $radiansPerSecond, $syncRotationRate)](style) { + this[$radiansPerSecond] = style[0]; + } + [$tick](time, delta) { + super[$tick](time, delta); + if (!this.autoRotate || !this[$getModelIsVisible]() || + this[$renderer].isPresenting) { + return; + } + const rotationDelta = Math.min(delta, time - this[$autoRotateStartTime] - this.autoRotateDelay); + if (rotationDelta > 0) { + this[$scene].yaw = this.turntableRotation + + this[$radiansPerSecond] * rotationDelta * 0.001; + } + } + get turntableRotation() { + return this[$scene].yaw; + } + resetTurntableRotation(theta = 0) { + this[$scene].yaw = theta; + } + } + _c = $onCameraChange; + __decorate([ + property({ type: Boolean, attribute: 'auto-rotate' }) + ], StagingModelViewerElement.prototype, "autoRotate", void 0); + __decorate([ + property({ type: Number, attribute: 'auto-rotate-delay' }) + ], StagingModelViewerElement.prototype, "autoRotateDelay", void 0); + __decorate([ + style({ intrinsics: rotationRateIntrinsics, updateHandler: $syncRotationRate }), + property({ type: String, attribute: 'rotation-per-second' }) + ], StagingModelViewerElement.prototype, "rotationPerSecond", void 0); + return StagingModelViewerElement; +}; + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const ModelViewerElement = AnnotationMixin(SceneGraphMixin(StagingMixin(EnvironmentMixin(ControlsMixin(ARMixin(LoadingMixin(AnimationMixin(ModelViewerElementBase)))))))); +customElements.define('model-viewer', ModelViewerElement); + +export { CanvasTexture, FileLoader, Loader, ModelViewerElement, NearestFilter }; +//# sourceMappingURL=model-viewer.js.map diff --git a/packages/model-viewer/dist/model-viewer.js.map b/packages/model-viewer/dist/model-viewer.js.map new file mode 100644 index 0000000..32294d2 --- /dev/null +++ b/packages/model-viewer/dist/model-viewer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"model-viewer.js","sources":["../../../node_modules/@lit/reactive-element/development/css-tag.js","../../../node_modules/@lit/reactive-element/development/reactive-element.js","../../../node_modules/@lit/reactive-element/development/decorators/property.js","../../../node_modules/@lit/reactive-element/development/decorators/query.js","../../../node_modules/three/build/three.core.js","../../../node_modules/three/build/three.module.js","../../../node_modules/lit-html/development/lit-html.js","../../../node_modules/lit-element/development/lit-element.js","../lib/constants.js","../lib/utilities.js","../lib/features/environment.js","../lib/assets/close-material-svg.js","../lib/assets/controls-svg.js","../lib/assets/view-in-ar-material-svg.js","../lib/template.js","../../../node_modules/three/examples/jsm/libs/meshopt_decoder.module.js","../../../node_modules/three/examples/jsm/loaders/DRACOLoader.js","../../../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../../../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../../../node_modules/three/examples/jsm/utils/WorkerPool.js","../../../node_modules/three/examples/jsm/libs/ktx-parse.module.js","../../../node_modules/three/examples/jsm/libs/zstddec.module.js","../../../node_modules/three/examples/jsm/math/ColorSpaces.js","../../../node_modules/three/examples/jsm/loaders/KTX2Loader.js","../lib/utilities/cache-eviction-policy.js","../lib/three-components/gltf-instance/VariantMaterialLoaderPlugin.js","../lib/three-components/CachingGLTFLoader.js","../../../node_modules/three/examples/jsm/renderers/CSS2DRenderer.js","../../../node_modules/three/examples/jsm/utils/SceneUtils.js","../../../node_modules/three/examples/jsm/exporters/GLTFExporter.js","../lib/three-components/gltf-instance/VariantMaterialExporterPlugin.js","../../../node_modules/three/examples/jsm/webxr/XREstimatedLight.js","../lib/three-components/Damper.js","../lib/three-components/PlacementBox.js","../lib/styles/parsers.js","../lib/styles/conversions.js","../lib/styles/evaluators.js","../lib/styles/style-effector.js","../lib/decorators.js","../lib/utilities/animation.js","../lib/features/controls.js","../lib/three-components/SmoothControls.js","../lib/three-components/XRMenuPanel.js","../lib/three-components/ARRenderer.js","../../../node_modules/three/examples/jsm/utils/SkeletonUtils.js","../lib/three-components/GLTFInstance.js","../lib/three-components/gltf-instance/correlated-scene-graph.js","../lib/three-components/gltf-instance/ModelViewerGLTFInstance.js","../../../node_modules/@monogrid/gainmap-js/dist/QuadRenderer-DuOPRGA4.js","../../../node_modules/@monogrid/gainmap-js/dist/decode.js","../../../node_modules/three/examples/jsm/loaders/RGBELoader.js","../lib/three-components/EnvironmentScene.js","../lib/three-components/TextureUtils.js","../lib/three-components/Renderer.js","../lib/features/scene-graph/three-dom-element.js","../lib/features/scene-graph/image.js","../lib/three-components/gltf-instance/gltf-2.0.js","../lib/features/scene-graph/sampler.js","../lib/features/scene-graph/texture.js","../lib/features/scene-graph/texture-info.js","../lib/features/scene-graph/pbr-metallic-roughness.js","../lib/features/scene-graph/material.js","../lib/features/scene-graph/nodes/primitive-node.js","../lib/features/scene-graph/model.js","../lib/features/scene-graph.js","../lib/three-components/GroundedSkybox.js","../lib/three-components/Hotspot.js","../../../node_modules/three/examples/jsm/shaders/HorizontalBlurShader.js","../../../node_modules/three/examples/jsm/shaders/VerticalBlurShader.js","../../../node_modules/three/src/math/MathUtils.js","../lib/three-components/Shadow.js","../lib/three-components/ModelScene.js","../lib/utilities/progress-tracker.js","../lib/model-viewer-base.js","../lib/features/animation.js","../lib/features/annotation.js","../../../node_modules/three/examples/jsm/libs/fflate.module.js","../../../node_modules/three/examples/jsm/exporters/USDZExporter.js","../lib/styles/deserializers.js","../lib/features/ar.js","../lib/features/loading.js","../lib/features/staging.js","../lib/model-viewer.js"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst NODE_MODE = false;\n// Allows minifiers to rename references to globalThis\nconst global = globalThis;\n/**\n * Whether the current browser supports `adoptedStyleSheets`.\n */\nexport const supportsAdoptingStyleSheets = global.ShadowRoot &&\n (global.ShadyCSS === undefined || global.ShadyCSS.nativeShadow) &&\n 'adoptedStyleSheets' in Document.prototype &&\n 'replace' in CSSStyleSheet.prototype;\nconst constructionToken = Symbol();\nconst cssTagCache = new WeakMap();\n/**\n * A container for a string of CSS text, that may be used to create a CSSStyleSheet.\n *\n * CSSResult is the return value of `css`-tagged template literals and\n * `unsafeCSS()`. In order to ensure that CSSResults are only created via the\n * `css` tag and `unsafeCSS()`, CSSResult cannot be constructed directly.\n */\nexport class CSSResult {\n constructor(cssText, strings, safeToken) {\n // This property needs to remain unminified.\n this['_$cssResult$'] = true;\n if (safeToken !== constructionToken) {\n throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');\n }\n this.cssText = cssText;\n this._strings = strings;\n }\n // This is a getter so that it's lazy. In practice, this means stylesheets\n // are not created until the first element instance is made.\n get styleSheet() {\n // If `supportsAdoptingStyleSheets` is true then we assume CSSStyleSheet is\n // constructable.\n let styleSheet = this._styleSheet;\n const strings = this._strings;\n if (supportsAdoptingStyleSheets && styleSheet === undefined) {\n const cacheable = strings !== undefined && strings.length === 1;\n if (cacheable) {\n styleSheet = cssTagCache.get(strings);\n }\n if (styleSheet === undefined) {\n (this._styleSheet = styleSheet = new CSSStyleSheet()).replaceSync(this.cssText);\n if (cacheable) {\n cssTagCache.set(strings, styleSheet);\n }\n }\n }\n return styleSheet;\n }\n toString() {\n return this.cssText;\n }\n}\nconst textFromCSSResult = (value) => {\n // This property needs to remain unminified.\n if (value['_$cssResult$'] === true) {\n return value.cssText;\n }\n else if (typeof value === 'number') {\n return value;\n }\n else {\n throw new Error(`Value passed to 'css' function must be a 'css' function result: ` +\n `${value}. Use 'unsafeCSS' to pass non-literal values, but take care ` +\n `to ensure page security.`);\n }\n};\n/**\n * Wrap a value for interpolation in a {@linkcode css} tagged template literal.\n *\n * This is unsafe because untrusted CSS text can be used to phone home\n * or exfiltrate data to an attacker controlled site. Take care to only use\n * this with trusted input.\n */\nexport const unsafeCSS = (value) => new CSSResult(typeof value === 'string' ? value : String(value), undefined, constructionToken);\n/**\n * A template literal tag which can be used with LitElement's\n * {@linkcode LitElement.styles} property to set element styles.\n *\n * For security reasons, only literal string values and number may be used in\n * embedded expressions. To incorporate non-literal values {@linkcode unsafeCSS}\n * may be used inside an expression.\n */\nexport const css = (strings, ...values) => {\n const cssText = strings.length === 1\n ? strings[0]\n : values.reduce((acc, v, idx) => acc + textFromCSSResult(v) + strings[idx + 1], strings[0]);\n return new CSSResult(cssText, strings, constructionToken);\n};\n/**\n * Applies the given styles to a `shadowRoot`. When Shadow DOM is\n * available but `adoptedStyleSheets` is not, styles are appended to the\n * `shadowRoot` to [mimic spec behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets).\n * Note, when shimming is used, any styles that are subsequently placed into\n * the shadowRoot should be placed *before* any shimmed adopted styles. This\n * will match spec behavior that gives adopted sheets precedence over styles in\n * shadowRoot.\n */\nexport const adoptStyles = (renderRoot, styles) => {\n if (supportsAdoptingStyleSheets) {\n renderRoot.adoptedStyleSheets = styles.map((s) => s instanceof CSSStyleSheet ? s : s.styleSheet);\n }\n else {\n for (const s of styles) {\n const style = document.createElement('style');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nonce = global['litNonce'];\n if (nonce !== undefined) {\n style.setAttribute('nonce', nonce);\n }\n style.textContent = s.cssText;\n renderRoot.appendChild(style);\n }\n }\n};\nconst cssResultFromStyleSheet = (sheet) => {\n let cssText = '';\n for (const rule of sheet.cssRules) {\n cssText += rule.cssText;\n }\n return unsafeCSS(cssText);\n};\nexport const getCompatibleStyle = supportsAdoptingStyleSheets ||\n (NODE_MODE && global.CSSStyleSheet === undefined)\n ? (s) => s\n : (s) => s instanceof CSSStyleSheet ? cssResultFromStyleSheet(s) : s;\n//# sourceMappingURL=css-tag.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/**\n * Use this module if you want to create your own base class extending\n * {@link ReactiveElement}.\n * @packageDocumentation\n */\nimport { getCompatibleStyle, adoptStyles, } from './css-tag.js';\n// In the Node build, this import will be injected by Rollup:\n// import {HTMLElement, customElements} from '@lit-labs/ssr-dom-shim';\nexport * from './css-tag.js';\n// TODO (justinfagnani): Add `hasOwn` here when we ship ES2022\nconst { is, defineProperty, getOwnPropertyDescriptor, getOwnPropertyNames, getOwnPropertySymbols, getPrototypeOf, } = Object;\nconst NODE_MODE = false;\n// Lets a minifier replace globalThis references with a minified name\nconst global = globalThis;\nif (NODE_MODE) {\n global.customElements ??= customElements;\n}\nconst DEV_MODE = true;\nlet issueWarning;\nconst trustedTypes = global\n .trustedTypes;\n// Temporary workaround for https://crbug.com/993268\n// Currently, any attribute starting with \"on\" is considered to be a\n// TrustedScript source. Such boolean attributes must be set to the equivalent\n// trusted emptyScript value.\nconst emptyStringForBooleanAttribute = trustedTypes\n ? trustedTypes.emptyScript\n : '';\nconst polyfillSupport = DEV_MODE\n ? global.reactiveElementPolyfillSupportDevMode\n : global.reactiveElementPolyfillSupport;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n const issuedWarnings = (global.litIssuedWarnings ??=\n new Set());\n // Issue a warning, if we haven't already.\n issueWarning = (code, warning) => {\n warning += ` See https://lit.dev/msg/${code} for more information.`;\n if (!issuedWarnings.has(warning)) {\n console.warn(warning);\n issuedWarnings.add(warning);\n }\n };\n issueWarning('dev-mode', `Lit is in dev mode. Not recommended for production!`);\n // Issue polyfill support warning.\n if (global.ShadyDOM?.inUse && polyfillSupport === undefined) {\n issueWarning('polyfill-support-missing', `Shadow DOM is being polyfilled via \\`ShadyDOM\\` but ` +\n `the \\`polyfill-support\\` module has not been loaded.`);\n }\n}\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n ? (event) => {\n const shouldEmit = global\n .emitLitDebugLogEvents;\n if (!shouldEmit) {\n return;\n }\n global.dispatchEvent(new CustomEvent('lit-debug', {\n detail: event,\n }));\n }\n : undefined;\n/*\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\n/*@__INLINE__*/\nconst JSCompiler_renameProperty = (prop, _obj) => prop;\nexport const defaultConverter = {\n toAttribute(value, type) {\n switch (type) {\n case Boolean:\n value = value ? emptyStringForBooleanAttribute : null;\n break;\n case Object:\n case Array:\n // if the value is `null` or `undefined` pass this through\n // to allow removing/no change behavior.\n value = value == null ? value : JSON.stringify(value);\n break;\n }\n return value;\n },\n fromAttribute(value, type) {\n let fromValue = value;\n switch (type) {\n case Boolean:\n fromValue = value !== null;\n break;\n case Number:\n fromValue = value === null ? null : Number(value);\n break;\n case Object:\n case Array:\n // Do *not* generate exception when invalid JSON is set as elements\n // don't normally complain on being mis-configured.\n // TODO(sorvell): Do generate exception in *dev mode*.\n try {\n // Assert to adhere to Bazel's \"must type assert JSON parse\" rule.\n fromValue = JSON.parse(value);\n }\n catch (e) {\n fromValue = null;\n }\n break;\n }\n return fromValue;\n },\n};\n/**\n * Change function that returns true if `value` is different from `oldValue`.\n * This method is used as the default for a property's `hasChanged` function.\n */\nexport const notEqual = (value, old) => !is(value, old);\nconst defaultPropertyDeclaration = {\n attribute: true,\n type: String,\n converter: defaultConverter,\n reflect: false,\n hasChanged: notEqual,\n};\n// Ensure metadata is enabled. TypeScript does not polyfill\n// Symbol.metadata, so we must ensure that it exists.\nSymbol.metadata ??= Symbol('metadata');\n// Map from a class's metadata object to property options\n// Note that we must use nullish-coalescing assignment so that we only use one\n// map even if we load multiple version of this module.\nglobal.litPropertyMetadata ??= new WeakMap();\n/**\n * Base element class which manages element properties and attributes. When\n * properties change, the `update` method is asynchronously called. This method\n * should be supplied by subclasses to render updates as desired.\n * @noInheritDoc\n */\nexport class ReactiveElement\n// In the Node build, this `extends` clause will be substituted with\n// `(globalThis.HTMLElement ?? HTMLElement)`.\n//\n// This way, we will first prefer any global `HTMLElement` polyfill that the\n// user has assigned, and then fall back to the `HTMLElement` shim which has\n// been imported (see note at the top of this file about how this import is\n// generated by Rollup). Note that the `HTMLElement` variable has been\n// shadowed by this import, so it no longer refers to the global.\n extends HTMLElement {\n /**\n * Adds an initializer function to the class that is called during instance\n * construction.\n *\n * This is useful for code that runs against a `ReactiveElement`\n * subclass, such as a decorator, that needs to do work for each\n * instance, such as setting up a `ReactiveController`.\n *\n * ```ts\n * const myDecorator = (target: typeof ReactiveElement, key: string) => {\n * target.addInitializer((instance: ReactiveElement) => {\n * // This is run during construction of the element\n * new MyController(instance);\n * });\n * }\n * ```\n *\n * Decorating a field will then cause each instance to run an initializer\n * that adds a controller:\n *\n * ```ts\n * class MyElement extends LitElement {\n * @myDecorator foo;\n * }\n * ```\n *\n * Initializers are stored per-constructor. Adding an initializer to a\n * subclass does not add it to a superclass. Since initializers are run in\n * constructors, initializers will run in order of the class hierarchy,\n * starting with superclasses and progressing to the instance's class.\n *\n * @nocollapse\n */\n static addInitializer(initializer) {\n this.__prepare();\n (this._initializers ??= []).push(initializer);\n }\n /**\n * Returns a list of attributes corresponding to the registered properties.\n * @nocollapse\n * @category attributes\n */\n static get observedAttributes() {\n // Ensure we've created all properties\n this.finalize();\n // this.__attributeToPropertyMap is only undefined after finalize() in\n // ReactiveElement itself. ReactiveElement.observedAttributes is only\n // accessed with ReactiveElement as the receiver when a subclass or mixin\n // calls super.observedAttributes\n return (this.__attributeToPropertyMap && [...this.__attributeToPropertyMap.keys()]);\n }\n /**\n * Creates a property accessor on the element prototype if one does not exist\n * and stores a {@linkcode PropertyDeclaration} for the property with the\n * given options. The property setter calls the property's `hasChanged`\n * property option or uses a strict identity check to determine whether or not\n * to request an update.\n *\n * This method may be overridden to customize properties; however,\n * when doing so, it's important to call `super.createProperty` to ensure\n * the property is setup correctly. This method calls\n * `getPropertyDescriptor` internally to get a descriptor to install.\n * To customize what properties do when they are get or set, override\n * `getPropertyDescriptor`. To customize the options for a property,\n * implement `createProperty` like this:\n *\n * ```ts\n * static createProperty(name, options) {\n * options = Object.assign(options, {myOption: true});\n * super.createProperty(name, options);\n * }\n * ```\n *\n * @nocollapse\n * @category properties\n */\n static createProperty(name, options = defaultPropertyDeclaration) {\n // If this is a state property, force the attribute to false.\n if (options.state) {\n options.attribute = false;\n }\n this.__prepare();\n this.elementProperties.set(name, options);\n if (!options.noAccessor) {\n const key = DEV_MODE\n ? // Use Symbol.for in dev mode to make it easier to maintain state\n // when doing HMR.\n Symbol.for(`${String(name)} (@property() cache)`)\n : Symbol();\n const descriptor = this.getPropertyDescriptor(name, key, options);\n if (descriptor !== undefined) {\n defineProperty(this.prototype, name, descriptor);\n }\n }\n }\n /**\n * Returns a property descriptor to be defined on the given named property.\n * If no descriptor is returned, the property will not become an accessor.\n * For example,\n *\n * ```ts\n * class MyElement extends LitElement {\n * static getPropertyDescriptor(name, key, options) {\n * const defaultDescriptor =\n * super.getPropertyDescriptor(name, key, options);\n * const setter = defaultDescriptor.set;\n * return {\n * get: defaultDescriptor.get,\n * set(value) {\n * setter.call(this, value);\n * // custom action.\n * },\n * configurable: true,\n * enumerable: true\n * }\n * }\n * }\n * ```\n *\n * @nocollapse\n * @category properties\n */\n static getPropertyDescriptor(name, key, options) {\n const { get, set } = getOwnPropertyDescriptor(this.prototype, name) ?? {\n get() {\n return this[key];\n },\n set(v) {\n this[key] = v;\n },\n };\n if (DEV_MODE && get == null) {\n if ('value' in (getOwnPropertyDescriptor(this.prototype, name) ?? {})) {\n throw new Error(`Field ${JSON.stringify(String(name))} on ` +\n `${this.name} was declared as a reactive property ` +\n `but it's actually declared as a value on the prototype. ` +\n `Usually this is due to using @property or @state on a method.`);\n }\n issueWarning('reactive-property-without-getter', `Field ${JSON.stringify(String(name))} on ` +\n `${this.name} was declared as a reactive property ` +\n `but it does not have a getter. This will be an error in a ` +\n `future version of Lit.`);\n }\n return {\n get() {\n return get?.call(this);\n },\n set(value) {\n const oldValue = get?.call(this);\n set.call(this, value);\n this.requestUpdate(name, oldValue, options);\n },\n configurable: true,\n enumerable: true,\n };\n }\n /**\n * Returns the property options associated with the given property.\n * These options are defined with a `PropertyDeclaration` via the `properties`\n * object or the `@property` decorator and are registered in\n * `createProperty(...)`.\n *\n * Note, this method should be considered \"final\" and not overridden. To\n * customize the options for a given property, override\n * {@linkcode createProperty}.\n *\n * @nocollapse\n * @final\n * @category properties\n */\n static getPropertyOptions(name) {\n return this.elementProperties.get(name) ?? defaultPropertyDeclaration;\n }\n /**\n * Initializes static own properties of the class used in bookkeeping\n * for element properties, initializers, etc.\n *\n * Can be called multiple times by code that needs to ensure these\n * properties exist before using them.\n *\n * This method ensures the superclass is finalized so that inherited\n * property metadata can be copied down.\n * @nocollapse\n */\n static __prepare() {\n if (this.hasOwnProperty(JSCompiler_renameProperty('elementProperties', this))) {\n // Already prepared\n return;\n }\n // Finalize any superclasses\n const superCtor = getPrototypeOf(this);\n superCtor.finalize();\n // Create own set of initializers for this class if any exist on the\n // superclass and copy them down. Note, for a small perf boost, avoid\n // creating initializers unless needed.\n if (superCtor._initializers !== undefined) {\n this._initializers = [...superCtor._initializers];\n }\n // Initialize elementProperties from the superclass\n this.elementProperties = new Map(superCtor.elementProperties);\n }\n /**\n * Finishes setting up the class so that it's ready to be registered\n * as a custom element and instantiated.\n *\n * This method is called by the ReactiveElement.observedAttributes getter.\n * If you override the observedAttributes getter, you must either call\n * super.observedAttributes to trigger finalization, or call finalize()\n * yourself.\n *\n * @nocollapse\n */\n static finalize() {\n if (this.hasOwnProperty(JSCompiler_renameProperty('finalized', this))) {\n return;\n }\n this.finalized = true;\n this.__prepare();\n // Create properties from the static properties block:\n if (this.hasOwnProperty(JSCompiler_renameProperty('properties', this))) {\n const props = this.properties;\n const propKeys = [\n ...getOwnPropertyNames(props),\n ...getOwnPropertySymbols(props),\n ];\n for (const p of propKeys) {\n this.createProperty(p, props[p]);\n }\n }\n // Create properties from standard decorator metadata:\n const metadata = this[Symbol.metadata];\n if (metadata !== null) {\n const properties = litPropertyMetadata.get(metadata);\n if (properties !== undefined) {\n for (const [p, options] of properties) {\n this.elementProperties.set(p, options);\n }\n }\n }\n // Create the attribute-to-property map\n this.__attributeToPropertyMap = new Map();\n for (const [p, options] of this.elementProperties) {\n const attr = this.__attributeNameForProperty(p, options);\n if (attr !== undefined) {\n this.__attributeToPropertyMap.set(attr, p);\n }\n }\n this.elementStyles = this.finalizeStyles(this.styles);\n if (DEV_MODE) {\n if (this.hasOwnProperty('createProperty')) {\n issueWarning('no-override-create-property', 'Overriding ReactiveElement.createProperty() is deprecated. ' +\n 'The override will not be called with standard decorators');\n }\n if (this.hasOwnProperty('getPropertyDescriptor')) {\n issueWarning('no-override-get-property-descriptor', 'Overriding ReactiveElement.getPropertyDescriptor() is deprecated. ' +\n 'The override will not be called with standard decorators');\n }\n }\n }\n /**\n * Takes the styles the user supplied via the `static styles` property and\n * returns the array of styles to apply to the element.\n * Override this method to integrate into a style management system.\n *\n * Styles are deduplicated preserving the _last_ instance in the list. This\n * is a performance optimization to avoid duplicated styles that can occur\n * especially when composing via subclassing. The last item is kept to try\n * to preserve the cascade order with the assumption that it's most important\n * that last added styles override previous styles.\n *\n * @nocollapse\n * @category styles\n */\n static finalizeStyles(styles) {\n const elementStyles = [];\n if (Array.isArray(styles)) {\n // Dedupe the flattened array in reverse order to preserve the last items.\n // Casting to Array works around TS error that\n // appears to come from trying to flatten a type CSSResultArray.\n const set = new Set(styles.flat(Infinity).reverse());\n // Then preserve original order by adding the set items in reverse order.\n for (const s of set) {\n elementStyles.unshift(getCompatibleStyle(s));\n }\n }\n else if (styles !== undefined) {\n elementStyles.push(getCompatibleStyle(styles));\n }\n return elementStyles;\n }\n /**\n * Returns the property name for the given attribute `name`.\n * @nocollapse\n */\n static __attributeNameForProperty(name, options) {\n const attribute = options.attribute;\n return attribute === false\n ? undefined\n : typeof attribute === 'string'\n ? attribute\n : typeof name === 'string'\n ? name.toLowerCase()\n : undefined;\n }\n constructor() {\n super();\n this.__instanceProperties = undefined;\n /**\n * True if there is a pending update as a result of calling `requestUpdate()`.\n * Should only be read.\n * @category updates\n */\n this.isUpdatePending = false;\n /**\n * Is set to `true` after the first update. The element code cannot assume\n * that `renderRoot` exists before the element `hasUpdated`.\n * @category updates\n */\n this.hasUpdated = false;\n /**\n * Name of currently reflecting property\n */\n this.__reflectingProperty = null;\n this.__initialize();\n }\n /**\n * Internal only override point for customizing work done when elements\n * are constructed.\n */\n __initialize() {\n this.__updatePromise = new Promise((res) => (this.enableUpdating = res));\n this._$changedProperties = new Map();\n // This enqueues a microtask that ust run before the first update, so it\n // must be called before requestUpdate()\n this.__saveInstanceProperties();\n // ensures first update will be caught by an early access of\n // `updateComplete`\n this.requestUpdate();\n this.constructor._initializers?.forEach((i) => i(this));\n }\n /**\n * Registers a `ReactiveController` to participate in the element's reactive\n * update cycle. The element automatically calls into any registered\n * controllers during its lifecycle callbacks.\n *\n * If the element is connected when `addController()` is called, the\n * controller's `hostConnected()` callback will be immediately called.\n * @category controllers\n */\n addController(controller) {\n (this.__controllers ??= new Set()).add(controller);\n // If a controller is added after the element has been connected,\n // call hostConnected. Note, re-using existence of `renderRoot` here\n // (which is set in connectedCallback) to avoid the need to track a\n // first connected state.\n if (this.renderRoot !== undefined && this.isConnected) {\n controller.hostConnected?.();\n }\n }\n /**\n * Removes a `ReactiveController` from the element.\n * @category controllers\n */\n removeController(controller) {\n this.__controllers?.delete(controller);\n }\n /**\n * Fixes any properties set on the instance before upgrade time.\n * Otherwise these would shadow the accessor and break these properties.\n * The properties are stored in a Map which is played back after the\n * constructor runs. Note, on very old versions of Safari (<=9) or Chrome\n * (<=41), properties created for native platform properties like (`id` or\n * `name`) may not have default values set in the element constructor. On\n * these browsers native properties appear on instances and therefore their\n * default value will overwrite any element default (e.g. if the element sets\n * this.id = 'id' in the constructor, the 'id' will become '' since this is\n * the native platform default).\n */\n __saveInstanceProperties() {\n const instanceProperties = new Map();\n const elementProperties = this.constructor\n .elementProperties;\n for (const p of elementProperties.keys()) {\n if (this.hasOwnProperty(p)) {\n instanceProperties.set(p, this[p]);\n delete this[p];\n }\n }\n if (instanceProperties.size > 0) {\n this.__instanceProperties = instanceProperties;\n }\n }\n /**\n * Returns the node into which the element should render and by default\n * creates and returns an open shadowRoot. Implement to customize where the\n * element's DOM is rendered. For example, to render into the element's\n * childNodes, return `this`.\n *\n * @return Returns a node into which to render.\n * @category rendering\n */\n createRenderRoot() {\n const renderRoot = this.shadowRoot ??\n this.attachShadow(this.constructor.shadowRootOptions);\n adoptStyles(renderRoot, this.constructor.elementStyles);\n return renderRoot;\n }\n /**\n * On first connection, creates the element's renderRoot, sets up\n * element styling, and enables updating.\n * @category lifecycle\n */\n connectedCallback() {\n // Create renderRoot before controllers `hostConnected`\n this.renderRoot ??=\n this.createRenderRoot();\n this.enableUpdating(true);\n this.__controllers?.forEach((c) => c.hostConnected?.());\n }\n /**\n * Note, this method should be considered final and not overridden. It is\n * overridden on the element instance with a function that triggers the first\n * update.\n * @category updates\n */\n enableUpdating(_requestedUpdate) { }\n /**\n * Allows for `super.disconnectedCallback()` in extensions while\n * reserving the possibility of making non-breaking feature additions\n * when disconnecting at some point in the future.\n * @category lifecycle\n */\n disconnectedCallback() {\n this.__controllers?.forEach((c) => c.hostDisconnected?.());\n }\n /**\n * Synchronizes property values when attributes change.\n *\n * Specifically, when an attribute is set, the corresponding property is set.\n * You should rarely need to implement this callback. If this method is\n * overridden, `super.attributeChangedCallback(name, _old, value)` must be\n * called.\n *\n * See [using the lifecycle callbacks](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks)\n * on MDN for more information about the `attributeChangedCallback`.\n * @category attributes\n */\n attributeChangedCallback(name, _old, value) {\n this._$attributeToProperty(name, value);\n }\n __propertyToAttribute(name, value) {\n const elemProperties = this.constructor.elementProperties;\n const options = elemProperties.get(name);\n const attr = this.constructor.__attributeNameForProperty(name, options);\n if (attr !== undefined && options.reflect === true) {\n const converter = options.converter?.toAttribute !==\n undefined\n ? options.converter\n : defaultConverter;\n const attrValue = converter.toAttribute(value, options.type);\n if (DEV_MODE &&\n this.constructor.enabledWarnings.includes('migration') &&\n attrValue === undefined) {\n issueWarning('undefined-attribute-value', `The attribute value for the ${name} property is ` +\n `undefined on element ${this.localName}. The attribute will be ` +\n `removed, but in the previous version of \\`ReactiveElement\\`, ` +\n `the attribute would not have changed.`);\n }\n // Track if the property is being reflected to avoid\n // setting the property again via `attributeChangedCallback`. Note:\n // 1. this takes advantage of the fact that the callback is synchronous.\n // 2. will behave incorrectly if multiple attributes are in the reaction\n // stack at time of calling. However, since we process attributes\n // in `update` this should not be possible (or an extreme corner case\n // that we'd like to discover).\n // mark state reflecting\n this.__reflectingProperty = name;\n if (attrValue == null) {\n this.removeAttribute(attr);\n }\n else {\n this.setAttribute(attr, attrValue);\n }\n // mark state not reflecting\n this.__reflectingProperty = null;\n }\n }\n /** @internal */\n _$attributeToProperty(name, value) {\n const ctor = this.constructor;\n // Note, hint this as an `AttributeMap` so closure clearly understands\n // the type; it has issues with tracking types through statics\n const propName = ctor.__attributeToPropertyMap.get(name);\n // Use tracking info to avoid reflecting a property value to an attribute\n // if it was just set because the attribute changed.\n if (propName !== undefined && this.__reflectingProperty !== propName) {\n const options = ctor.getPropertyOptions(propName);\n const converter = typeof options.converter === 'function'\n ? { fromAttribute: options.converter }\n : options.converter?.fromAttribute !== undefined\n ? options.converter\n : defaultConverter;\n // mark state reflecting\n this.__reflectingProperty = propName;\n this[propName] = converter.fromAttribute(value, options.type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n );\n // mark state not reflecting\n this.__reflectingProperty = null;\n }\n }\n /**\n * Requests an update which is processed asynchronously. This should be called\n * when an element should update based on some state not triggered by setting\n * a reactive property. In this case, pass no arguments. It should also be\n * called when manually implementing a property setter. In this case, pass the\n * property `name` and `oldValue` to ensure that any configured property\n * options are honored.\n *\n * @param name name of requesting property\n * @param oldValue old value of requesting property\n * @param options property options to use instead of the previously\n * configured options\n * @category updates\n */\n requestUpdate(name, oldValue, options) {\n // If we have a property key, perform property update steps.\n if (name !== undefined) {\n if (DEV_MODE && name instanceof Event) {\n issueWarning(``, `The requestUpdate() method was called with an Event as the property name. This is probably a mistake caused by binding this.requestUpdate as an event listener. Instead bind a function that will call it with no arguments: () => this.requestUpdate()`);\n }\n options ??= this.constructor.getPropertyOptions(name);\n const hasChanged = options.hasChanged ?? notEqual;\n const newValue = this[name];\n if (hasChanged(newValue, oldValue)) {\n this._$changeProperty(name, oldValue, options);\n }\n else {\n // Abort the request if the property should not be considered changed.\n return;\n }\n }\n if (this.isUpdatePending === false) {\n this.__updatePromise = this.__enqueueUpdate();\n }\n }\n /**\n * @internal\n */\n _$changeProperty(name, oldValue, options) {\n // TODO (justinfagnani): Create a benchmark of Map.has() + Map.set(\n // vs just Map.set()\n if (!this._$changedProperties.has(name)) {\n this._$changedProperties.set(name, oldValue);\n }\n // Add to reflecting properties set.\n // Note, it's important that every change has a chance to add the\n // property to `__reflectingProperties`. This ensures setting\n // attribute + property reflects correctly.\n if (options.reflect === true && this.__reflectingProperty !== name) {\n (this.__reflectingProperties ??= new Set()).add(name);\n }\n }\n /**\n * Sets up the element to asynchronously update.\n */\n async __enqueueUpdate() {\n this.isUpdatePending = true;\n try {\n // Ensure any previous update has resolved before updating.\n // This `await` also ensures that property changes are batched.\n await this.__updatePromise;\n }\n catch (e) {\n // Refire any previous errors async so they do not disrupt the update\n // cycle. Errors are refired so developers have a chance to observe\n // them, and this can be done by implementing\n // `window.onunhandledrejection`.\n Promise.reject(e);\n }\n const result = this.scheduleUpdate();\n // If `scheduleUpdate` returns a Promise, we await it. This is done to\n // enable coordinating updates with a scheduler. Note, the result is\n // checked to avoid delaying an additional microtask unless we need to.\n if (result != null) {\n await result;\n }\n return !this.isUpdatePending;\n }\n /**\n * Schedules an element update. You can override this method to change the\n * timing of updates by returning a Promise. The update will await the\n * returned Promise, and you should resolve the Promise to allow the update\n * to proceed. If this method is overridden, `super.scheduleUpdate()`\n * must be called.\n *\n * For instance, to schedule updates to occur just before the next frame:\n *\n * ```ts\n * override protected async scheduleUpdate(): Promise {\n * await new Promise((resolve) => requestAnimationFrame(() => resolve()));\n * super.scheduleUpdate();\n * }\n * ```\n * @category updates\n */\n scheduleUpdate() {\n const result = this.performUpdate();\n if (DEV_MODE &&\n this.constructor.enabledWarnings.includes('async-perform-update') &&\n typeof result?.then ===\n 'function') {\n issueWarning('async-perform-update', `Element ${this.localName} returned a Promise from performUpdate(). ` +\n `This behavior is deprecated and will be removed in a future ` +\n `version of ReactiveElement.`);\n }\n return result;\n }\n /**\n * Performs an element update. Note, if an exception is thrown during the\n * update, `firstUpdated` and `updated` will not be called.\n *\n * Call `performUpdate()` to immediately process a pending update. This should\n * generally not be needed, but it can be done in rare cases when you need to\n * update synchronously.\n *\n * @category updates\n */\n performUpdate() {\n // Abort any update if one is not pending when this is called.\n // This can happen if `performUpdate` is called early to \"flush\"\n // the update.\n if (!this.isUpdatePending) {\n return;\n }\n debugLogEvent?.({ kind: 'update' });\n if (!this.hasUpdated) {\n // Create renderRoot before first update. This occurs in `connectedCallback`\n // but is done here to support out of tree calls to `enableUpdating`/`performUpdate`.\n this.renderRoot ??=\n this.createRenderRoot();\n if (DEV_MODE) {\n // Produce warning if any reactive properties on the prototype are\n // shadowed by class fields. Instance fields set before upgrade are\n // deleted by this point, so any own property is caused by class field\n // initialization in the constructor.\n const ctor = this.constructor;\n const shadowedProperties = [...ctor.elementProperties.keys()].filter((p) => this.hasOwnProperty(p) && p in getPrototypeOf(this));\n if (shadowedProperties.length) {\n throw new Error(`The following properties on element ${this.localName} will not ` +\n `trigger updates as expected because they are set using class ` +\n `fields: ${shadowedProperties.join(', ')}. ` +\n `Native class fields and some compiled output will overwrite ` +\n `accessors used for detecting changes. See ` +\n `https://lit.dev/msg/class-field-shadowing ` +\n `for more information.`);\n }\n }\n // Mixin instance properties once, if they exist.\n if (this.__instanceProperties) {\n // TODO (justinfagnani): should we use the stored value? Could a new value\n // have been set since we stored the own property value?\n for (const [p, value] of this.__instanceProperties) {\n this[p] = value;\n }\n this.__instanceProperties = undefined;\n }\n // Trigger initial value reflection and populate the initial\n // changedProperties map, but only for the case of experimental\n // decorators on accessors, which will not have already populated the\n // changedProperties map. We can't know if these accessors had\n // initializers, so we just set them anyway - a difference from\n // experimental decorators on fields and standard decorators on\n // auto-accessors.\n // For context why experimentalDecorators with auto accessors are handled\n // specifically also see:\n // https://github.com/lit/lit/pull/4183#issuecomment-1711959635\n const elementProperties = this.constructor\n .elementProperties;\n if (elementProperties.size > 0) {\n for (const [p, options] of elementProperties) {\n if (options.wrapped === true &&\n !this._$changedProperties.has(p) &&\n this[p] !== undefined) {\n this._$changeProperty(p, this[p], options);\n }\n }\n }\n }\n let shouldUpdate = false;\n const changedProperties = this._$changedProperties;\n try {\n shouldUpdate = this.shouldUpdate(changedProperties);\n if (shouldUpdate) {\n this.willUpdate(changedProperties);\n this.__controllers?.forEach((c) => c.hostUpdate?.());\n this.update(changedProperties);\n }\n else {\n this.__markUpdated();\n }\n }\n catch (e) {\n // Prevent `firstUpdated` and `updated` from running when there's an\n // update exception.\n shouldUpdate = false;\n // Ensure element can accept additional updates after an exception.\n this.__markUpdated();\n throw e;\n }\n // The update is no longer considered pending and further updates are now allowed.\n if (shouldUpdate) {\n this._$didUpdate(changedProperties);\n }\n }\n /**\n * Invoked before `update()` to compute values needed during the update.\n *\n * Implement `willUpdate` to compute property values that depend on other\n * properties and are used in the rest of the update process.\n *\n * ```ts\n * willUpdate(changedProperties) {\n * // only need to check changed properties for an expensive computation.\n * if (changedProperties.has('firstName') || changedProperties.has('lastName')) {\n * this.sha = computeSHA(`${this.firstName} ${this.lastName}`);\n * }\n * }\n *\n * render() {\n * return html`SHA: ${this.sha}`;\n * }\n * ```\n *\n * @category updates\n */\n willUpdate(_changedProperties) { }\n // Note, this is an override point for polyfill-support.\n // @internal\n _$didUpdate(changedProperties) {\n this.__controllers?.forEach((c) => c.hostUpdated?.());\n if (!this.hasUpdated) {\n this.hasUpdated = true;\n this.firstUpdated(changedProperties);\n }\n this.updated(changedProperties);\n if (DEV_MODE &&\n this.isUpdatePending &&\n this.constructor.enabledWarnings.includes('change-in-update')) {\n issueWarning('change-in-update', `Element ${this.localName} scheduled an update ` +\n `(generally because a property was set) ` +\n `after an update completed, causing a new update to be scheduled. ` +\n `This is inefficient and should be avoided unless the next update ` +\n `can only be scheduled as a side effect of the previous update.`);\n }\n }\n __markUpdated() {\n this._$changedProperties = new Map();\n this.isUpdatePending = false;\n }\n /**\n * Returns a Promise that resolves when the element has completed updating.\n * The Promise value is a boolean that is `true` if the element completed the\n * update without triggering another update. The Promise result is `false` if\n * a property was set inside `updated()`. If the Promise is rejected, an\n * exception was thrown during the update.\n *\n * To await additional asynchronous work, override the `getUpdateComplete`\n * method. For example, it is sometimes useful to await a rendered element\n * before fulfilling this Promise. To do this, first await\n * `super.getUpdateComplete()`, then any subsequent state.\n *\n * @return A promise of a boolean that resolves to true if the update completed\n * without triggering another update.\n * @category updates\n */\n get updateComplete() {\n return this.getUpdateComplete();\n }\n /**\n * Override point for the `updateComplete` promise.\n *\n * It is not safe to override the `updateComplete` getter directly due to a\n * limitation in TypeScript which means it is not possible to call a\n * superclass getter (e.g. `super.updateComplete.then(...)`) when the target\n * language is ES5 (https://github.com/microsoft/TypeScript/issues/338).\n * This method should be overridden instead. For example:\n *\n * ```ts\n * class MyElement extends LitElement {\n * override async getUpdateComplete() {\n * const result = await super.getUpdateComplete();\n * await this._myChild.updateComplete;\n * return result;\n * }\n * }\n * ```\n *\n * @return A promise of a boolean that resolves to true if the update completed\n * without triggering another update.\n * @category updates\n */\n getUpdateComplete() {\n return this.__updatePromise;\n }\n /**\n * Controls whether or not `update()` should be called when the element requests\n * an update. By default, this method always returns `true`, but this can be\n * customized to control when to update.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n shouldUpdate(_changedProperties) {\n return true;\n }\n /**\n * Updates the element. This method reflects property values to attributes.\n * It can be overridden to render and keep updated element DOM.\n * Setting properties inside this method will *not* trigger\n * another update.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n update(_changedProperties) {\n // The forEach() expression will only run when when __reflectingProperties is\n // defined, and it returns undefined, setting __reflectingProperties to\n // undefined\n this.__reflectingProperties &&= this.__reflectingProperties.forEach((p) => this.__propertyToAttribute(p, this[p]));\n this.__markUpdated();\n }\n /**\n * Invoked whenever the element is updated. Implement to perform\n * post-updating tasks via DOM APIs, for example, focusing an element.\n *\n * Setting properties inside this method will trigger the element to update\n * again after this update cycle completes.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n updated(_changedProperties) { }\n /**\n * Invoked when the element is first updated. Implement to perform one time\n * work on the element after update.\n *\n * ```ts\n * firstUpdated() {\n * this.renderRoot.getElementById('my-text-area').focus();\n * }\n * ```\n *\n * Setting properties inside this method will trigger the element to update\n * again after this update cycle completes.\n *\n * @param _changedProperties Map of changed properties with old values\n * @category updates\n */\n firstUpdated(_changedProperties) { }\n}\n/**\n * Memoized list of all element styles.\n * Created lazily on user subclasses when finalizing the class.\n * @nocollapse\n * @category styles\n */\nReactiveElement.elementStyles = [];\n/**\n * Options used when calling `attachShadow`. Set this property to customize\n * the options for the shadowRoot; for example, to create a closed\n * shadowRoot: `{mode: 'closed'}`.\n *\n * Note, these options are used in `createRenderRoot`. If this method\n * is customized, options should be respected if possible.\n * @nocollapse\n * @category rendering\n */\nReactiveElement.shadowRootOptions = { mode: 'open' };\n// Assigned here to work around a jscompiler bug with static fields\n// when compiling to ES5.\n// https://github.com/google/closure-compiler/issues/3177\nReactiveElement[JSCompiler_renameProperty('elementProperties', ReactiveElement)] = new Map();\nReactiveElement[JSCompiler_renameProperty('finalized', ReactiveElement)] = new Map();\n// Apply polyfills if available\npolyfillSupport?.({ ReactiveElement });\n// Dev mode warnings...\nif (DEV_MODE) {\n // Default warning set.\n ReactiveElement.enabledWarnings = [\n 'change-in-update',\n 'async-perform-update',\n ];\n const ensureOwnWarnings = function (ctor) {\n if (!ctor.hasOwnProperty(JSCompiler_renameProperty('enabledWarnings', ctor))) {\n ctor.enabledWarnings = ctor.enabledWarnings.slice();\n }\n };\n ReactiveElement.enableWarning = function (warning) {\n ensureOwnWarnings(this);\n if (!this.enabledWarnings.includes(warning)) {\n this.enabledWarnings.push(warning);\n }\n };\n ReactiveElement.disableWarning = function (warning) {\n ensureOwnWarnings(this);\n const i = this.enabledWarnings.indexOf(warning);\n if (i >= 0) {\n this.enabledWarnings.splice(i, 1);\n }\n };\n}\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for ReactiveElement usage.\n(global.reactiveElementVersions ??= []).push('2.0.4');\nif (DEV_MODE && global.reactiveElementVersions.length > 1) {\n issueWarning('multiple-versions', `Multiple versions of Lit loaded. Loading multiple versions ` +\n `is not recommended.`);\n}\n//# sourceMappingURL=reactive-element.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/*\n * IMPORTANT: For compatibility with tsickle and the Closure JS compiler, all\n * property decorators (but not class decorators) in this file that have\n * an @ExportDecoratedItems annotation must be defined as a regular function,\n * not an arrow function.\n */\nimport { defaultConverter, notEqual, } from '../reactive-element.js';\nconst DEV_MODE = true;\nlet issueWarning;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n const issuedWarnings = (globalThis.litIssuedWarnings ??= new Set());\n // Issue a warning, if we haven't already.\n issueWarning = (code, warning) => {\n warning += ` See https://lit.dev/msg/${code} for more information.`;\n if (!issuedWarnings.has(warning)) {\n console.warn(warning);\n issuedWarnings.add(warning);\n }\n };\n}\nconst legacyProperty = (options, proto, name) => {\n const hasOwnProperty = proto.hasOwnProperty(name);\n proto.constructor.createProperty(name, hasOwnProperty ? { ...options, wrapped: true } : options);\n // For accessors (which have a descriptor on the prototype) we need to\n // return a descriptor, otherwise TypeScript overwrites the descriptor we\n // define in createProperty() with the original descriptor. We don't do this\n // for fields, which don't have a descriptor, because this could overwrite\n // descriptor defined by other decorators.\n return hasOwnProperty\n ? Object.getOwnPropertyDescriptor(proto, name)\n : undefined;\n};\n// This is duplicated from a similar variable in reactive-element.ts, but\n// actually makes sense to have this default defined with the decorator, so\n// that different decorators could have different defaults.\nconst defaultPropertyDeclaration = {\n attribute: true,\n type: String,\n converter: defaultConverter,\n reflect: false,\n hasChanged: notEqual,\n};\n/**\n * Wraps a class accessor or setter so that `requestUpdate()` is called with the\n * property name and old value when the accessor is set.\n */\nexport const standardProperty = (options = defaultPropertyDeclaration, target, context) => {\n const { kind, metadata } = context;\n if (DEV_MODE && metadata == null) {\n issueWarning('missing-class-metadata', `The class ${target} is missing decorator metadata. This ` +\n `could mean that you're using a compiler that supports decorators ` +\n `but doesn't support decorator metadata, such as TypeScript 5.1. ` +\n `Please update your compiler.`);\n }\n // Store the property options\n let properties = globalThis.litPropertyMetadata.get(metadata);\n if (properties === undefined) {\n globalThis.litPropertyMetadata.set(metadata, (properties = new Map()));\n }\n properties.set(context.name, options);\n if (kind === 'accessor') {\n // Standard decorators cannot dynamically modify the class, so we can't\n // replace a field with accessors. The user must use the new `accessor`\n // keyword instead.\n const { name } = context;\n return {\n set(v) {\n const oldValue = target.get.call(this);\n target.set.call(this, v);\n this.requestUpdate(name, oldValue, options);\n },\n init(v) {\n if (v !== undefined) {\n this._$changeProperty(name, undefined, options);\n }\n return v;\n },\n };\n }\n else if (kind === 'setter') {\n const { name } = context;\n return function (value) {\n const oldValue = this[name];\n target.call(this, value);\n this.requestUpdate(name, oldValue, options);\n };\n }\n throw new Error(`Unsupported decorator location: ${kind}`);\n};\n/**\n * A class field or accessor decorator which creates a reactive property that\n * reflects a corresponding attribute value. When a decorated property is set\n * the element will update and render. A {@linkcode PropertyDeclaration} may\n * optionally be supplied to configure property features.\n *\n * This decorator should only be used for public fields. As public fields,\n * properties should be considered as primarily settable by element users,\n * either via attribute or the property itself.\n *\n * Generally, properties that are changed by the element should be private or\n * protected fields and should use the {@linkcode state} decorator.\n *\n * However, sometimes element code does need to set a public property. This\n * should typically only be done in response to user interaction, and an event\n * should be fired informing the user; for example, a checkbox sets its\n * `checked` property when clicked and fires a `changed` event. Mutating public\n * properties should typically not be done for non-primitive (object or array)\n * properties. In other cases when an element needs to manage state, a private\n * property decorated via the {@linkcode state} decorator should be used. When\n * needed, state properties can be initialized via public properties to\n * facilitate complex interactions.\n *\n * ```ts\n * class MyElement {\n * @property({ type: Boolean })\n * clicked = false;\n * }\n * ```\n * @category Decorator\n * @ExportDecoratedItems\n */\nexport function property(options) {\n return (protoOrTarget, nameOrContext\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) => {\n return (typeof nameOrContext === 'object'\n ? standardProperty(options, protoOrTarget, nameOrContext)\n : legacyProperty(options, protoOrTarget, nameOrContext));\n };\n}\n//# sourceMappingURL=property.js.map","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { desc } from './base.js';\nconst DEV_MODE = true;\nlet issueWarning;\nif (DEV_MODE) {\n // Ensure warnings are issued only 1x, even if multiple versions of Lit\n // are loaded.\n const issuedWarnings = (globalThis.litIssuedWarnings ??= new Set());\n // Issue a warning, if we haven't already.\n issueWarning = (code, warning) => {\n warning += code\n ? ` See https://lit.dev/msg/${code} for more information.`\n : '';\n if (!issuedWarnings.has(warning)) {\n console.warn(warning);\n issuedWarnings.add(warning);\n }\n };\n}\n/**\n * A property decorator that converts a class property into a getter that\n * executes a querySelector on the element's renderRoot.\n *\n * @param selector A DOMString containing one or more selectors to match.\n * @param cache An optional boolean which when true performs the DOM query only\n * once and caches the result.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector\n *\n * ```ts\n * class MyElement {\n * @query('#first')\n * first: HTMLDivElement;\n *\n * render() {\n * return html`\n *
    \n *
    \n * `;\n * }\n * }\n * ```\n * @category Decorator\n */\nexport function query(selector, cache) {\n return ((protoOrTarget, nameOrContext, descriptor) => {\n const doQuery = (el) => {\n const result = (el.renderRoot?.querySelector(selector) ?? null);\n if (DEV_MODE && result === null && cache && !el.hasUpdated) {\n const name = typeof nameOrContext === 'object'\n ? nameOrContext.name\n : nameOrContext;\n issueWarning('', `@query'd field ${JSON.stringify(String(name))} with the 'cache' ` +\n `flag set for selector '${selector}' has been accessed before ` +\n `the first update and returned null. This is expected if the ` +\n `renderRoot tree has not been provided beforehand (e.g. via ` +\n `Declarative Shadow DOM). Therefore the value hasn't been cached.`);\n }\n // TODO: if we want to allow users to assert that the query will never\n // return null, we need a new option and to throw here if the result\n // is null.\n return result;\n };\n if (cache) {\n // Accessors to wrap from either:\n // 1. The decorator target, in the case of standard decorators\n // 2. The property descriptor, in the case of experimental decorators\n // on auto-accessors.\n // 3. Functions that access our own cache-key property on the instance,\n // in the case of experimental decorators on fields.\n const { get, set } = typeof nameOrContext === 'object'\n ? protoOrTarget\n : descriptor ??\n (() => {\n const key = DEV_MODE\n ? Symbol(`${String(nameOrContext)} (@query() cache)`)\n : Symbol();\n return {\n get() {\n return this[key];\n },\n set(v) {\n this[key] = v;\n },\n };\n })();\n return desc(protoOrTarget, nameOrContext, {\n get() {\n let result = get.call(this);\n if (result === undefined) {\n result = doQuery(this);\n if (result !== null || this.hasUpdated) {\n set.call(this, result);\n }\n }\n return result;\n },\n });\n }\n else {\n // This object works as the return type for both standard and\n // experimental decorators.\n return desc(protoOrTarget, nameOrContext, {\n get() {\n return doQuery(this);\n },\n });\n }\n });\n}\n//# sourceMappingURL=query.js.map","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '174';\n\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst ConstantColorFactor = 211;\nconst OneMinusConstantColorFactor = 212;\nconst ConstantAlphaFactor = 213;\nconst OneMinusConstantAlphaFactor = 214;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\nconst AgXToneMapping = 6;\nconst NeutralToneMapping = 7;\nconst AttachedBindMode = 'attached';\nconst DetachedBindMode = 'detached';\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedInt248Type = 1020;\nconst UnsignedInt5999Type = 35902;\nconst AlphaFormat = 1021;\nconst RGBFormat = 1022;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBIntegerFormat = 1032;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst RGB_BPTC_SIGNED_Format = 36494;\nconst RGB_BPTC_UNSIGNED_Format = 36495;\nconst RED_RGTC1_Format = 36283;\nconst SIGNED_RED_RGTC1_Format = 36284;\nconst RED_GREEN_RGTC2_Format = 36285;\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst RGBDepthPacking = 3202;\nconst RGDepthPacking = 3203;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nconst NoColorSpace = '';\nconst SRGBColorSpace = 'srgb';\nconst LinearSRGBColorSpace = 'srgb-linear';\n\nconst LinearTransfer = 'linear';\nconst SRGBTransfer = 'srgb';\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst NeverCompare = 512;\nconst LessCompare = 513;\nconst EqualCompare = 514;\nconst LessEqualCompare = 515;\nconst GreaterCompare = 516;\nconst NotEqualCompare = 517;\nconst GreaterEqualCompare = 518;\nconst AlwaysCompare = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\nconst GLSL1 = '100';\nconst GLSL3 = '300 es';\n\nconst WebGLCoordinateSystem = 2000;\nconst WebGPUCoordinateSystem = 2001;\n\nconst TimestampQuery = {\n\tCOMPUTE: 'compute',\n\tRENDER: 'render'\n};\n\n/**\n * This modules allows to dispatch event objects on custom JavaScript objects.\n *\n * Main repository: [eventdispatcher.js]{@link https://github.com/mrdoob/eventdispatcher.js/}\n *\n * Code Example:\n * ```js\n * class Car extends EventDispatcher {\n * \tstart() {\n *\t\tthis.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );\n *\t}\n *};\n *\n * // Using events with the custom object\n * const car = new Car();\n * car.addEventListener( 'start', function ( event ) {\n * \talert( event.message );\n * } );\n *\n * car.start();\n * ```\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds the given event listener to the given event type.\n\t *\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given event listener has been added to the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to check.\n\t * @return {boolean} Whether the given event listener has been added to the given event type.\n\t */\n\thasEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return false;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\t/**\n\t * Removes the given event listener from the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to remove.\n\t */\n\tremoveEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event object.\n\t *\n\t * @param {Object} event - The event that gets fired.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID]{@link https://en.wikipedia.org/wiki/Universally_unique_identifier}\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `` to range ``\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp]{@link http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/}.\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep]{@link http://en.wikipedia.org/wiki/Smoothstep} for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep]{@link https://en.wikipedia.org/wiki/Smoothstep#Variations}\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles]{@link https://en.wikipedia.org/wiki/Euler_angles}\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\n/**\n * Class representing a 2D vector. A 2D vector is an ordered pair of numbers\n * (labeled x and y), which can be used to represent a number of things, such as:\n *\n * - A point in 2D space (i.e. a position on a plane).\n * - A direction and length across a plane. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)`\n * and the direction is also measured from `(0, 0)` towards `(x, y)`.\n * - Any arbitrary ordered pair of numbers.\n *\n * There are other things a 2D vector can be used to represent, such as\n * momentum vectors, complex numbers and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector2( 0, 1 );\n *\n * //no arguments; will be initialised to (0, 0)\n * const b = new THREE.Vector2( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector2 {\n\n\t/**\n\t * Constructs a new 2D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t */\n\tconstructor( x = 0, y = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector2.prototype.isVector2 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#x}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#y}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @param {number} value - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to copy.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector2} v - The vector to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector2} v - The vector to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 as the 3rd component) by\n\t * the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the given vector's x or y\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than the given vector's x or y\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the max vector's x or y\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x or y value is less than the min vector's x or y value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector2} min - The minimum x and y values.\n\t * @param {Vector2} max - The maximum x and y values in the desired range.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x or y values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x and y = -y.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the cross product with.\n\t * @return {number} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t *\n\t * @return {number} The angle in radians.\n\t */\n\tangle() {\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector2} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector2} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector2} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector2} v1 - The first vector.\n\t * @param {Vector2} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector2} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]` and y\n\t * value to be `array[ offset + 1 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this vector around the given center by the given angle.\n\t *\n\t * @param {Vector2} center - The point around which to rotate.\n\t * @param {number} angle - The angle to rotate, in radians.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\n/**\n * Represents a 3x3 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major]{@link https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order}\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix();\n * m.set( 11, 12, 13,\n * 21, 22, 23,\n * 31, 32, 33 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31,\n * 12, 22, 32,\n * 13, 23, 33 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix3 {\n\n\t/**\n\t * Constructs a new 3x3 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 3x3 identity matrix.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix3} m - The matrix to copy.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 3x3 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix3} a - The first matrix.\n\t * @param {Matrix3} b - The second matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}.\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the normal matrix which is the inverse transpose of the upper\n\t * left 3x3 portion of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\t/**\n\t * Transposes this matrix into the supplied array, and returns itself unchanged.\n\t *\n\t * @param {Array} r - An array to store the transposed matrix elements.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the UV transform matrix from offset, repeat, rotation, and center.\n\t *\n\t * @param {number} tx - Offset x.\n\t * @param {number} ty - Offset y.\n\t * @param {number} sx - Repeat x.\n\t * @param {number} sy - Repeat y.\n\t * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise.\n\t * @param {number} cx - Center x of rotation.\n\t * @param {number} cy - Center y of rotation\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this matrix with the given scalar values.\n\t *\n\t * @param {number} sx - The amount to scale in the X axis.\n\t * @param {number} sy - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this matrix by the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates this matrix by the given scalar values.\n\t *\n\t * @param {number} tx - The amount to translate in the X axis.\n\t * @param {number} ty - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\t/**\n\t * Sets this matrix as a 2D translation transform.\n\t *\n\t * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D rotational transformation.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D scale transform.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix3} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nfunction warnOnce( message ) {\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\tconsole.warn( message );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\nfunction toNormalizedProjectionMatrix( projectionMatrix ) {\n\n\tconst m = projectionMatrix.elements;\n\n\t// Convert [-1, 1] to [0, 1] projection matrix\n\tm[ 2 ] = 0.5 * m[ 2 ] + 0.5 * m[ 3 ];\n\tm[ 6 ] = 0.5 * m[ 6 ] + 0.5 * m[ 7 ];\n\tm[ 10 ] = 0.5 * m[ 10 ] + 0.5 * m[ 11 ];\n\tm[ 14 ] = 0.5 * m[ 14 ] + 0.5 * m[ 15 ];\n\n}\n\nfunction toReversedProjectionMatrix( projectionMatrix ) {\n\n\tconst m = projectionMatrix.elements;\n\tconst isPerspectiveMatrix = m[ 11 ] === -1;\n\n\t// Reverse [0, 1] projection matrix\n\tif ( isPerspectiveMatrix ) {\n\n\t\tm[ 10 ] = - m[ 10 ] - 1;\n\t\tm[ 14 ] = - m[ 14 ];\n\n\t} else {\n\n\t\tm[ 10 ] = - m[ 10 ];\n\t\tm[ 14 ] = - m[ 14 ] + 1;\n\n\t}\n\n}\n\nconst LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4123908, 0.3575843, 0.1804808,\n\t0.2126390, 0.7151687, 0.0721923,\n\t0.0193308, 0.1191948, 0.9505322\n);\n\nconst XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set(\n\t3.2409699, -1.5373832, -0.4986108,\n\t-0.9692436, 1.8759675, 0.0415551,\n\t0.0556301, -0.203977, 1.0569715\n);\n\nfunction createColorManagement() {\n\n\tconst ColorManagement = {\n\n\t\tenabled: true,\n\n\t\tworkingColorSpace: LinearSRGBColorSpace,\n\n\t\t/**\n\t\t * Implementations of supported color spaces.\n\t\t *\n\t\t * Required:\n\t\t *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n\t\t *\t- whitePoint: reference white [ x y ]\n\t\t *\t- transfer: transfer function (pre-defined)\n\t\t *\t- toXYZ: Matrix3 RGB to XYZ transform\n\t\t *\t- fromXYZ: Matrix3 XYZ to RGB transform\n\t\t *\t- luminanceCoefficients: RGB luminance coefficients\n\t\t *\n\t\t * Optional:\n\t\t * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace }\n\t\t * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n\t\t *\n\t\t * Reference:\n\t\t * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n\t\t */\n\t\tspaces: {},\n\n\t\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\t\treturn color;\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = SRGBToLinear( color.r );\n\t\t\t\tcolor.g = SRGBToLinear( color.g );\n\t\t\t\tcolor.b = SRGBToLinear( color.b );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) {\n\n\t\t\t\tcolor.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ );\n\t\t\t\tcolor.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = LinearToSRGB( color.r );\n\t\t\t\tcolor.g = LinearToSRGB( color.g );\n\t\t\t\tcolor.b = LinearToSRGB( color.b );\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t},\n\n\t\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t\t},\n\n\t\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t\t},\n\n\t\tgetPrimaries: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].primaries;\n\n\t\t},\n\n\t\tgetTransfer: function ( colorSpace ) {\n\n\t\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\t\treturn this.spaces[ colorSpace ].transfer;\n\n\t\t},\n\n\t\tgetLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients );\n\n\t\t},\n\n\t\tdefine: function ( colorSpaces ) {\n\n\t\t\tObject.assign( this.spaces, colorSpaces );\n\n\t\t},\n\n\t\t// Internal APIs\n\n\t\t_getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) {\n\n\t\t\treturn targetMatrix\n\t\t\t\t.copy( this.spaces[ sourceColorSpace ].toXYZ )\n\t\t\t\t.multiply( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t},\n\n\t\t_getDrawingBufferColorSpace: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace;\n\n\t\t},\n\n\t\t_getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace;\n\n\t\t}\n\n\t};\n\n\t/******************************************************************************\n\t * sRGB definitions\n\t */\n\n\tconst REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ];\n\tconst REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ];\n\tconst D65 = [ 0.3127, 0.3290 ];\n\n\tColorManagement.define( {\n\n\t\t[ LinearSRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: LinearTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\tworkingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t\t[ SRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: SRGBTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t} );\n\n\treturn ColorManagement;\n\n}\n\nconst ColorManagement = /*@__PURE__*/ createColorManagement();\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\n/**\n * A class containing utility functions for images.\n *\n * @hideconstructor\n */\nclass ImageUtils {\n\n\t/**\n\t * Returns a data URI containing a representation of the given image.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object.\n\t * @return {string} The data URI.\n\t */\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\treturn canvas.toDataURL( 'image/png' );\n\n\t}\n\n\t/**\n\t * Converts the given sRGB image data to linear color space.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object.\n\t * @return {HTMLCanvasElement|Object} The converted image.\n\t */\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\nclass Source {\n\n\tconstructor( data = null ) {\n\n\t\tthis.isSource = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.data = data;\n\t\tthis.dataReady = true;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\n/**\n * Base class for all textures.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments EventDispatcher\n */\nclass Texture extends EventDispatcher {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The min filter value.\n\t * @param {number} [type=UnsignedByteType] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The min filter value.\n\t * @param {string} [colorSpace=NoColorSpace] - The min filter value.\n\t */\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture = true;\n\n\t\t/**\n\t\t * The ID of the texture.\n\t\t *\n\t\t * @name Texture#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The data definition of a texture. A reference to the data source can be\n\t\t * shared across textures. This is often useful in context of spritesheets\n\t\t * where multiple textures render the same data but with different texture\n\t\t * transformations.\n\t\t *\n\t\t * @type {Source}\n\t\t */\n\t\tthis.source = new Source( image );\n\n\t\t/**\n\t\t * An array holding user-defined mipmaps.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * How the texture is applied to the object. The value `UVMapping`\n\t\t * is the default, where texture or uv coordinates are used to apply the map.\n\t\t *\n\t\t * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}\n\t\t * @default UVMapping\n\t\t*/\n\t\tthis.mapping = mapping;\n\n\t\t/**\n\t\t * Lets you select the uv attribute to map the texture to. `0` for `uv`,\n\t\t * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.channel = 0;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *U* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapS = wrapS;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *V* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapT = wrapT;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearFilter\n\t\t */\n\t\tthis.magFilter = magFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearMipmapLinearFilter\n\t\t */\n\t\tthis.minFilter = minFilter;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the\n\t\t * highest density of texels. By default, this value is `1`. A higher value\n\t\t * gives a less blurry result than a basic mipmap, at the cost of more\n\t\t * texture samples being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * The format of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and\n\t\t * defines how the texture data is going to be stored on the GPU.\n\t\t *\n\t\t * This property allows to overwrite the default format.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.internalFormat = null;\n\n\t\t/**\n\t\t * The data type of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * How much a single repetition of the texture is offset from the beginning,\n\t\t * in each direction U and V. Typical range is `0.0` to `1.0`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.offset = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How many times the texture is repeated across the surface, in each\n\t\t * direction U and V. If repeat is set greater than `1` in either direction,\n\t\t * the corresponding wrap parameter should also be set to `RepeatWrapping`\n\t\t * or `MirroredRepeatWrapping` to achieve the desired tiling effect.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds\n\t\t * to the center of the texture. Default is `(0, 0)`, the lower left.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.center = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How much the texture is rotated around the center point, in radians.\n\t\t * Positive values are counter-clockwise.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Whether to update the texture's uv-transformation {@link Texture#matrix}\n\t\t * from the properties {@link Texture#offset}, {@link Texture#repeat},\n\t\t * {@link Texture#rotation}, and {@link Texture#center}.\n\t\t *\n\t\t * Set this to `false` if you are specifying the uv-transform matrix directly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * The uv-transformation matrix of the texture.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Set this to `false` if you are creating mipmaps manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * If set to `true`, the alpha channel, if present, is multiplied into the\n\t\t * color channels when the texture is uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure premultiply alpha on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure the flip on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),\n\t\t * `4` (word-alignment), and `8` (rows start on double-word boundaries).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t/**\n\t\t * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoColorSpace\n\t\t */\n\t\tthis.colorSpace = colorSpace;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the texture. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * A callback function, called when the texture is updated (e.g., when\n\t\t * {@link Texture#needsUpdate} has been set to true and then the texture is used).\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onUpdate = null;\n\n\t\t/**\n\t\t * An optional back reference to the textures render target.\n\t\t *\n\t\t * @type {?(RenderTarget|WebGLRenderTarget)}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * Indicates whether a texture belongs to a render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isRenderTargetTexture = false;\n\n\t\t/**\n\t\t * Indicates whether this texture should be processed by `PMREMGenerator` or not\n\t\t * (only relevant for render target textures).\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.pmremVersion = 0;\n\n\t}\n\n\t/**\n\t * The image object holding the texture data.\n\t *\n\t * @type {?Object}\n\t */\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\t/**\n\t * Updates the texture transformation matrix from the from the properties {@link Texture#offset},\n\t * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\t/**\n\t * Returns a new texture with copied values from this instance.\n\t *\n\t * @return {Texture} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given texture to this instance.\n\t *\n\t * @param {Texture} source - The texture to copy.\n\t * @return {Texture} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.renderTarget = source.renderTarget;\n\t\tthis.isRenderTargetTexture = source.isRenderTargetTexture;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the texture into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized texture.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the texture has been disposed of.\n\t\t *\n\t\t * @event Texture#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Transforms the given uv vector with the textures uv transformation matrix.\n\t *\n\t * @param {Vector2} uv - The uv vector.\n\t * @return {Vector2} The transformed uv vector.\n\t */\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the texture\n\t * must be updated in the next render. This triggers a texture upload\n\t * to the GPU and ensures correct texture parameter configuration.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the PMREM\n\t * must be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * The default image for all textures.\n *\n * @static\n * @type {?Image}\n * @default null\n */\nTexture.DEFAULT_IMAGE = null;\n\n/**\n * The default mapping for all textures.\n *\n * @static\n * @type {number}\n * @default UVMapping\n */\nTexture.DEFAULT_MAPPING = UVMapping;\n\n/**\n * The default anisotropy value for all textures.\n *\n * @static\n * @type {number}\n * @default 1\n */\nTexture.DEFAULT_ANISOTROPY = 1;\n\n/**\n * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers\n * (labeled x, y, z and w), which can be used to represent a number of things, such as:\n *\n * - A point in 4D space.\n * - A direction and length in 4D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)`\n * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`.\n * - Any arbitrary ordered quadruplet of numbers.\n *\n * There are other things a 4D vector can be used to represent, however these\n * are the most common uses in *three.js*.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector4( 0, 1, 0, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0, 1)\n * const b = new THREE.Vector4( );\n *\n * const d = a.dot( b );\n * ```\n */\nclass Vector4 {\n\n\t/**\n\t * Constructs a new 4D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t * @param {number} [w=1] - The w value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector4.prototype.isVector4 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * The w value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.w = w;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#z}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#w}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @param {number} w - The value of the w component.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's w component to the given value\n\t *\n\t * @param {number} w - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @param {number} value - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector to copy.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector4} v - The vector to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector4} v - The vector to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector4} v - The vector to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the quaternion's axis and w to the angle.\n\t *\n\t * @param {Quaternion} q - The Quaternion to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the axis of rotation and w to the angle.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is less than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector4} min - The minimum x, y and z values.\n\t * @param {Vector4} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y, z or w values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector4} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector4} v1 - The first vector.\n\t * @param {Vector4} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector4} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`,\n\t * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass RenderTarget extends EventDispatcher {\n\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.isRenderTarget = true;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: 1 };\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1\n\t\t}, options );\n\n\t\tconst texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );\n\n\t\ttexture.flipY = false;\n\t\ttexture.generateMipmaps = options.generateMipmaps;\n\t\ttexture.internalFormat = options.internalFormat;\n\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t}\n\n\t\tthis.depthBuffer = options.depthBuffer;\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis._depthTexture = null;\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\tthis.samples = options.samples;\n\n\t}\n\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tset depthTexture( current ) {\n\n\t\tif ( this._depthTexture !== null ) this._depthTexture.renderTarget = null;\n\t\tif ( current !== null ) current.renderTarget = this;\n\n\t\tthis._depthTexture = current;\n\n\t}\n\n\tget depthTexture() {\n\n\t\treturn this._depthTexture;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t\t// ensure image object is not shared, see #20328\n\n\t\t\tconst image = Object.assign( {}, source.textures[ i ].image );\n\t\t\tthis.textures[ i ].source = new Source( image );\n\n\t\t}\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nclass WebGLRenderTarget extends RenderTarget {\n\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\nclass DataArrayTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.isDataArrayTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass Data3DTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in Data3DTexture directly.\n\t\t//\n\t\t//\tconst texture = new THREE.Data3DTexture( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.isData3DTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n *\n * Note that three.js expects Quaternions to be normalized.\n * ```js\n * const quaternion = new THREE.Quaternion();\n * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 );\n *\n * const vector = new THREE.Vector3( 1, 0, 0 );\n * vector.applyQuaternion( quaternion );\n * ```\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t *\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : -1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @return {Array} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}.\n\t */\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t *\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t *\n\t * @return {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t *\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t *\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t *\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\t/**\n\t * Rotates this quaternion by a given angular step to the given quaternion.\n\t * The method ensures that the final quaternion will not overshoot `q`.\n\t *\n\t * @param {Quaternion} q - The target quaternion.\n\t * @param {number} step - The angular step in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\t/**\n\t * Inverts this quaternion via {@link Quaternion#conjugate}. The\n\t * quaternion is assumed to have unit length.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tinvert() {\n\n\t\treturn this.conjugate();\n\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t *\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t *\n\t * @return {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t *\n\t * @return {number} The Euclidean length.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t *\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t *\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t *\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\t/**\n\t * Sets this quaternion to a uniformly random, normalized quaternion.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trandom() {\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @return {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t *\n\t * @param {Array} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The quaternion components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this quaternion from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the\n\t * numerical elements of this quaternion in an array of format `[x, y, z, w]`.\n\t *\n\t * @return {Array} The serialized quaternion.\n\t */\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\n/**\n * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers\n * (labeled x, y and z), which can be used to represent a number of things, such as:\n *\n * - A point in 3D space.\n * - A direction and length in 3D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)`\n * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`.\n * - Any arbitrary ordered triplet of numbers.\n *\n * There are other things a 3D vector can be used to represent, such as\n * momentum vectors and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y, z)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector3( 0, 1, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0)\n * const b = new THREE.Vector3( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector3.prototype.isVector3 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @param {number} value - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to copy.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector3} v - The vector to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Euler rotation to this vector.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\t/**\n\t * Applies a rotation specified by an axis and an angle to this vector.\n\t *\n\t * @param {Vector3} axis - A normalized vector representing the rotation axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector by the given normal matrix and normalizes\n\t * the result.\n\t *\n\t * @param {Matrix3} m - The normal matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector3} v - The vector to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the max vector's x, y or z\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y or z value is less than the min vector's x, y or z value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector3} min - The minimum x, y and z values.\n\t * @param {Vector3} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y or z values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @return {Vector3} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector onto the given one.\n\t *\n\t * @param {Vector3} v - The vector to project to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\t/**\n\t * Projects this vector onto a plane by subtracting this\n\t * vector projected onto the plane's normal from this vector.\n\t *\n\t * @param {Vector3} planeNormal - The plane normal.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t *\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\treflect( normal ) {\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The phi angle in radians.\n\t * @param {number} theta - The theta angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {Cylindrical} c - The cylindrical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle in radians.\n\t * @param {number} y - The y value.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given Euler angles.\n\t *\n\t * @param {Euler} e - The Euler angles to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the RGB components of the\n\t * given color.\n\t *\n\t * @param {Color} c - The color to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this vector to a uniformly random point on a unit sphere.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox3 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} min - The lower boundary of the box.\n\t * @param {Vector3} max - The upper boundary of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} array - An array holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 3D position data as instances of {@link Vector3}.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector3} center - The center of the box.\n\t * @param {Vector3} size - The x, y and z dimensions of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the world-axis-aligned bounding box for the given 3D object\n\t * (including its children), accounting for the object's, and children's,\n\t * world transforms. The function may result in a larger box than strictly necessary.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the bounding box for.\n\t * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest\n\t * world-axis-aligned bounding box at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box3} box - The box to copy.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector3} point - The point that should be included by the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions. The depth of this box will be\n\t * expanded by the z component of the vector in both directions.\n\t *\n\t * @param {Vector3} vector - The vector that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given 3D object and\n\t * its children, accounting for the object's, and children's, world\n\t * transforms. The function may result in a larger box than strictly\n\t * necessary (unless the precise parameter is set to true).\n\t *\n\t * @param {Object3D} object - The 3D object that should expand the bounding box.\n\t * @param {boolean} precise - If set to `true`, the method expands the bounding box\n\t * as little as necessary at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width, height and depth.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A point as a proportion of this box's width, height and depth.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with this bounding box.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with this bounding box.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects with this bounding box.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether the given plane intersects with this bounding box.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given triangle intersects with this bounding box.\n\t *\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {boolean} Whether the given triangle intersects with this bounding box.\n\t */\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector3} point - The point to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Returns a bounding sphere that encloses this bounding box.\n\t *\n\t * @param {Sphere} target - The target sphere that is used to store the method's result.\n\t * @return {Sphere} The bounding sphere that encloses this bounding box.\n\t */\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box3} box - The bounding box to intersect with.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box3} box - The bounding box that will be unioned with this instance.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this bounding box by the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box3} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical 3D sphere defined by a center and radius. This class is mainly\n * used as a Bounding Sphere for 3D objects.\n */\nclass Sphere {\n\n\t/**\n\t * Constructs a new sphere.\n\t *\n\t * @param {Vector3} [center=(0,0,0)] - The center of the sphere\n\t * @param {number} [radius=-1] - The radius of the sphere.\n\t */\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphere = true;\n\n\t\t/**\n\t\t * The center of the sphere\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * The radius of the sphere.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Sets the sphere's components by copying the given values.\n\t *\n\t * @param {Vector3} center - The center.\n\t * @param {number} radius - The radius.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for list of points.\n\t * If the optional center point is given, it is used as the sphere's\n\t * center. Otherwise, the center of the axis-aligned bounding box\n\t * encompassing the points is calculated.\n\t *\n\t * @param {Array} points - A list of points in 3D space.\n\t * @param {Vector3} [optionalCenter] - The center of the sphere.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given sphere to this instance.\n\t *\n\t * @param {Sphere} sphere - The sphere to copy.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sphere is empty (the radius set to a negative number).\n\t *\n\t * Spheres with a radius of `0` contain only their center point and are not\n\t * considered to be empty.\n\t *\n\t * @return {boolean} Whether this sphere is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\t/**\n\t * Makes this sphere empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere contains the given point inclusive of\n\t * the surface of the sphere.\n\t *\n\t * @param {Vector3} point - The point to check.\n\t * @return {boolean} Whether this sphere contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the\n\t * given point. If the sphere contains the point, the distance will\n\t * be negative.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance to the point.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @return {boolean} Whether this sphere intersects with the given one or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to test.\n\t * @return {boolean} Whether this sphere intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether this sphere intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\t/**\n\t * Clamps a point within the sphere. If the point is outside the sphere, it\n\t * will clamp it to the closest point on the edge of the sphere. Points\n\t * already inside the sphere will not be affected.\n\t *\n\t * @param {Vector3} point - The plane to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a bounding box that encloses this sphere.\n\t *\n\t * @param {Box3} target - The target box that is used to store the method's result.\n\t * @return {Box3} The bounding box that encloses this sphere.\n\t */\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Transforms this sphere with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the sphere's center by the given offset.\n\t *\n\t * @param {Vector3} offset - The offset.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include the given point.\n\t *\n\t * @param {Vector3} point - The point to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere is equal with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test for equality.\n\t * @return {boolean} Whether this bounding sphere is equal with the given one.\n\t */\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\t/**\n\t * Returns a new sphere with copied values from this instance.\n\t *\n\t * @return {Sphere} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. The class is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t *\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\t/**\n\t\t * The origin of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t *\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t *\n\t * @param {Ray} ray - The ray to copy.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t *\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A position on the ray.\n\t */\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\t/**\n\t * Adjusts the direction of the ray to point at the given vector in world space.\n\t *\n\t * @param {Vector3} v - The target position.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t *\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @return {Ray} A reference to this ray.\n\t */\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\t/**\n\t * Returns the squared distance between this ray and the given line segment.\n\t *\n\t * @param {Vector3} v0 - The start point of the line segment.\n\t * @param {Vector3} v1 - The end point of the line segment.\n\t * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment.\n\t * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @return {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t *\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @return {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @return {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t *\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @return {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t *\n\t * @return {Ray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 4x4 matrix.\n *\n * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix.\n * For an introduction to transformation matrices as used in WebGL, check out [this tutorial]{@link https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices}\n *\n * This allows a 3D vector representing a point in 3D space to undergo\n * transformations such as translation, rotation, shear, scale, reflection,\n * orthogonal or perspective projection and so on, by being multiplied by the\n * matrix. This is known as `applying` the matrix to the vector.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major]{@link https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order}\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix4();\n * m.set( 11, 12, 13, 14,\n * 21, 22, 23, 24,\n * 31, 32, 33, 34,\n * 41, 42, 43, 44 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31, 41,\n * 12, 22, 32, 42,\n * 13, 23, 33, 43,\n * 14, 24, 34, 44 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the translation component of the given matrix\n\t * into this matrix's translation component.\n\t *\n\t * @param {Matrix4} m - The matrix to copy the translation component.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractRotation( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page]{@link https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix}\n\t * for a complete list.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by\n\t * the given Quaternion as outlined [here]{@link https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion}\n\t * The rest of the matrix is set to the identity.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\t/**\n\t * Sets the rotation component of the transformation matrix, looking from `eye` towards\n\t * `target`, and oriented by the up-direction.\n\t *\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * Based on the method outlined [here]{@link http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html}.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t *\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}.\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the columns of this matrix by the given vector.\n\t *\n\t * @param {Vector3} v - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t *\n\t * @return {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t *\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the X axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Y axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Z axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t *\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here]{@link https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199}.\n\t *\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a shear transformation.\n\t *\n\t * @param {number} xy - The amount to shear X by Y.\n\t * @param {number} xz - The amount to shear X by Z.\n\t * @param {number} yx - The amount to shear Y by X.\n\t * @param {number} yz - The amount to shear Y by Z.\n\t * @param {number} zx - The amount to shear Z by X.\n\t * @param {number} zy - The amount to shear Z by Y.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t *\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a perspective projection matrix. This is used internally by\n\t * {@link PerspectiveCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tc = - far / ( far - near );\n\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a orthographic projection matrix. This is used internally by\n\t * {@link OrthographicCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\n\t\tlet z, zInv;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tz = ( far + near ) * p;\n\t\t\tzInv = -2 * p;\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tz = near * p;\n\t\t\tzInv = -1 * p;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0; \t\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = zInv;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\n/**\n * A class representing Euler angles.\n *\n * Euler angles describe a rotational transformation by rotating an object on\n * its various axes in specified amounts per axis, and a specified axis\n * order.\n *\n * Iterating through an instance will yield its components (x, y, z,\n * order) in the corresponding order.\n *\n * ```js\n * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );\n * const b = new THREE.Vector3( 1, 0, 1 );\n * b.applyEuler(a);\n * ```\n */\nclass Euler {\n\n\t/**\n\t * Constructs a new euler instance.\n\t *\n\t * @param {number} [x=0] - The angle of the x axis in radians.\n\t * @param {number} [y=0] - The angle of the y axis in radians.\n\t * @param {number} [z=0] - The angle of the z axis in radians.\n\t * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\t/**\n\t * The angle of the x axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the y axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the z axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * A string representing the order that the rotations are applied.\n\t *\n\t * @type {string}\n\t * @default 'XYZ'\n\t */\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the Euler components.\n\t *\n\t * @param {number} x - The angle of the x axis in radians.\n\t * @param {number} y - The angle of the y axis in radians.\n\t * @param {number} z - The angle of the z axis in radians.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new Euler instance with copied values from this instance.\n\t *\n\t * @return {Euler} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\t/**\n\t * Copies the values of the given Euler instance to this instance.\n\t *\n\t * @param {Euler} euler - The Euler instance to copy.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a pure rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a normalized quaternion.\n\t *\n\t * @param {Quaternion} q - A normalized Quaternion.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from the given vector.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\t/**\n\t * Resets the euler angle with a new order by creating a quaternion from this\n\t * euler angle and then setting this euler angle with the quaternion and the\n\t * new order.\n\t *\n\t * Warning: This discards revolution information.\n\t *\n\t * @param {string} [newOrder] - A string representing the new order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\treorder( newOrder ) {\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\t/**\n\t * Returns `true` if this Euler instance is equal with the given one.\n\t *\n\t * @param {Euler} euler - The Euler instance to test for equality.\n\t * @return {boolean} Whether this Euler instance is equal with the given one.\n\t */\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\t/**\n\t * Sets this Euler instance's components to values from the given array. The first three\n\t * entries of the array are assign to the x,y and z components. An optional fourth entry\n\t * defines the Euler order.\n\t *\n\t * @param {Array} array - An array holding the Euler component values.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this Euler instance to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the Euler components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The Euler components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\n/**\n * The default Euler angle order.\n *\n * @static\n * @type {string}\n * @default 'XYZ'\n */\nEuler.DEFAULT_ORDER = 'XYZ';\n\nclass Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\n/**\n * Fires when the object has been added to its parent object.\n *\n * @event Object3D#added\n * @type {Object}\n */\nconst _addedEvent = { type: 'added' };\n\n/**\n * Fires when the object has been removed from its parent object.\n *\n * @event Object3D#removed\n * @type {Object}\n */\nconst _removedEvent = { type: 'removed' };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childadded\n * @type {Object}\n */\nconst _childaddedEvent = { type: 'childadded', child: null };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childremoved\n * @type {Object}\n */\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\n/**\n * This is the base class for most objects in three.js and provides a set of\n * properties and methods for manipulating objects in 3D space.\n *\n * @augments EventDispatcher\n */\nclass Object3D extends EventDispatcher {\n\n\t/**\n\t * Constructs a new 3D object.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isObject3D = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name Object3D#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Object3D';\n\n\t\t/**\n\t\t * A reference to the parent object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * An array holding the child 3D objects of this instance.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * Defines the `up` direction of the 3D object which influences\n\t\t * the orientation via methods like {@link Object3D#lookAt}.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * Represents the object's local position.\n\t\t\t *\n\t\t\t * @name Object3D#position\n\t\t\t * @type {Vector3}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Euler angles, in radians.\n\t\t\t *\n\t\t\t * @name Object3D#rotation\n\t\t\t * @type {Euler}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Quaternions.\n\t\t\t *\n\t\t\t * @name Object3D#quaternion\n\t\t\t * @type {Quaternion}\n\t\t\t */\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local scale.\n\t\t\t *\n\t\t\t * @name Object3D#scale\n\t\t\t * @type {Vector3}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's model-view matrix.\n\t\t\t *\n\t\t\t * @name Object3D#modelViewMatrix\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's normal matrix.\n\t\t\t *\n\t\t\t * @name Object3D#normalMatrix\n\t\t\t * @type {Matrix3}\n\t\t\t */\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in local space.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in world space.\n\t\t * If the 3D object has no parent, then it's identical to the local transformation matrix\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the local matrix from position,\n\t\t * rotation and scale every frame.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the world matrix from the current local\n\t\t * matrix and the object's transformation hierarchy.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\t/**\n\t\t * When set to `true`, it calculates the world matrix in that frame and resets this property\n\t\t * to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t/**\n\t\t * The layer membership of the 3D object. The 3D object is only visible if it has\n\t\t * at least one layer in common with the camera in use. This property can also be\n\t\t * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered into shadow maps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is affected by shadows in the scene.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is honored by view frustum culling.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be\n\t\t * overridden although opaque and transparent objects remain sorted independently.\n\t\t * When this property is set for an instance of {@link Group},all descendants\n\t\t * objects will be sorted and rendered together. Sorting is from lowest to highest\n\t\t * render order.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * An array holding the animation clips of the 3D object.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.animations = [];\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the 3D object. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * Applies the given transformation matrix to the object and updates the object's position,\n\t * rotation and scale.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\t/**\n\t * Applies a rotation represented by given the quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as an axis/angle couple to the 3D object.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t */\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as Euler angles to the 3D object.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t */\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as rotation matrix to the 3D object.\n\t *\n\t * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be\n\t * a pure rotation matrix (i.e, unscaled).\n\t */\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as a Quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The Quaternion\n\t */\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in world space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its X axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Y axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Z axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along the given axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its X-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Y-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Z-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's local space to world space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's word space to local space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\t/**\n\t * Rotates the object to face a point in world space.\n\t *\n\t * This method does not support objects having non-uniformly-scaled parent(s).\n\t *\n\t * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space\n\t * @param {number} [y] - The y coordinate in world space.\n\t * @param {number} [z] - The z coordinate in world space.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child to this 3D object. An arbitrary number of\n\t * objects may be added. Any current parent on an object passed in here will be\n\t * removed, since an object can have at most one parent.\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to add.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given 3D object as child from this 3D object.\n\t * An arbitrary number of objects may be removed.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @param {Object3D} object - The 3D object to remove.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes this 3D object from its current parent.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all child objects.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child of this 3D object, while maintaining the object's world\n\t * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to attach.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching ID.\n\t *\n\t * @param {number} id - The id.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching name.\n\t *\n\t * @param {string} name - The name.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns all 3D objects with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @param {Array} result - The method stores the result in this array.\n\t * @return {Array} The found 3D objects.\n\t */\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the position of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's position in world space.\n\t */\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Returns a Quaternion representing the position of the 3D object in world space.\n\t *\n\t * @param {Quaternion} target - The target Quaternion the result is stored to.\n\t * @return {Quaternion} The 3D object's rotation in world space.\n\t */\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the scale of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's scale in world space.\n\t */\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\t/**\n\t * Abstract method to get intersections between a casted ray and this\n\t * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}\n\t * implement this method in order to use raycasting.\n\t *\n\t * @abstract\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - An array holding the result of the method.\n\t */\n\traycast( /* raycaster, intersects */ ) {}\n\n\t/**\n\t * Executes the callback on this 3D object and all descendants.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects.\n\t * Descendants of invisible 3D objects are not traversed.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in local space by computing it from the current\n\t * position, rotation and scale values.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in world space of this 3D objects and its descendants.\n\t *\n\t * To ensure correct results, this method also recomputes the 3D object's transformation matrix in\n\t * local space. The computation of the local and world matrix can be controlled with the\n\t * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both\n\t * `true` by default. Set these flags to `false` if you need more control over the update matrix process.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the\n\t * update of ancestor and descendant nodes.\n\t *\n\t * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.\n\t * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.\n\t */\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the 3D object into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized 3D object.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.visibility = this._visibility;\n\t\t\tobject.active = this._active;\n\t\t\tobject.bounds = this._bounds.map( bound => ( {\n\t\t\t\tboxInitialized: bound.boxInitialized,\n\t\t\t\tboxMin: bound.box.min.toArray(),\n\t\t\t\tboxMax: bound.box.max.toArray(),\n\n\t\t\t\tsphereInitialized: bound.sphereInitialized,\n\t\t\t\tsphereRadius: bound.sphere.radius,\n\t\t\t\tsphereCenter: bound.sphere.center.toArray()\n\t\t\t} ) );\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) object.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = {\n\t\t\t\t\tcenter: object.boundingSphere.center.toArray(),\n\t\t\t\t\tradius: object.boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = {\n\t\t\t\t\tmin: object.boundingBox.min.toArray(),\n\t\t\t\t\tmax: object.boundingBox.max.toArray()\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new 3D object with copied values from this instance.\n\t *\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.\n\t * @return {Object3D} A clone of this instance.\n\t */\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\t/**\n\t * Copies the values of the given 3D object to this instance.\n\t *\n\t * @param {Object3D} source - The 3D object to copy.\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The default up direction for objects, also used as the default\n * position for {@link DirectionalLight} and {@link HemisphereLight}.\n *\n * @static\n * @type {Vector3}\n * @default (0,1,0)\n */\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\n\n/**\n * The default setting for {@link Object3D#matrixAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\n\n/**\n * The default setting for {@link Object3D#matrixWorldAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nconst _v40 = /*@__PURE__*/ new Vector4();\nconst _v41 = /*@__PURE__*/ new Vector4();\nconst _v42 = /*@__PURE__*/ new Vector4();\n\n/**\n * A geometric triangle as defined by three vectors representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * Constructs a new triangle.\n\t *\n\t * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle.\n\t * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle.\n\t * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle.\n\t */\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\t/**\n\t\t * The first corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.a = a;\n\n\t\t/**\n\t\t * The second corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The third corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.c = c;\n\n\t}\n\n\t/**\n\t * Computes the normal vector of a triangle.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} p1 - The first corner of the triangle.\n\t * @param {Vector3} p2 - The second corner of the triangle.\n\t * @param {Vector3} p3 - The third corner of the triangle.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given attribute and indices.\n\t *\n\t * @param {BufferAttribute} attr - The attribute to interpolate.\n\t * @param {number} i1 - Index of first vertex.\n\t * @param {number} i2 - Index of second vertex.\n\t * @param {number} i3 - Index of third vertex.\n\t * @param {Vector3} barycoord - The barycoordinate value to use to interpolate.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The interpolated attribute value.\n\t */\n\tstatic getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) {\n\n\t\t_v40.setScalar( 0 );\n\t\t_v41.setScalar( 0 );\n\t\t_v42.setScalar( 0 );\n\n\t\t_v40.fromBufferAttribute( attr, i1 );\n\t\t_v41.fromBufferAttribute( attr, i2 );\n\t\t_v42.fromBufferAttribute( attr, i3 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( _v40, barycoord.x );\n\t\ttarget.addScaledVector( _v41, barycoord.y );\n\t\ttarget.addScaledVector( _v42, barycoord.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given values.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given array values.\n\t *\n\t * @param {Array} points - An array with 3D points.\n\t * @param {number} i0 - The array index representing the first corner of the triangle.\n\t * @param {number} i1 - The array index representing the second corner of the triangle.\n\t * @param {number} i2 - The array index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given attribute values.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute with 3D points data.\n\t * @param {number} i0 - The attribute index representing the first corner of the triangle.\n\t * @param {number} i1 - The attribute index representing the second corner of the triangle.\n\t * @param {number} i2 - The attribute index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new triangle with copied values from this instance.\n\t *\n\t * @return {Triangle} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given triangle to this instance.\n\t *\n\t * @param {Triangle} triangle - The triangle to copy.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the area of the triangle.\n\t *\n\t * @return {number} The triangle's area.\n\t */\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\t/**\n\t * Computes the midpoint of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's midpoint.\n\t */\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\t/**\n\t * Computes the normal of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes a plane the triangle lies within.\n\t *\n\t * @param {Plane} target - The target vector that is used to store the method's result.\n\t * @return {Plane} The plane the triangle lies within.\n\t */\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this triangle intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\t/**\n\t * Returns the closest point on the triangle to the given point.\n\t *\n\t * @param {Vector3} p - The point to compute the closest point for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the triangle.\n\t */\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle is equal with the given one.\n\t *\n\t * @param {Triangle} triangle - The triangle to test for equality.\n\t * @return {boolean} Whether this triangle is equal with the given one.\n\t */\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\n/**\n * A Color instance is represented by RGB components in the linear working\n * color space, which defaults to `LinearSRGBColorSpace`. Inputs\n * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS\n * strings) are converted to the working color space automatically.\n *\n * ```js\n * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setHex( 0x112233 );\n * ```\n * Source color spaces may be specified explicitly, to ensure correct conversions.\n * ```js\n * // assumed already LinearSRGBColorSpace; no conversion\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );\n *\n * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );\n * ```\n * If THREE.ColorManagement is disabled, no conversions occur. For details,\n * see Color management. Iterating through a Color instance will yield\n * its components (r, g, b) in the corresponding order. A Color can be initialised\n * in any of the following ways:\n * ```js\n * //empty constructor - will default white\n * const color1 = new THREE.Color();\n *\n * //Hexadecimal color (recommended)\n * const color2 = new THREE.Color( 0xff0000 );\n *\n * //RGB string\n * const color3 = new THREE.Color(\"rgb(255, 0, 0)\");\n * const color4 = new THREE.Color(\"rgb(100%, 0%, 0%)\");\n *\n * //X11 color name - all 140 color names are supported.\n * //Note the lack of CamelCase in the name\n * const color5 = new THREE.Color( 'skyblue' );\n * //HSL string\n * const color6 = new THREE.Color(\"hsl(0, 100%, 50%)\");\n *\n * //Separate RGB values between 0 and 1\n * const color7 = new THREE.Color( 1, 0, 0 );\n * ```\n */\nclass Color {\n\n\t/**\n\t * Constructs a new color.\n\t *\n\t * Note that standard method of specifying color in three.js is with a hexadecimal triplet,\n\t * and that method is used throughout the rest of the documentation.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor( r, g, b ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColor = true;\n\n\t\t/**\n\t\t * The red component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.r = 1;\n\n\t\t/**\n\t\t * The green component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.g = 1;\n\n\t\t/**\n\t\t * The blue component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Sets the colors's components from the given values.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t * @return {Color} A reference to this color.\n\t */\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the colors's components to the given scalar value.\n\t *\n\t * @param {number} scalar - The scalar value.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t *\n\t * @param {number} hex - The hexadecimal value.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} r - Red channel value between `0.0` and `1.0`.\n\t * @param {number} g - Green channel value between `0.0` and `1.0`.\n\t * @param {number} b - Blue channel value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,\n\t * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or\n\t * any [X11 color name]{@link https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart} -\n\t * all 140 color names are supported).\n\t *\n\t * @param {string} style - Color as a CSS-style string.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a color name. Faster than {@link Color#setStyle} if\n\t * you don't need the other CSS-style formats.\n\t *\n\t * For convenience, the list of names is exposed in `Color.NAMES` as a hash.\n\t * ```js\n\t * Color.NAMES.aliceblue // returns 0xF0F8FF\n\t * ```\n\t *\n\t * @param {string} style - The color name.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t *\n\t * @return {Color} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t *\n\t * @param {Color} color - The color to copy.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {number} The hexadecimal value.\n\t */\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The hexadecimal value as a string.\n\t */\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\t/**\n\t * Converts the colors RGB values into the HSL format and stores them into the\n\t * given target object.\n\t *\n\t * @param {{h:0,s:0,l:0}} target - The target object that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {{h:number,s:number,l:number}} The HSL representation of this color.\n\t */\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the RGB values of this color and stores them into the given target object.\n\t *\n\t * @param {Color} target - The target color that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} The RGB representation of this color.\n\t */\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The CSS representation of this color.\n\t */\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\t/**\n\t * Adds the given HSL values to this color's values.\n\t * Internally, this converts the color's RGB values to HSL, adds HSL\n\t * and then converts the color back to RGB.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @return {Color} A reference to this color.\n\t */\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given color to the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to add.\n\t * @return {Color} A reference to this color.\n\t */\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given colors and stores the result in this instance.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @return {Color} A reference to this color.\n\t */\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Color} A reference to this color.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the RGB values of the given color from the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to subtract.\n\t * @return {Color} A reference to this color.\n\t */\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the RGB values of the given color with the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where `0.0` is this color and `1.0` is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where `0.0`\n\t * is the first and `1.0` is the second color.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's HSL values toward the HSL values of the\n\t * given color. It differs from {@link Color#lerp} by not interpolating straight\n\t * from one color to the other, but instead going through all the hues in between\n\t * those two colors. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the color's RGB components from the given 3D vector.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this color with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix.\n\t * @return {Color} A reference to this color.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this color is equal with the given one.\n\t *\n\t * @param {Color} c - The color to test for equality.\n\t * @return {boolean} Whether this bounding color is equal with the given one.\n\t */\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t *\n\t * @param {Array} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The color components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this color from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding color data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the color\n\t * as a hexadecimal value.\n\t *\n\t * @return {number} The hexadecimal value.\n\t */\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\n/**\n * A dictionary with X11 color names.\n *\n * Note that multiple words such as Dark Orange become the string 'darkorange'.\n *\n * @static\n * @type {Object}\n */\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\t/**\n\t * Constructs a new material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterial = true;\n\n\t\t/**\n\t\t * The ID of the material.\n\t\t *\n\t\t * @name Material#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Material';\n\n\t\t/**\n\t\t * Defines the blending type of the material.\n\t\t *\n\t\t * It must be set to `CustomBlending` if custom blending properties like\n\t\t * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation}\n\t\t * should have any effect.\n\t\t *\n\t\t * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)}\n\t\t * @default NormalBlending\n\t\t */\n\t\tthis.blending = NormalBlending;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or both.\n\t\t *\n\t\t * @type {(FrontSide|BackSide|DoubleSide)}\n\t\t * @default FrontSide\n\t\t */\n\t\tthis.side = FrontSide;\n\n\t\t/**\n\t\t * If set to `true`, vertex colors should be used.\n\t\t *\n\t\t * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or\n\t\t * four (RGBA) component color buffer attribute is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexColors = false;\n\n\t\t/**\n\t\t * Defines how transparent the material is.\n\t\t * A value of `0.0` indicates fully transparent, `1.0` is fully opaque.\n\t\t *\n\t\t * If the {@link Material#transparent} is not set to `true`,\n\t\t * the material will remain fully opaque and this value will only affect its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * Defines whether this material is transparent. This has an effect on\n\t\t * rendering as transparent objects need special treatment and are rendered\n\t\t * after non-transparent objects.\n\t\t *\n\t\t * When set to true, the extent to which the material is transparent is\n\t\t * controlled by {@link Material#opacity}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or\n\t\t * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than\n\t\t * a random threshold. Randomization introduces some grain or noise, but approximates alpha\n\t\t * blending without the associated problems of sorting. Using TAA can reduce the resulting noise.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaHash = false;\n\n\t\t/**\n\t\t * Defines the blending source factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default SrcAlphaFactor\n\t\t */\n\t\tthis.blendSrc = SrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending destination factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending equation.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendEquation = AddEquation;\n\n\t\t/**\n\t\t * Defines the blending source alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending destination alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending equation of the alpha channel.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Represents the RGB values of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Represents the alpha value of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blendAlpha = 0;\n\n\t\t/**\n\t\t * Defines the depth function.\n\t\t *\n\t\t * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)}\n\t\t * @default LessEqualDepth\n\t\t */\n\t\tthis.depthFunc = LessEqualDepth;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * When the depth test is disabled, the depth write will also be implicitly disabled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t *\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in\n\t\t * order to layer several things together without creating z-index artifacts.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t *\n\t\t * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc}\n\t\t * @default AlwaysStencilFunc\n\t\t */\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns `false`.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` but the depth test fails.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` and the depth test passes.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZPass = KeepStencilOp;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer. In\n\t\t * order to perform writes or comparisons against the stencil buffer this\n\t\t * value must be `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilWrite = false;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as THREE.Plane objects in world\n\t\t * space. These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped\n\t\t * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to\n\t\t * be `true`.\n\t\t *\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Changes the behavior of clipping planes so that only their intersection is\n\t\t * clipped, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Defines whether to clip shadows according to the clipping planes specified\n\t\t * on this material.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t\t/**\n\t\t * Defines which side of faces cast shadows. If `null`, the side casting shadows\n\t\t * is determined as follows:\n\t\t *\n\t\t * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows.\n\t\t * - When {@link Material#side} is set to `BackSide`, the front side cast shadows.\n\t\t * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows.\n\t\t *\n\t\t * @type {?(FrontSide|BackSide|DoubleSide)}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowSide = null;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t *\n\t\t * This can be used in conjunction with {@link Object3D#renderOder} to create invisible\n\t\t * objects that occlude other objects.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t *\n\t\t * @type {?('highp'|'mediump'|'lowp')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * Whether to use polygon offset or not. When enabled, each fragment's depth value will\n\t\t * be offset after it is interpolated from the depth values of the appropriate vertices.\n\t\t * The offset is added before the depth test is performed and before the value is written\n\t\t * into the depth buffer.\n\t\t *\n\t\t * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for\n\t\t * rendering solids with highlighted edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Specifies a scale factor that is used to create a variable depth offset for each polygon.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Is multiplied by an implementation-specific value to create a constant depth offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts\n\t\t * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this\n\t\t * will smooth aliasing on clip plane edges and alphaTest-clipped edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Whether double-sided, transparent objects should be rendered with a single pass or not.\n\t\t *\n\t\t * The engine renders double-sided, transparent objects with two draw calls (back faces first,\n\t\t * then front faces) to mitigate transparency artifacts. There are scenarios however where this\n\t\t * approach produces no quality gains but still doubles draw calls e.g. when rendering flat\n\t\t * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to\n\t\t * disable the two pass rendering to avoid performance issues.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceSinglePass = false;\n\n\t\t/**\n\t\t * Defines whether 3D objects using this material are visible.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * Defines whether this material is tone mapped according to the renderer's tone mapping setting.\n\t\t *\n\t\t * It is ignored when rendering to a render target or using post processing or when using\n\t\t * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.toneMapped = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the Material. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\t/**\n\t * Sets the alpha value to be used when running an alpha test. The material\n\t * will not be rendered if the opacity is lower than this value.\n\t *\n\t * @type {number}\n\t * @readonly\n\t * @default 0\n\t */\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the material is used to render a 3D object.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\t/**\n\t * An optional callback that is executed immediately before the shader\n\t * program is compiled. This function is called with the shader source code\n\t * as a parameter. Useful for the modification of built-in materials.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}. The\n\t * recommended approach when customizing materials is to use `WebGPURenderer` with the new\n\t * Node Material system and [TSL]{@link https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language}.\n\t *\n\t * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source.\n\t * @param {WebGLRenderer} renderer - A reference to the renderer.\n\t */\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\t/**\n\t * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify\n\t * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached\n\t * shader or recompile the shader for this material as needed.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @return {string} The custom program cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( `THREE.Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( `THREE.Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the material into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized material.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new material with copied values from this instance.\n\t *\n\t * @return {Material} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given material to this instance.\n\t *\n\t * @param {Material} source - The material to copy.\n\t * @return {Material} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Material#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the material has been disposed of.\n\t\t *\n\t\t * @event Material#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the material\n\t * needs to be recompiled.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {\n\n\t\tconsole.warn( 'Material: onBuild() has been removed.' ); // @deprecated, r166\n\n\t}\n\n}\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n/**\n * Returns a half precision floating point value (FP16) from the given single\n * precision floating point value (FP32).\n *\n * @param {number} val - A single precision floating point value.\n * @return {number} The FP16 value.\n */\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n/**\n * Returns a single precision floating point value (FP32) from the given half\n * precision floating point value (FP16).\n *\n * @param {number} val - A half precision floating point value.\n * @return {number} The FP32 value.\n */\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\n/**\n * A class containing utility functions for data.\n *\n * @hideconstructor\n */\nclass DataUtils {\n\n\t/**\n\t * Returns a half precision floating point value (FP16) from the given single\n\t * precision floating point value (FP32).\n\t *\n\t * @param {number} val - A single precision floating point value.\n\t * @return {number} The FP16 value.\n\t */\n\tstatic toHalfFloat( val ) {\n\n\t\treturn toHalfFloat( val );\n\n\t}\n\n\t/**\n\t * Returns a single precision floating point value (FP32) from the given half\n\t * precision floating point value (FP16).\n\t *\n\t * @param {number} val - A half precision floating point value.\n\t * @return {number} The FP32 value.\n\t */\n\tstatic fromHalfFloat( val ) {\n\n\t\treturn fromHalfFloat( val );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nlet _id$2 = 0;\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.isBufferAttribute = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRanges = [];\n\t\tthis.gpuType = FloatType;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBufferGeometry = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.indirect = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetIndirect( indirect ) {\n\n\t\tthis.indirect = indirect;\n\n\t\treturn this;\n\n\t}\n\n\tgetIndirect() {\n\n\t\treturn this.indirect;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute === undefined ) {\n\n\t\t\tconst position = [];\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\t} else {\n\n\t\t\tconst l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tpositionAttribute.setXYZ( i, point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tif ( points.length > positionAttribute.count ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' );\n\n\t\t\t}\n\n\t\t\tpositionAttribute.needsUpdate = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * Constructs a new mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\t/**\n\t\t * The mesh geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The mesh material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default MeshBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the local-space position of the vertex at the given index, taking into\n\t * account the current animation state of both morph targets and skinning.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * @return {Vector3} The vertex position in local space.\n\t */\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\tintersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\tintersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\tintersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.barycoord = barycoord;\n\n\t}\n\n\treturn intersection;\n\n}\n\n/**\n * A geometry class for a rectangular cuboid with a given width, height, and depth.\n * On creation, the cuboid is centred on the origin, with each edge parallel to one\n * of the axes.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BufferGeometry\n */\nclass BoxGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {BoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\tconsole.warn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\t\tthis.uniformsGroups = [];\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.forceSinglePass = true;\n\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Abstract base class for cameras. This class should always be inherited\n * when you build a new camera.\n *\n * @abstract\n * @augments Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Constructs a new camera.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\t/**\n\t\t * The inverse of the camera's world matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\t/**\n\t\t * The camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The inverse of the camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The coordinate system in which the camera is used.\n\t\t *\n\t\t * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * This method is overwritten since cameras have a different forward vector compared to other\n\t * 3D objects. A camera looks down its local, negative z-axis by default.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n/**\n * Camera that uses [perspective projection]{@link https://en.wikipedia.org/wiki/Perspective_(graphical)}.\n *\n * This projection mode is designed to mimic the way the human eye sees. It\n * is the most common projection mode used for rendering a 3D scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass PerspectiveCamera extends Camera {\n\n\t/**\n\t * Constructs a new perspective camera.\n\t *\n\t * @param {number} [fov=50] - The vertical field of view.\n\t * @param {number} [aspect=1] - The aspect ratio.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\t/**\n\t\t * The vertical field of view, from bottom to top of view,\n\t\t * in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tthis.fov = fov;\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link PerspectiveCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link OrthographicCamera}, `0` is not a\n\t\t * valid value for a perspective camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link PerspectiveCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * Object distance used for stereoscopy and depth-of-field effects. This\n\t\t * parameter does not influence the projection matrix unless a\n\t\t * {@link StereoCamera} is being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.focus = 10;\n\n\t\t/**\n\t\t * The aspect ratio, usually the canvas width / canvas height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = aspect;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * Film size used for the larger axis. Default is `35` (millimeters). This\n\t\t * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset}\n\t\t * is set to a nonzero value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 35\n\t\t */\n\t\tthis.filmGauge = 35;\n\n\t\t/**\n\t\t * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.filmOffset = 0;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Returns the focal length from the current {@link PerspectiveCamera#fov} and\n\t * {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The computed focal length.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\t/**\n\t * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}.\n\t *\n\t * @return {number} The effective FOV.\n\t */\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\t/**\n\t * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector.\n\t * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} target - The target vector that is used to store result where x is width and y is height.\n\t * @returns {Vector2} The view size.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *```\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *```\n\t * then for each monitor you would call it like this:\n\t *```js\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * // --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * // --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * // --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * // --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * // --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * // --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t * ```\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\n/**\n * A special type of camera that is positioned in 3D space to render its surroundings into a\n * cube render target. The render target can then be used as an environment map for rendering\n * realtime reflections in your scene.\n *\n * ```js\n * // Create cube render target\n * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } );\n *\n * // Create cube camera\n * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget );\n * scene.add( cubeCamera );\n *\n * // Create car\n * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } );\n * const car = new THREE.Mesh( carGeometry, chromeMaterial );\n * scene.add( car );\n *\n * // Update the render target cube\n * car.visible = false;\n * cubeCamera.position.copy( car.position );\n * cubeCamera.update( renderer, scene );\n *\n * // Render the scene\n * car.visible = true;\n * renderer.render( scene, camera );\n * ```\n *\n * @augments Object3D\n */\nclass CubeCamera extends Object3D {\n\n\t/**\n\t * Constructs a new cube camera.\n\t *\n\t * @param {number} near - The camera's near plane.\n\t * @param {number} far - The camera's far plane.\n\t * @param {WebGLCubeRenderTarget} renderTarget - The cube render target.\n\t */\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\t/**\n\t\t * A reference to the cube render target.\n\t\t *\n\t\t * @type {WebGLCubeRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * The current active coordinate system.\n\t\t *\n\t\t * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t * @default null\n\t\t */\n\t\tthis.coordinateSystem = null;\n\n\t\t/**\n\t\t * The current active mipmap level\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\t/**\n\t * Must be called when the coordinate system of the cube camera is changed.\n\t */\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method will render the given scene with the given renderer\n\t * into the cube render target of the camera.\n\t *\n\t * @param {(Renderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Scene} scene - The scene to render.\n\t */\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\tthis.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\n/**\n * This is almost identical to an {@link Object3D}. Its purpose is to\n * make working with groups of objects syntactically clearer.\n *\n * ```js\n * // Create a group and add the two cubes.\n * // These cubes can now be rotated / scaled etc as a group.\n * const group = new THREE.Group();\n *\n * group.add( meshA );\n * group.add( meshB );\n *\n * scene.add( group );\n * ```\n *\n * @augments Object3D\n */\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// private method\n\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\n/**\n * This class can be used to define an exponential squared fog,\n * which gives a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );\n * ```\n */\nclass FogExp2 {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [density=0.00025] - Defines how fast the fog will grow dense.\n\t */\n\tconstructor( color, density = 0.00025 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFogExp2 = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * Defines how fast the fog will grow dense.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {FogExp2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\n/**\n * This class can be used to define a linear fog that grows linearly denser\n * with the distance.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );\n * ```\n */\nclass Fog {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [near=1] - The minimum distance to start applying fog.\n\t * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied.\n\t */\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFog = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The minimum distance to start applying fog. Objects that are less than\n\t\t * `near` units from the active camera won't be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The maximum distance at which fog stops being calculated and applied.\n\t\t * Objects that are more than `far` units away from the active camera won't\n\t\t * be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {Fog} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\n/**\n * Scenes allow you to set up what is to be rendered and where by three.js.\n * This is where you place 3D objects like meshes, lines or lights.\n *\n * @augments Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Constructs a new scene.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\t/**\n\t\t * Defines the background of the scene. Valid inputs are:\n\t\t *\n\t\t * - A color for defining a uniform colored background.\n\t\t * - A texture for defining a (flat) textured background.\n\t\t * - Cube textures or equirectangular textures for defining a skybox.\n\t\t *\n\t\t * @type {?(Color|Texture)}\n\t\t * @default null\n\t\t */\n\t\tthis.background = null;\n\n\t\t/**\n\t\t * Sets the environment map for all physical materials in the scene. However,\n\t\t * it's not possible to overwrite an existing texture assigned to the `envMap`\n\t\t * material property.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * A fog instance defining the type of fog that affects everything\n\t\t * rendered in the scene.\n\t\t *\n\t\t * @type {?(Fog|FogExp2)}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the blurriness of the background. Only influences environment maps\n\t\t * assigned to {@link Scene#background}. Valid input is a float between `0`\n\t\t * and `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.backgroundBlurriness = 0;\n\n\t\t/**\n\t\t * Attenuates the color of the background. Only applies to background textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.backgroundIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the background in radians. Only influences environment maps\n\t\t * assigned to {@link Scene#background}.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.backgroundRotation = new Euler();\n\n\t\t/**\n\t\t * Attenuates the color of the environment. Only influences environment maps\n\t\t * assigned to {@link Scene#environment}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.environmentIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians. Only influences physical materials\n\t\t * in the scene when {@link Scene#environment} is used.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.environmentRotation = new Euler();\n\n\t\t/**\n\t\t * Forces everything in the scene to be rendered with the defined material.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InterleavedBuffer {\n\n\tconstructor( array, stride ) {\n\n\t\tthis.isInterleavedBuffer = true;\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRanges = [];\n\n\t\tthis.version = 0;\n\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\nclass InterleavedBufferAttribute {\n\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized;\n\n\t}\n\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\nclass SpriteMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\n/**\n * A sprite is a plane that always faces towards the camera, generally with a\n * partially transparent texture applied.\n *\n * Sprites do not cast shadows, setting {@link Object3D#castShadow} to `true` will\n * have no effect.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map } );\n *\n * const sprite = new THREE.Sprite( material );\n * scene.add( sprite );\n * ```\n *\n * @augments Object3D\n */\nclass Sprite extends Object3D {\n\n\t/**\n\t * Constructs a new sprite.\n\t *\n\t * @param {SpriteMaterial} [material] - The sprite material.\n\t */\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\t/**\n\t\t * The sprite geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = _geometry;\n\n\t\t/**\n\t\t * The sprite material.\n\t\t *\n\t\t * @type {SpriteMaterial}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The sprite's anchor point, and the point around which the sprite rotates.\n\t\t * A value of `(0.5, 0.5)` corresponds to the midpoint of the sprite. A value\n\t\t * of `(0, 0)` corresponds to the lower left corner of the sprite.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this sprite.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A component for providing a basic Level of Detail (LOD) mechanism.\n *\n * Every LOD level is associated with an object, and rendering can be switched\n * between them at the distances specified. Typically you would create, say,\n * three meshes, one for far away (low detail), one for mid range (medium\n * detail) and one for close up (high detail).\n *\n * ```js\n * const lod = new THREE.LOD();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n *\n * //Create spheres with 3 levels of detail and create new LOD levels for them\n * for( let i = 0; i < 3; i++ ) {\n *\n * \tconst geometry = new THREE.IcosahedronGeometry( 10, 3 - i );\n * \tconst mesh = new THREE.Mesh( geometry, material );\n * \tlod.addLevel( mesh, i * 75 );\n *\n * }\n *\n * scene.add( lod );\n * ```\n *\n * @augments Object3D\n */\nclass LOD extends Object3D {\n\n\t/**\n\t * Constructs a new LOD.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLOD = true;\n\n\t\t/**\n\t\t * The current LOD index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * This array holds the LOD levels.\n\t\t\t *\n\t\t\t * @name LOD#levels\n\t\t\t * @type {Array<{object:Object3D,distance:number,hysteresis:number}>}\n\t\t\t */\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether the LOD object is updated automatically by the renderer per frame\n\t\t * or not. If set to `false`, you have to call {@link LOD#update} in the\n\t\t * render loop by yourself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a mesh that will display at a certain distance and greater. Typically\n\t * the further away the distance, the lower the detail on the mesh.\n\t *\n\t * @param {Object3D} object - The 3D object to display at this level.\n\t * @param {number} [distance=0] - The distance at which to display this level of detail.\n\t * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance.\n\t * @return {LOD} A reference to this instance.\n\t */\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes an existing level, based on the distance from the camera.\n\t * Returns `true` when the level has been removed. Otherwise `false`.\n\t *\n\t * @param {number} distance - Distance of the level to remove.\n\t * @return {boolean} Whether the level has been removed or not.\n\t */\n\tremoveLevel( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0; i < levels.length; i ++ ) {\n\n\t\t\tif ( levels[ i ].distance === distance ) {\n\n\t\t\t\tconst removedElements = levels.splice( i, 1 );\n\t\t\t\tthis.remove( removedElements[ 0 ].object );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the currently active LOD level index.\n\t *\n\t * @return {number} The current active LOD level index.\n\t */\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\t/**\n\t * Returns a reference to the first 3D object that is greater than\n\t * the given distance.\n\t *\n\t * @param {number} distance - The LOD distance.\n\t * @return {Object3D|null} The found 3D object. `null` if no 3D object has been found.\n\t */\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this LOD.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the LOD by computing which LOD level should be visible according\n\t * to the current distance of the given camera.\n\t *\n\t * @param {Camera} camera - The camera the scene is renderd with.\n\t */\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\n/**\n * A mesh that has a {@link Skeleton} that can then be used to animate the\n * vertices of the geometry with skinning/skeleton animation.\n *\n * Next to a valid skeleton, the skinned mesh requires skin indices and weights\n * as buffer attributes in its geometry. These attribute define which bones affect a single\n * vertex to a certain extend.\n *\n * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader}\n * or {@link FBXLoader } import respective models.\n *\n * @augments Mesh\n */\nclass SkinnedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new skinned mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\t/**\n\t\t * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton.\n\t\t * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton\n\t\t * across multiple skinned meshes.\n\t\t *\n\t\t * @type {(AttachedBindMode|DetachedBindMode)}\n\t\t * @default AttachedBindMode\n\t\t */\n\t\tthis.bindMode = AttachedBindMode;\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect\n\t * the current animation state.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}.\n\t * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting\n\t * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed\n\t * per frame in order to reflect the current animation state.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$5.copy( this.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Binds the given skeleton to the skinned mesh.\n\t *\n\t * @param {Skeleton} skeleton - The skeleton to bind.\n\t * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided,\n\t * the skinned mesh's world matrix will be used instead.\n\t */\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\t/**\n\t * This method sets the skinned mesh in the rest pose).\n\t */\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\t/**\n\t * Normalizes the skin weights which are defined as a buffer attribute\n\t * in the skinned mesh's geometry.\n\t */\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given\n\t * vertex position. Returns the updated vector.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * the skinned mesh's world matrix will be used instead.\n\t * @return {Vector3} The updated vertex position.\n\t */\n\tapplyBoneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\n/**\n * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by\n * the {@link SkinnedMesh}.\n *\n * ```js\n * const root = new THREE.Bone();\n * const child = new THREE.Bone();\n *\n * root.add( child );\n * child.position.y = 5;\n * ```\n *\n * @augments Object3D\n */\nclass Bone extends Object3D {\n\n\t/**\n\t * Constructs a new bone.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\nclass DataTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isDataTexture = true;\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * Class for representing the armatures in `three.js`. The skeleton\n * is defined by a hierarchy of bones.\n *\n * ```js\n * const bones = [];\n *\n * const shoulder = new THREE.Bone();\n * const elbow = new THREE.Bone();\n * const hand = new THREE.Bone();\n *\n * shoulder.add( elbow );\n * elbow.add( hand );\n *\n * bones.push( shoulder , elbow, hand);\n *\n * shoulder.position.y = -5;\n * elbow.position.y = 0;\n * hand.position.y = 5;\n *\n * const armSkeleton = new THREE.Skeleton( bones );\n * ```\n */\nclass Skeleton {\n\n\t/**\n\t * Constructs a new skeleton.\n\t *\n\t * @param {Array} [bones] - An array of bones.\n\t * @param {Array} [boneInverses] - An array of bone inverse matrices.\n\t * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}.\n\t */\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An array of bones defining the skeleton.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t/**\n\t\t * An array of bone inverse matrices.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * An array buffer holding the bone data.\n\t\t * Input data for {@link Skeleton#boneTexture}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.boneMatrices = null;\n\n\t\t/**\n\t\t * A texture holding the bone data for use\n\t\t * in the vertex shader.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\t/**\n\t * Initializes the skeleton. This method gets automatically called by the constructor\n\t * but depending on how the skeleton is created it might be necessary to call this method\n\t * manually.\n\t */\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses}\n\t * and fills it with new matrices.\n\t */\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new skeleton with copied values from this instance.\n\t *\n\t * @return {Skeleton} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\t/**\n\t * Computes a data texture for passing bone data to the vertex shader.\n\t *\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the skeleton's bone array and returns the first with a\n\t * matching name.\n\t *\n\t * @param {string} name - The name of the bone.\n\t * @return {Bone|undefined} The found bone. `undefined` if no bone has been found.\n\t */\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the skeleton by the given JSON and bones.\n\t *\n\t * @param {Object} json - The skeleton as serialized JSON.\n\t * @param {Array} bones - An array of bones.\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the skeleton into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized skeleton.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\n\n/**\n * A special version of a mesh with instanced rendering support. Use\n * this class if you have to render a large number of objects with the same\n * geometry and material(s) but with different world transformations. The usage\n * of 'InstancedMesh' will help you to reduce the number of draw calls and thus\n * improve the overall rendering performance in your application.\n *\n * @augments Mesh\n */\nclass InstancedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new instanced mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t * @param {number} count - The number of instances.\n\t */\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedMesh = true;\n\n\t\t/**\n\t\t * Represents the local transformation of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMatrixAt}.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\t\t/**\n\t\t * Represents the color of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setColorAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColor = null;\n\n\t\t/**\n\t\t * Represents the morph target weights of all instances. You have to set its\n\t\t * {@link Texture#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMorphAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTexture = null;\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere}\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$4 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the color of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t */\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Gets the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t */\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Gets the morph target weights of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - The target object that is used to store the method's result.\n\t */\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceColor} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The instance color.\n\t */\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The the local transformation.\n\t */\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#morphTexture} to `true` after updating all the influences.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights\n\t * of a single instance.\n\t */\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3D space, represented\n * in [Hessian normal form]{@link http://mathworld.wolfram.com/HessianNormalForm.html}\n * by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new plane.\n\t *\n\t * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPlane = true;\n\n\t\t/**\n\t\t * A unit length vector defining the normal of the plane.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = normal;\n\n\t\t/**\n\t\t * The signed distance from the origin to the plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = constant;\n\n\t}\n\n\t/**\n\t * Sets the plane components by copying the given values.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {number} constant - The constant.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane components by defining `x`, `y`, `z` as the\n\t * plane normal and `w` as the constant.\n\t *\n\t * @param {number} x - The value for the normal's x component.\n\t * @param {number} y - The value for the normal's y component.\n\t * @param {number} z - The value for the normal's z component.\n\t * @param {number} w - The constant value.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from the given normal and coplanar point (that is a point\n\t * that lies onto the plane).\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Vector3} point - A coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from three coplanar points. The winding order is\n\t * assumed to be counter-clockwise, and determines the direction of\n\t * the plane normal.\n\t *\n\t * @param {Vector3} a - The first coplanar point.\n\t * @param {Vector3} b - The second coplanar point.\n\t * @param {Vector3} c - The third coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given plane to this instance.\n\t *\n\t * @param {Plane} plane - The plane to copy.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Normalizes the plane normal and adjusts the constant accordingly.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Negates both the plane normal and the constant.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given point to this plane.\n\t *\n\t * @param {Vector3} point - The point to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given sphere to this plane.\n\t *\n\t * @param {Sphere} sphere - The sphere to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\t/**\n\t * Projects a the given point onto the plane.\n\t *\n\t * @param {Vector3} point - The point to project.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The projected point on the plane.\n\t */\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the intersection point of the passed line and the plane. Returns\n\t * `null` if the line does not intersect. Returns the line's starting point if\n\t * the line is coplanar with the plane.\n\t *\n\t * @param {Line3} line - The line to compute the intersection for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given line segment intersects with (passes through) the plane.\n\t *\n\t * @param {Line3} line - The line to test.\n\t * @return {boolean} Whether the given line segment intersects with the plane or not.\n\t */\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with the plane.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with the plane or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with the plane.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with the plane or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns a coplanar vector to the plane, by calculating the\n\t * projection of the normal at the origin onto the plane.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The coplanar point.\n\t */\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\t/**\n\t * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform.\n\t *\n\t * The optional normal matrix can be pre-computed like so:\n\t * ```js\n\t * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\n\t * ```\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the plane by the distance defined by the given offset vector.\n\t * Note that this only affects the plane constant and will not affect the normal vector.\n\t *\n\t * @param {Vector3} offset - The offset vector.\n\t * @return {Plane} A reference to this plane.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this plane is equal with the given one.\n\t *\n\t * @param {Plane} plane - The plane to test for equality.\n\t * @return {boolean} Whether this plane is equal with the given one.\n\t */\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\t/**\n\t * Returns a new plane with copied values from this instance.\n\t *\n\t * @return {Plane} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's\n * frustum can safely be excluded from rendering.\n *\n * This class is mainly intended for use internally by a renderer.\n */\nclass Frustum {\n\n\t/**\n\t * Constructs a new frustum.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t */\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\t/**\n\t\t * This array holds the planes that enclose the frustum.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\t/**\n\t * Sets the frustum planes by copying the given planes.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given frustum to this instance.\n\t *\n\t * @param {Frustum} frustum - The frustum to copy.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the frustum planes from the given projection matrix.\n\t *\n\t * @param {Matrix4} m - The projection matrix.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize();\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting this frustum.\n\t *\n\t * Note that the 3D object must have a geometry so that the bounding sphere can be calculated.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting this frustum.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @return {boolean} Whether the sprite is intersecting this frustum or not.\n\t */\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$3.center.set( 0, 0, 0 );\n\t\t_sphere$3.radius = 0.7071067811865476;\n\t\t_sphere$3.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting this frustum.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting this frustum.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box is intersecting this frustum or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within the frustum.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the point lies within this frustum or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns a new frustum with copied values from this instance.\n\t *\n\t * @return {Frustum} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nfunction ascIdSort( a, b ) {\n\n\treturn a - b;\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( start, count, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents( src, target ) {\n\n\tif ( src.constructor !== target.constructor ) {\n\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min( src.length, target.length );\n\t\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\t\ttarget[ i ] = src[ i ];\n\n\t\t}\n\n\t} else {\n\n\t\t// if the arrays use the same data layout we can use a fast block copy\n\t\tconst len = Math.min( src.length, target.length );\n\t\ttarget.set( new src.constructor( src.buffer, 0, len ) );\n\n\t}\n\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t *\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBatchedMesh = true;\n\n\t\t/**\n\t\t * When set ot `true`, the individual objects of a batch are frustum culled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\t\tthis._geometryCount = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// buffers for multi draw\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\t/**\n\t * The instance count.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 matrices * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 matrices * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `THREE.BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the instance defined by the given ID.\n\t *\n\t * @param {number} instanceId - The the instance to validate.\n\t */\n\tvalidateInstanceId( instanceId ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tif ( instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[ instanceId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the geometry defined by the given ID.\n\t *\n\t * @param {number} geometryId - The the geometry to validate.\n\t */\n\tvalidateGeometryId( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t *\n\t * @param {Function} func - The custom sort function.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t *\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @return {number} The instance ID.\n\t */\n\taddInstance( geometryId ) {\n\n\t\tconst atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n\t\t// ensure we're not over geometry\n\t\tif ( atCapacity && this._availableInstanceIds.length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\t\t};\n\n\t\tlet drawId = null;\n\n\t\t// Prioritize using previously freed instance ids\n\t\tif ( this._availableInstanceIds.length > 0 ) {\n\n\t\t\tthis._availableInstanceIds.sort( ascIdSort );\n\n\t\t\tdrawId = this._availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[ drawId ] = instanceInfo;\n\n\t\t} else {\n\n\t\t\tdrawId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push( instanceInfo );\n\n\t\t}\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\t_matrix$1.identity().toArray( matricesTexture.image.data, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn drawId;\n\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @return {number} The geometry ID.\n\t */\n\taddGeometry( geometry, reservedVertexCount = -1, reservedIndexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst geometryInfo = {\n\t\t\t// geometry information\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\treservedVertexCount: -1,\n\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t\treservedIndexCount: -1,\n\n\t\t\t// draw range information\n\t\t\tstart: -1,\n\t\t\tcount: -1,\n\n\t\t\t// state\n\t\t\tboundingBox: null,\n\t\t\tboundingSphere: null,\n\t\t\tactive: true,\n\t\t};\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tgeometryInfo.vertexStart = this._nextVertexStart;\n\t\tgeometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute( 'position' ).count : reservedVertexCount;\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tgeometryInfo.indexStart = this._nextIndexStart;\n\t\t\tgeometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount;\n\n\t\t}\n\n\t\tif (\n\t\t\tgeometryInfo.indexStart !== -1 &&\n\t\t\tgeometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount ||\n\t\t\tgeometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tlet geometryId;\n\t\tif ( this._availableGeometryIds.length > 0 ) {\n\n\t\t\tthis._availableGeometryIds.sort( ascIdSort );\n\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tgeometryInfoList[ geometryId ] = geometryInfo;\n\n\n\t\t} else {\n\n\t\t\tgeometryId = this._geometryCount;\n\t\t\tthis._geometryCount ++;\n\t\t\tgeometryInfoList.push( geometryInfo );\n\n\t\t}\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\t// increment the next geometry position\n\t\tthis._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geomtry that should be replaced with the given geometry.\n\t * @param {BufferGeometry} geometry - The new geometry.\n\t * @return {number} The geometry ID.\n\t */\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > geometryInfo.reservedIndexCount ||\n\t\t\tgeometry.attributes.position.count > geometryInfo.reservedVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry buffer data over\n\t\tconst vertexStart = geometryInfo.vertexStart;\n\t\tconst reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\tgeometryInfo.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = geometryInfo.indexStart;\n\t\t\tconst reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\t\tgeometryInfo.indexCount = geometry.getIndex().count;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedIndexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );\n\n\t\t}\n\n\t\t// update the draw range\n\t\tgeometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\tgeometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;\n\n\t\t// store the bounding boxes\n\t\tgeometryInfo.boundingBox = null;\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tgeometryInfo.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tgeometryInfo.boundingSphere = null;\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tgeometryInfo.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t *\n\t * @param {number} geometryId - The ID of the geomtry to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t// delete any instances associated with this geometry\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active && instanceInfo[ i ].geometryIndex === geometryId ) {\n\n\t\t\t\tthis.deleteInstance( i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometryInfoList[ geometryId ].active = false;\n\t\tthis._availableGeometryIds.push( geometryId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tthis._instanceInfo[ instanceId ].active = false;\n\t\tthis._availableInstanceIds.push( instanceId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Repacks the sub geometries in [name] to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst indices = geometryInfoList\n\t\t\t.map( ( e, i ) => i )\n\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\treturn geometryInfoList[ a ].vertexStart - geometryInfoList[ b ].vertexStart;\n\n\t\t\t} );\n\n\t\tconst geometry = this.geometry;\n\t\tfor ( let i = 0, l = geometryInfoList.length; i < l; i ++ ) {\n\n\t\t\t// if a geometry range is inactive then don't copy anything\n\t\t\tconst index = indices[ i ];\n\t\t\tconst geometryInfo = geometryInfoList[ index ];\n\t\t\tif ( geometryInfo.active === false ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tif ( geometryInfo.indexStart !== nextIndexStart ) {\n\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst array = index.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor ( let j = indexStart; j < indexStart + reservedIndexCount; j ++ ) {\n\n\t\t\t\t\t\tarray[ j ] = array[ j ] + elementDelta;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex.array.copyWithin( nextIndexStart, indexStart, indexStart + reservedIndexCount );\n\t\t\t\t\tindex.addUpdateRange( nextIndexStart, reservedIndexCount );\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif ( geometryInfo.vertexStart !== nextVertexStart ) {\n\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor ( const key in attributes ) {\n\n\t\t\t\t\tconst attribute = attributes[ key ];\n\t\t\t\t\tconst { array, itemSize } = attribute;\n\t\t\t\t\tarray.copyWithin( nextVertexStart * itemSize, vertexStart * itemSize, ( vertexStart + reservedVertexCount ) * itemSize );\n\t\t\t\t\tattribute.addUpdateRange( nextVertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\n\t\t\t// step the next geometry points to the shifted position\n\t\t\tthis._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0;\n\t\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the bounding box for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @return {Box3|null} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingBox === null ) {\n\n\t\t\tconst box = new Box3();\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tgeometryInfo.boundingBox = box;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingBox );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the bounding sphere for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @return {Sphere|null} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingSphere === null ) {\n\n\t\t\tconst sphere = new Sphere();\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tgeometryInfo.boundingSphere = sphere;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingSphere );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @return {Matrix4} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn matrix.fromArray( this._matricesTexture.image.data, instanceId * 16 );\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color} color - The color to set the instance to.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\tcolor.toArray( this._colorsTexture.image.data, instanceId * 4 );\n\t\tthis._colorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t * @return {Color} The instance's color.\n\t */\n\tgetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn color.fromArray( this._colorsTexture.image.data, instanceId * 4 );\n\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t *\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt( instanceId, visible ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._instanceInfo[ instanceId ].visible === visible ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis._instanceInfo[ instanceId ].visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @return {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].visible;\n\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t *\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt( instanceId, geometryId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tthis._instanceInfo[ instanceId ].geometryIndex = geometryId;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @return {number} The instance's geometry ID.\n\t */\n\tgetGeometryIdAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].geometryIndex;\n\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t *\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {Object} [target] - The target object that is used to store the method's result.\n\t * @return {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tstart:number,count:number\n\t * }} The result object with range data.\n\t */\n\tgetGeometryRangeAt( geometryId, target = {} ) {\n\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n\t\ttarget.start = geometryInfo.start;\n\t\ttarget.count = geometryInfo.count;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t *\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t*/\n\tsetInstanceCount( maxInstanceCount ) {\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort( ascIdSort );\n\t\twhile ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length ) {\n\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\n\t\t}\n\n\t\t// throw an error if it can't be shrunk to the desired size\n\t\tif ( maxInstanceCount < instanceInfo.length ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Instance ids outside the range ${ maxInstanceCount } are being used. Cannot shrink instance count.` );\n\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tconst multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tcopyArrayContents( this._multiDrawCounts, multiDrawCounts );\n\t\tcopyArrayContents( this._multiDrawStarts, multiDrawStarts );\n\n\t\tthis._multiDrawCounts = multiDrawCounts;\n\t\tthis._multiDrawStarts = multiDrawStarts;\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\t// update texture data for instance sampling\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst colorsTexture = this._colorsTexture;\n\n\t\tindirectTexture.dispose();\n\t\tthis._initIndirectTexture();\n\t\tcopyArrayContents( indirectTexture.image.data, this._indirectTexture.image.data );\n\n\t\tmatricesTexture.dispose();\n\t\tthis._initMatricesTexture();\n\t\tcopyArrayContents( matricesTexture.image.data, this._matricesTexture.image.data );\n\n\t\tif ( colorsTexture ) {\n\n\t\t\tcolorsTexture.dispose();\n\t\t\tthis._initColorsTexture();\n\t\t\tcopyArrayContents( colorsTexture.image.data, this._colorsTexture.image.data );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t *\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t*/\n\tsetGeometrySize( maxVertexCount, maxIndexCount ) {\n\n\t\t// Check if we can shrink to the requested vertex attribute size\n\t\tconst validRanges = [ ...this._geometryInfo ].filter( info => info.active );\n\t\tconst requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );\n\t\tif ( requiredVertexLength > maxVertexCount ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t}\n\n\t\t// Check if we can shrink to the requested index attribute size\n\t\tif ( this.geometry.index ) {\n\n\t\t\tconst requiredIndexLength = Math.max( ...validRanges.map( range => range.indexStart + range.reservedIndexCount ) );\n\t\t\tif ( requiredIndexLength > maxIndexCount ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Geometry index values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif ( this._geometryInitialized ) {\n\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new BufferGeometry();\n\t\t\tthis._initializeGeometry( oldGeometry );\n\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif ( oldGeometry.index ) {\n\n\t\t\tcopyArrayContents( oldGeometry.index.array, geometry.index.array );\n\n\t\t}\n\n\t\tfor ( const key in oldGeometry.attributes ) {\n\n\t\t\tcopyArrayContents( oldGeometry.attributes[ key ].array, geometry.attributes[ key ].array );\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! instanceInfo[ i ].visible || ! instanceInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( geometryInfo.start, geometryInfo.count );\n\n\t\t\t// get the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._geometryInfo = source._geometryInfo.map( info => ( {\n\t\t\t...info,\n\n\t\t\tboundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n\t\t\tboundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n\t\t} ) );\n\t\tthis._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._geometryCount = source._geometryCount;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t_matrix$1\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_matrix$1,\n\t\t\t\trenderer.coordinateSystem\n\t\t\t);\n\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_matrix$1.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix$1 );\n\t\t\t_forward.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix$1 );\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! _frustum.intersectsSphere( _sphere$2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward );\n\t\t\t\t\t\t_renderList.push( geometryInfo.start, geometryInfo.count, z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ multiDrawCount ] = item.count;\n\t\t\t\tindirectArray[ multiDrawCount ] = item.index;\n\t\t\t\tmultiDrawCount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! _frustum.intersectsSphere( _sphere$2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ multiDrawCount ] = geometryInfo.count;\n\t\t\t\t\t\tindirectArray[ multiDrawCount ] = i;\n\t\t\t\t\t\tmultiDrawCount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = multiDrawCount;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\nclass LineBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\n/**\n * A continuous line. The line are rendered by connecting consecutive\n * vertices with straight lines.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } );\n *\n * const points = [];\n * points.push( new THREE.Vector3( - 10, 0, 0 ) );\n * points.push( new THREE.Vector3( 0, 10, 0 ) );\n * points.push( new THREE.Vector3( 10, 0, 0 ) );\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments Object3D\n */\nclass Line extends Object3D {\n\n\t/**\n\t * Constructs a new line.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\t/**\n\t\t * The line geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default LineBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Line} A reference to this line.\n\t */\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: i,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tbarycoord: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * @augments Line\n */\nclass LineSegments extends Line {\n\n\t/**\n\t * Constructs a new line segments.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A continuous line. This is nearly the same as {@link Line} the only difference\n * is that the last vertex is connected with the first vertex in order to close\n * the line to form a loop.\n *\n * @augments Line\n */\nclass LineLoop extends Line {\n\n\t/**\n\t * Constructs a new line loop.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\nclass PointsMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\n/**\n * A class for displaying points or point clouds.\n *\n * @augments Object3D\n */\nclass Points extends Object3D {\n\n\t/**\n\t * Constructs a new point cloud.\n\t *\n\t * @param {BufferGeometry} [geometry] - The points geometry.\n\t * @param {Material|Array} [material] - The points material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\t/**\n\t\t * The points geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default PointsMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this point cloud.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tfaceIndex: null,\n\t\t\tbarycoord: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nclass VideoTexture extends Texture {\n\n\tconstructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isVideoTexture = true;\n\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nclass VideoFrameTexture extends VideoTexture {\n\n\tconstructor( mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isVideoFrameTexture = true;\n\n\t}\n\n\tupdate() {\n\n\t\t// overwrites `VideoTexture.update()` with an empty method since\n\t\t// this type of texture is updated via `setFrame()`.\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this ); // restoring Texture.clone()\n\n\t}\n\n\tsetFrame( frame ) {\n\n\t\tthis.image = frame;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nclass FramebufferTexture extends Texture {\n\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\tthis.isFramebufferTexture = true;\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nclass CompressedTexture extends Texture {\n\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isCompressedTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\nclass CompressedArrayTexture extends CompressedTexture {\n\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\tthis.isCompressedArrayTexture = true;\n\t\tthis.image.depth = depth;\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\nclass CompressedCubeTexture extends CompressedTexture {\n\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\tthis.isCompressedCubeTexture = true;\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\nclass CanvasTexture extends Texture {\n\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format = DepthFormat ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedIntType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isDepthTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.source = new Source( Object.assign( {}, source.image ) ); // see #30540\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * An abstract base class for creating an analytic curve object that contains methods\n * for interpolation.\n *\n * @abstract\n */\nclass Curve {\n\n\t/**\n\t * Constructs a new curve.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Curve';\n\n\t\t/**\n\t\t * This value determines the amount of divisions when calculating the\n\t\t * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure\n\t\t * precision when using methods like {@link Curve#getSpacedPoints}, it is\n\t\t * recommended to increase the value of this property if the curve is very large.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.arcLengthDivisions = 200;\n\n\t\t/**\n\t\t * Must be set to `true` if the curve parameters have changed.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\t/**\n\t\t * An internal cache that holds precomputed curve length values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.cacheArcLengths = null;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor.\n\t *\n\t * @abstract\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length\n\t * of the curve which equidistant samples.\n\t *\n\t * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing\n\t * the curve shape.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing\n\t * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire\n\t * curve.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t/**\n\t * Returns the total arc length of the curve.\n\t *\n\t * @return {number} The length of the curve.\n\t */\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns an array of cumulative segment lengths of the curve.\n\t *\n\t * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions.\n\t * @return {Array} An array holding the cumulative segment lengths.\n\t */\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\t/**\n\t * Update the cumulative segment distance cache. The method must be called\n\t * every time curve parameters are changed. If an updated curve is part of a\n\t * composed curve like {@link CurvePath}, this method must be called on the\n\t * composed curve, too.\n\t */\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t/**\n\t * Given an interpolation factor in the range `[0,1]`, this method returns an updated\n\t * interpolation factor in the same range that can be ued to sample equidistant points\n\t * from a curve.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {?number} distance - An optional distance on the curve.\n\t * @return {number} The updated interpolation factor.\n\t */\n\tgetUtoTmapping( u, distance = null ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t * If the derived curve does not implement its tangent derivation,\n\t * two points a small delta apart will be used to find its gradient\n\t * which seems to give a reasonable approximation.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\t/**\n\t * Same as {@link Curve#getTangent} but with equidistant samples.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t * @see {@link Curve#getPointAt}\n\t */\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * Generates the Frenet Frames. Requires a curve definition in 3D space. Used\n\t * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}.\n\t *\n\t * @param {number} segments - The number of segments.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @return {{tangents: Array, normals: Array, binormals: Array}} The Frenet Frames.\n\t */\n\tcomputeFrenetFrames( segments, closed = false ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a new curve with copied values from this instance.\n\t *\n\t * @return {Curve} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given curve to this instance.\n\t *\n\t * @param {Curve} source - The curve to copy.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the curve into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized curve.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Deserializes the curve from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized curve.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an ellipse.\n *\n * ```js\n * const curve = new THREE.EllipseCurve(\n * \t0, 0,\n * \t10, 10,\n * \t0, 2 * Math.PI,\n * \tfalse,\n * \t0\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const ellipse = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass EllipseCurve extends Curve {\n\n\t/**\n\t * Constructs a new ellipse curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t */\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\t/**\n\t\t * The X center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aX = aX;\n\n\t\t/**\n\t\t * The Y center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aY = aY;\n\n\t\t/**\n\t\t * The radius of the ellipse in the x direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.xRadius = xRadius;\n\n\t\t/**\n\t\t * The radius of the ellipse in the y direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.yRadius = yRadius;\n\n\t\t/**\n\t\t * The start angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aStartAngle = aStartAngle;\n\n\t\t/**\n\t\t * The end angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI*2\n\t\t */\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\t/**\n\t\t * Whether the ellipse is drawn clockwise or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.aClockwise = aClockwise;\n\n\t\t/**\n\t\t * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an arc.\n *\n * @augments EllipseCurve\n */\nclass ArcCurve extends EllipseCurve {\n\n\t/**\n\t * Constructs a new arc curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [aRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t */\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nfunction CubicPoly() {\n\n\t/**\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t* cusps and self-intersections in non-uniform catmull rom curves.\n\t* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t*\n\t* curve.type accepts centripetal(default), chordal and catmullrom\n\t* curve.tension is used for catmullrom which defaults to 0.5\n\t*/\n\n\t/*\n\tBased on an optimized c++ solution in\n\t- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t- http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\n/**\n * A curve representing a Catmull-Rom spline.\n *\n * ```js\n * //Create a closed wavey loop\n * const curve = new THREE.CatmullRomCurve3( [\n * \tnew THREE.Vector3( -10, 0, 10 ),\n * \tnew THREE.Vector3( -5, 5, 5 ),\n * \tnew THREE.Vector3( 0, 0, 0 ),\n * \tnew THREE.Vector3( 5, -5, 5 ),\n * \tnew THREE.Vector3( 10, 0, 10 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CatmullRomCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Catmull-Rom curve.\n\t *\n\t * @param {Array} [points] - An array of 3D points defining the curve.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type.\n\t * @param {number} [tension=0.5] - Tension of the curve.\n\t */\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\t/**\n\t\t * An array of 3D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t\t/**\n\t\t * Whether the curve is closed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.closed = closed;\n\n\t\t/**\n\t\t * The curve type.\n\t\t *\n\t\t * @type {('centripetal'|'chordal'|'catmullrom')}\n\t\t * @default 'centripetal'\n\t\t */\n\t\tthis.curveType = curveType;\n\n\t\t/**\n\t\t * Tension of the curve.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.tension = tension;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n\n/**\n * Computes a point on a Catmull-Rom spline.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Catmull-Rom spline.\n */\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\n/**\n * Computes a point on a Quadratic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @return {number} The calculated point on a Quadratic Bezier curve.\n */\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\n/**\n * Computes a point on a Cubic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Cubic Bezier curve.\n */\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\n/**\n * A curve representing a 2D Cubic Bezier curve.\n *\n * ```js\n * const curve = new THREE.CubicBezierCurve(\n * \tnew THREE.Vector2( - 0, 0 ),\n * \tnew THREE.Vector2( - 5, 15 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CubicBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The first control point.\n\t * @param {Vector2} [v2] - The second control point.\n\t * @param {Vector2} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Cubic Bezier curve.\n *\n * @augments Curve\n */\nclass CubicBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The first control point.\n\t * @param {Vector3} [v2] - The second control point.\n\t * @param {Vector3} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D line segment.\n *\n * @augments Curve\n */\nclass LineCurve extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector2} [v1] - The start point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D line segment.\n *\n * @augments Curve\n */\nclass LineCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector3} [v1] - The start point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D Quadratic Bezier curve.\n *\n * ```js\n * const curve = new THREE.QuadraticBezierCurve(\n * \tnew THREE.Vector2( - 10, 0 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * )\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The control point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Quadratic Bezier curve.\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The control point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D spline curve.\n *\n * ```js\n * // Create a sine-like wave\n * const curve = new THREE.SplineCurve( [\n * \tnew THREE.Vector2( -10, 0 ),\n * \tnew THREE.Vector2( -5, 5 ),\n * \tnew THREE.Vector2( 0, 0 ),\n * \tnew THREE.Vector2( 5, -5 ),\n * \tnew THREE.Vector2( 10, 0 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const splineObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass SplineCurve extends Curve {\n\n\t/**\n\t * Constructs a new 2D spline curve.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the curve.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\t/**\n\t\t * An array of 2D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * A base class extending {@link Curve}. `CurvePath` is simply an\n * array of connected curves, but retains the API of a curve.\n *\n * @augments Curve\n */\nclass CurvePath extends Curve {\n\n\t/**\n\t * Constructs a new curve path.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\t/**\n\t\t * An array of curves defining the\n\t\t * path.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.curves = [];\n\n\t\t/**\n\t\t * Whether the path should automatically be closed\n\t\t * by a line curve.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoClose = false;\n\n\t}\n\n\t/**\n\t * Adds a curve to this curve path.\n\t *\n\t * @param {Curve} curve - The curve to add.\n\t */\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\t/**\n\t * Adds a line curve to close the path.\n\t *\n\t * @return {CurvePath} A reference to this curve path.\n\t */\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definitions)\n\t * for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( t, optionalTarget ) {\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 } The curve lengths.\n\t */\n\tgetCurveLengths() {\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A 2D path representation. The class provides methods for creating paths\n * and contours of 2D shapes similar to the 2D Canvas API.\n *\n * ```js\n * const path = new THREE.Path();\n *\n * path.lineTo( 0, 0.8 );\n * path.quadraticCurveTo( 0, 1, 0.2, 1 );\n * path.lineTo( 1, 1 );\n *\n * const points = path.getPoints();\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments CurvePath\n */\nclass Path extends CurvePath {\n\n\t/**\n\t * Constructs a new path.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the path.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\t/**\n\t\t * The current offset of the path. Any new curve added will start here.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a path from the given list of points. The points are added\n\t * to the path as instances of {@link LineCurve}.\n\t *\n\t * @param {Array} points - An array of 2D points.\n\t * @return {Path} A reference to this path.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Moves {@link Path#currentPoint} to the given point.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {Path} A reference to this path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {Path} A reference to this path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point.\n\t *\n\t * @param {number} aX - The x coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} aY - The y coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} aRadius - The radius of the arc.\n\t * @param {number} aStartAngle - The start angle in radians.\n\t * @param {number} aEndAngle - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} aX - The x coordinate of the center of the arc.\n\t * @param {number} aY - The y coordinate of the center of the arc.\n\t * @param {number} aRadius - The radius of the arc.\n\t * @param {number} aStartAngle - The start angle in radians.\n\t * @param {number} aEndAngle - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point\n\t *\n\t * @param {number} aX - The x coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} aY - The y coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} xRadius - The radius of the ellipse in the x axis.\n\t * @param {number} yRadius - The radius of the ellipse in the y axis.\n\t * @param {number} aStartAngle - The start angle in radians.\n\t * @param {number} aEndAngle - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {boolean} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} aX - The x coordinate of the absolute center of the ellipse.\n\t * @param {number} aY - The y coordinate of the absolute center of the ellipse.\n\t * @param {number} xRadius - The radius of the ellipse in the x axis.\n\t * @param {number} yRadius - The radius of the ellipse in the y axis.\n\t * @param {number} aStartAngle - The start angle in radians.\n\t * @param {number} aEndAngle - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Creates meshes with axial symmetry like vases. The lathe rotates around the Y axis.\n *\n * ```js\n * const points = [];\n * for ( let i = 0; i < 10; i ++ ) {\n * \tpoints.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );\n * }\n * const geometry = new THREE.LatheGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const lathe = new THREE.Mesh( geometry, material );\n * scene.add( lathe );\n * ```\n *\n * @augments BufferGeometry\n */\nclass LatheGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new lathe geometry.\n\t *\n\t * @param {Array} [points] - An array of points in 2D space. The x-coordinate of each point\n\t * must be greater than zero.\n\t * @param {number} [segments=12] - The number of circumference segments to generate.\n\t * @param {number} [phiStart=0] - The starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a\n\t * closed lathe, less than 2PI is a portion.\n\t */\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {LatheGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for a capsule with given radii and height. It is constructed using a lathe.\n *\n * ```js\n * const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const capsule = new THREE.Mesh( geometry, material );\n * scene.add( capsule );\n * ```\n *\n * @augments LatheGeometry\n */\nclass CapsuleGeometry extends LatheGeometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [length=1] - Length of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build the caps.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule.\n\t */\n\tconstructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {\n\n\t\tconst path = new Path();\n\t\tpath.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );\n\t\tpath.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );\n\n\t\tsuper( path.getPoints( capSegments ), radialSegments );\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tlength: length,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CapsuleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );\n\n\t}\n\n}\n\n/**\n * A simple shape of Euclidean geometry. It is constructed from a\n * number of triangular segments that are oriented around a central point and\n * extend as far out as a given radius. It is built counter-clockwise from a\n * start angle and a given central angle. It can also be used to create\n * regular polygons, where the number of segments determines the number of\n * sides.\n *\n * ```js\n * const geometry = new THREE.CircleGeometry( 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const circle = new THREE.Mesh( geometry, material );\n * scene.add( circle )\n * ```\n *\n * @augments BufferGeometry\n */\nclass CircleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new circle geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the circle.\n\t * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`.\n\t * @param {number} [thetaStart=0] - Start angle for first segment in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta,\n\t * of the circular sector in radians. The default value results in a complete circle.\n\t */\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CircleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cylinder.\n *\n * ```js\n * const geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cylinder = new THREE.Mesh( geometry, material );\n * scene.add( cylinder );\n * ```\n *\n * @augments BufferGeometry\n */\nclass CylinderGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new cylinder geometry.\n\t *\n\t * @param {number} [radiusTop=1] - Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] - Height of the cylinder.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped.\n\t * @param {boolean} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {boolean} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cylinder.\n\t */\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( radiusTop > 0 || y !== 0 ) {\n\n\t\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( radiusBottom > 0 || y !== heightSegments - 1 ) {\n\n\t\t\t\t\t\tindices.push( b, c, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CylinderGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cone.\n *\n * ```js\n * const geometry = new THREE.ConeGeometry( 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cone = new THREE.Mesh(geometry, material );\n * scene.add( cone );\n * ```\n *\n * @augments CylinderGeometry\n */\nclass ConeGeometry extends CylinderGeometry {\n\n\t/**\n\t * Constructs a new cone geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the cone base.\n\t * @param {number} [height=1] - Height of the cone.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped.\n\t * @param {boolean} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {boolean} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cone.\n\t */\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {ConeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A polyhedron is a solid in three dimensions with flat faces. This class\n * will take an array of vertices, project them onto a sphere, and then\n * divide them up to the desired level of detail.\n *\n * @augments BufferGeometry\n */\nclass PolyhedronGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new polyhedron geometry.\n\t *\n\t * @param {Array} [vertices] - A flat array of vertices describing the base shape.\n\t * @param {Array} [indices] - A flat array of indices describing the base shape.\n\t * @param {number} [radius=1] - The radius of the shape.\n\t * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape.\n\t */\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PolyhedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a dodecahedron.\n *\n * ```js\n * const geometry = new THREE.DodecahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const dodecahedron = new THREE.Mesh( geometry, material );\n * scene.add( dodecahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n */\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new dodecahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the dodecahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {DodecahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\n/**\n * Can be used as a helper object to view the edges of a geometry.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry();\n * const edges = new THREE.EdgesGeometry( geometry );\n * const line = new THREE.LineSegments( edges );\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass EdgesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new edges geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees)\n\t * between the face normals of the adjoining faces exceeds this value.\n\t */\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Defines an arbitrary 2d shape plane using paths with optional holes. It\n * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get\n * points, or to get triangulated faces.\n *\n * ```js\n * const heartShape = new THREE.Shape();\n *\n * heartShape.moveTo( 25, 25 );\n * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 );\n * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 );\n * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 );\n * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 );\n * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 );\n * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 );\n *\n * const extrudeSettings = {\n * \tdepth: 8,\n * \tbevelEnabled: true,\n * \tbevelSegments: 2,\n * \tsteps: 2,\n * \tbevelSize: 1,\n * \tbevelThickness: 1\n * };\n *\n * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings );\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );\n * ```\n *\n * @augments Path\n */\nclass Shape extends Path {\n\n\t/**\n\t * Constructs a new shape.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the shape.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\t/**\n\t\t * The UUID of the shape.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\t/**\n\t\t * Defines the holes in the shape. Hole definitions must use the\n\t\t * opposite winding order (CW/CCW) than the outer shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.holes = [];\n\n\t}\n\n\t/**\n\t * Returns an array representing each contour of the holes\n\t * as a list of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {Array>} The holes as a series of 2D points.\n\t */\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\t/**\n\t * Returns an object that holds contour data for the shape and its holes as\n\t * arrays of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {{shape:Array,holes:Array>}} An object with contour data.\n\t */\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An implementation of the earcut polygon triangulation algorithm. The code\n * is a port of [mapbox/earcut]{@link https://github.com/mapbox/earcut mapbox/earcut} (v2.2.4).\n *\n * @hideconstructor\n */\nclass Earcut {\n\n\t/**\n\t * Triangulates the given shape definition by returning an array of triangles.\n\t *\n\t * @param {Array} data - An array with 2D points.\n\t * @param {Array} holeIndices - An array with indices defining holes.\n\t * @param {number} [dim=2] - The number of coordinates per vertex in the input array.\n\t * @return {Array} An array representing the triangulated faces. Each face is defined by three consecutive numbers\n\t * representing vertex indices.\n\t */\n\tstatic triangulate( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 32767 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize, 0 );\n\n\t\treturn triangles;\n\n\t}\n\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim | 0 );\n\t\t\ttriangles.push( ear.i / dim | 0 );\n\t\t\ttriangles.push( next.i / dim | 0 );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\tlet p = c.next;\n\twhile ( p !== a ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( x0, y0, minX, minY, invSize ),\n\t\tmaxZ = zOrder( x1, y1, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim | 0 );\n\t\t\ttriangles.push( p.i / dim | 0 );\n\t\t\ttriangles.push( b.i / dim | 0 );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\touterNode = eliminateHole( queue[ i ], outerNode );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\tconst bridge = findHoleBridge( hole, outerNode );\n\tif ( ! bridge ) {\n\n\t\treturn outerNode;\n\n\t}\n\n\tconst bridgeReverse = splitPolygon( bridge, hole );\n\n\t// filter collinear points around the cuts\n\tfilterPoints( bridgeReverse, bridgeReverse.next );\n\treturn filterPoints( bridge, bridge.next );\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode,\n\t\tqx = - Infinity,\n\t\tm;\n\n\tconst hx = hole.x, hy = hole.y;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\t\t\t\tif ( x === hx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === 0 ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = ( x - minX ) * invSize | 0;\n\ty = ( y - minY ) * invSize | 0;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) >= ( ax - px ) * ( cy - py ) &&\n ( ax - px ) * ( by - py ) >= ( bx - px ) * ( ay - py ) &&\n ( bx - px ) * ( cy - py ) >= ( cx - px ) * ( by - py );\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // doesn't intersect other edges\n ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? -1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = 0;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\n/**\n * A class containing utility functions for shapes.\n *\n * @hideconstructor\n */\nclass ShapeUtils {\n\n\t/**\n\t * Calculate area of a ( 2D ) contour polygon.\n\t *\n\t * @param {Array} contour - An array of 2D points.\n\t * @return {number} The area.\n\t */\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given contour uses a clockwise winding order.\n\t *\n\t * @param {Array} pts - An array of 2D points defining a polygon.\n\t * @return {boolean} Whether the given contour uses a clockwise winding order or not.\n\t */\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\t/**\n\t * Triangulates the given shape definition.\n\t *\n\t * @param {Array} contour - An array of 2D points defining the contour.\n\t * @param {Array>} holes - An array that holds arrays of 2D points defining the holes.\n\t * @return {Array>} An array that holds for each face definition an array with three indices.\n\t */\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: , // how far from shape outline does bevel start\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // object that provides UV generator functions\n *\n * }\n */\n\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * ```js\n * const length = 12, width = 8;\n *\n * const shape = new THREE.Shape();\n * shape.moveTo( 0,0 );\n * shape.lineTo( 0, width );\n * shape.lineTo( length, width );\n * shape.lineTo( length, 0 );\n * shape.lineTo( 0, 0 );\n *\n * const geometry = new THREE.ExtrudeGeometry( shape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n */\nclass ExtrudeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new extrude geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {Object} [options={}] - The extrude settings.\n\t * @param {number} [options.curveSegments=12] - Number of points on the curves.\n\t * @param {number} [options.steps=1] - Number of points used for subdividing segments along the depth of the extruded spline.\n\t * @param {number} [options.depth=1] - Depth to extrude the shape.\n\t * @param {boolean} [options.bevelEnabled=true] - Whether to beveling to the shape or not.\n\t * @param {number} [options.bevelThickness=0.2] - How deep into the original shape the bevel goes.\n\t * @param {number} [options.bevelSize=bevelThickness-0.1] - Distance from the shape outline that the bevel extends.\n\t * @param {number} [options.bevelOffset=0] - Distance from the shape outline that the bevel starts.\n\t * @param {number} [options.bevelSegments=3] - Number of bevel layers.\n\t * @param {Curve} [options.extrudePath=3] - A 3D spline path along which the shape should be extruded. Bevels not supported for path extrusion.\n\t * @param {Object} [options.UVGenerator] - An object that provides UV generator functions for custom UV generation.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ExtrudeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * A geometry class for representing an icosahedron.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const icosahedron = new THREE.Mesh( geometry, material );\n * scene.add( icosahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n */\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new icosahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the icosahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {IcosahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an octahedron.\n *\n * ```js\n * const geometry = new THREE.OctahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const octahedron = new THREE.Mesh( geometry, material );\n * scene.add( octahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n */\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new octahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the octahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {OctahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a plane.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const plane = new THREE.Mesh( geometry, material );\n * scene.add( plane );\n * ```\n *\n * @augments BufferGeometry\n */\nclass PlaneGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new plane geometry.\n\t *\n\t * @param {number} [width=1] - The width along the X axis.\n\t * @param {number} [height=1] - The height along the Y axis\n\t * @param {number} [widthSegments=1] - The number of segments along the X axis.\n\t * @param {number} [heightSegments=1] - The number of segments along the Y axis.\n\t */\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PlaneGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A class for generating a two-dimensional ring geometry.\n *\n * ```js\n * const geometry = new THREE.RingGeometry( 1, 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n */\nclass RingGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new ring geometry.\n\t *\n\t * @param {number} [innerRadius=0.5] - The inner radius of the ring.\n\t * @param {number} [outerRadius=1] - The outer radius of the ring.\n\t * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`.\n\t * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`.\n\t * @param {number} [thetaStart=0] - Starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {RingGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * Creates an one-sided polygonal geometry from one or more path shapes.\n *\n * ```js\n * const arcShape = new THREE.Shape()\n *\t.moveTo( 5, 1 )\n *\t.absarc( 1, 1, 4, 0, Math.PI * 2, false );\n *\n * const geometry = new THREE.ShapeGeometry( arcShape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n */\nclass ShapeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new shape geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {number} [curveSegments=12] - Number of segments per shape.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ShapeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * A class for generating a sphere geometry.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry( 15, 32, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const sphere = new THREE.Mesh( geometry, material );\n * scene.add( sphere );\n * ```\n *\n * @augments BufferGeometry\n */\nclass SphereGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new sphere geometry.\n\t *\n\t * @param {number} [radius=1] - The sphere radius.\n\t * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`.\n\t * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`.\n\t * @param {number} [phiStart=0] - The horizontal starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size.\n\t * @param {number} [thetaStart=0] - The vertical starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size.\n\t */\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {SphereGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an tetrahedron.\n *\n * ```js\n * const geometry = new THREE.TetrahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const tetrahedron = new THREE.Mesh( geometry, material );\n * scene.add( tetrahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n */\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new tetrahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the tetrahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TetrahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an torus.\n *\n * ```js\n * const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torus = new THREE.Mesh( geometry, material );\n * scene.add( torus );\n * ```\n *\n * @augments BufferGeometry\n */\nclass TorusGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube.\n\t * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`.\n\t * @param {number} [radialSegments=12] - The number of radial segments.\n\t * @param {number} [tubularSegments=48] - The number of tubular segments.\n\t * @param {number} [arc=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair\n * of coprime integers, p and q. If p and q are not coprime, the result will\n * be a torus link.\n *\n * ```js\n * const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torusKnot = new THREE.Mesh( geometry, material );\n * scene.add( torusKnot );\n * ```\n *\n * @augments BufferGeometry\n */\nclass TorusKnotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus knot geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus knot.\n\t * @param {number} [tube=0.4] - Radius of the tube.\n\t * @param {number} [tubularSegments=64] - The number of tubular segments.\n\t * @param {number} [radialSegments=8] - The number of radial segments.\n\t * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry.\n\t * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus.\n\t */\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusKnotGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\n/**\n * Creates a tube that extrudes along a 3D curve.\n *\n * ```js\n * class CustomSinCurve extends THREE.Curve {\n *\n * \tgetPoint( t, optionalTarget = new THREE.Vector3() ) {\n *\n * \t\tconst tx = t * 3 - 1.5;\n * \t\tconst ty = Math.sin( 2 * Math.PI * t );\n * \t\tconst tz = 0;\n *\n * \t\treturn optionalTarget.set( tx, ty, tz );\n * \t}\n *\n * }\n *\n * const path = new CustomSinCurve( 10 );\n * const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n */\nclass TubeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new tube geometry.\n\t *\n\t * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube.\n\t * @param {number} [tubularSegments=64] - The number of segments that make up the tube.\n\t * @param {number} [radius=1] -The radius of the tube.\n\t * @param {number} [radialSegments=8] - The number of segments that make up the cross-section.\n\t * @param {boolean} [closed=false] - Whether the tube is closed or not.\n\t */\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TubeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n/**\n * Can be used as a helper object to visualize a geometry as a wireframe.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry();\n *\n * const wireframe = new THREE.WireframeGeometry( geometry );\n *\n * const line = new THREE.LineSegments( wireframe );\n * line.material.depthWrite = false;\n * line.material.opacity = 0.25;\n * line.material.transparent = true;\n *\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass WireframeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t */\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\nclass ShadowMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\tthis.color = new Color( 0x000000 );\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nclass MeshStandardMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 1.0;\n\t\tthis.metalness = 0.0;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.anisotropyRotation = 0;\n\t\tthis.anisotropyMap = null;\n\n\t\tthis.clearcoatMap = null;\n\t\tthis.clearcoatRoughness = 0.0;\n\t\tthis.clearcoatRoughnessMap = null;\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\t\tthis.clearcoatNormalMap = null;\n\n\t\tthis.ior = 1.5;\n\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\tthis.iridescenceMap = null;\n\t\tthis.iridescenceIOR = 1.3;\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\tthis.sheenColor = new Color( 0x000000 );\n\t\tthis.sheenColorMap = null;\n\t\tthis.sheenRoughness = 1.0;\n\t\tthis.sheenRoughnessMap = null;\n\n\t\tthis.transmissionMap = null;\n\n\t\tthis.thickness = 0;\n\t\tthis.thicknessMap = null;\n\t\tthis.attenuationDistance = Infinity;\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\tthis.specularIntensity = 1.0;\n\t\tthis.specularIntensityMap = null;\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhongMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshToonMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\t\tthis.gradientMap = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshNormalMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshLambertMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapRotation = new Euler();\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshMatcapMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.matcap = null;\n\n\t\tthis.map = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineDashedMaterial = true;\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// converts an array to a specific type\nfunction convertArray( array, type, forceClone ) {\n\n\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t! forceClone && array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) &&\n\t\t! ( object instanceof DataView );\n\n}\n\n// returns an array by which times and values can be sorted\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n// uses the array previously returned by 'getKeyframeOrder' to sort data\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n// function for parsing AOS keyframe formats\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( ...value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\nconst AnimationUtils = {\n\tconvertArray: convertArray,\n\tisTypedArray: isTypedArray,\n\tgetKeyframeOrder: getKeyframeOrder,\n\tsortedArray: sortedArray,\n\tflattenJSON: flattenJSON,\n\tsubclip: subclip,\n\tmakeClipAdditive: makeClipAdditive\n};\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References: {@link http://www.oodesign.com/template-method-pattern.html}\n *\n * @abstract\n */\nclass Interpolant {\n\n\t/**\n\t * Constructs a new interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t/**\n\t\t * The parameter positions.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.parameterPositions = parameterPositions;\n\n\t\t/**\n\t\t * A cache index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cachedIndex = 0;\n\n\t\t/**\n\t\t * The result buffer.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize );\n\n\t\t/**\n\t\t * The sample values.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.sampleValues = sampleValues;\n\n\t\t/**\n\t\t * The value size.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.valueSize = sampleSize;\n\n\t\t/**\n\t\t * The interpolation settings.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * The default settings object.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\t/**\n\t * Evaluate the interpolant at position `t`.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\t/**\n\t * Returns the interpolation settings.\n\t *\n\t * @return {Object} The interpolation settings.\n\t */\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @param {number} index - An index into the sample value buffer.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @abstract\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t * @param {number} t1 - The next interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\t/**\n\t * Optional method that is executed when the interval has changed.\n\t *\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t */\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @augments Interpolant\n */\nclass CubicInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new cubic interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A basic linear interpolant.\n *\n * @augments Interpolant\n */\nclass LinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new linear interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n *\n * @augments Interpolant\n */\nclass DiscreteInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new discrete interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\nclass KeyframeTrack {\n\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\tthis.name = name;\n\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t// move all keyframes either forwards or backwards in time\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize() {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A Track of Boolean keyframe values.\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t// No interpolation parameter because only InterpolateDiscrete is valid.\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of keyframe values that represent color.\n */\nclass ColorKeyframeTrack extends KeyframeTrack {}\n\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A Track of numeric keyframe values.\n */\nclass NumberKeyframeTrack extends KeyframeTrack {}\n\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @augments Interpolant\n */\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new SLERP interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A Track of quaternion keyframe values.\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track that interpolates Strings\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t// No interpolation parameter because only InterpolateDiscrete is valid.\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\nStringKeyframeTrack.prototype.ValueBufferType = Array;\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of vectored keyframe values.\n */\nclass VectorKeyframeTrack extends KeyframeTrack {}\n\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\nclass AnimationClip {\n\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = duration;\n\t\tthis.blendMode = blendMode;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\treturn clip;\n\n\t}\n\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t// parse the animation.hierarchy format\n\tstatic parseAnimation( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nconst Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\nclass LoadingManager {\n\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t}\n\n}\n\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n *\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\t/**\n\t\t * The loading manager.\n\t\t *\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The base path from which additional resources like textures will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.resourcePath = '';\n\n\t\t/**\n\t\t * The [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header}\n\t\t * used in HTTP request.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.requestHeader = {};\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for loading assets from the backend.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for parsing the asset into three.js entities.\n\t *\n\t * @param {any} data - The data to parse.\n\t */\n\tparse( /* data */ ) {}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t *\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials]{@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials}.\n\t *\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t *\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t *\n\t * @param {string} path - The base path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for dependent resources like textures.\n\t *\n\t * @param {string} resourcePath - The resource path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t *\n\t * @param {Object} requestHeader - A [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header}\n\t * for configuring the HTTP request.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n *\n *\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n *\n *\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\n/**\n * The default material name that is used by loaders\n * when creating materials for loaded 3D objects.\n *\n * Note: Not all loaders might honor this setting.\n *\n * @static\n * @type {string}\n * @default '__DEFAULT'\n */\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\nclass FileLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\t// An abort controller could be added within a future PR\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === undefined ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( url, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass CompressedTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass ImageLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\nclass CubeTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass DataTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass TextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for lights - all other light types inherit the\n * properties and methods described here.\n *\n * @abstract\n * @augments Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\t/**\n\t\t * The light's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The light's intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\t\tif ( this.target !== undefined ) data.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * A light source positioned directly above the scene, with color fading from\n * the sky color to the ground color.\n *\n * This light cannot be used to cast shadows.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * Constructs a new hemisphere light.\n\t *\n\t * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color.\n\t * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The light's ground color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * Abstract base class for light shadow classes. These classes\n * represent the shadow configuration for different ligth types.\n *\n * @abstract\n */\nclass LightShadow {\n\n\t/**\n\t * Constructs a new light shadow.\n\t *\n\t * @param {Camera} camera - The light's view of the world.\n\t */\n\tconstructor( camera ) {\n\n\t\t/**\n\t\t * The light's view of the world.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The intensity of the shadow. The default is `1`.\n\t\t * Valid values are in the range `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 1;\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth\n\t\t * when deciding whether a surface is in shadow.\n\t\t *\n\t\t * The default is `0`. Very tiny adjustments here (in the order of `0.0001`)\n\t\t * may help reduce artifacts in shadows.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along\n\t\t * the object normal. The default is `0`. Increasing this value can be used to\n\t\t * reduce shadow acne especially in large scenes where light shines onto\n\t\t * geometry at a shallow angle. The cost is that shadows may appear distorted.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater\n\t\t * map size will allow for a higher value to be used here before these effects\n\t\t * become visible.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `PCFSoftShadowMap` and\n\t\t * and it is recommended to increase softness by decreasing the shadow map size instead.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `BasicShadowMap`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * The amount of samples to use when blurring a VSM shadow map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.blurSamples = 8;\n\n\t\t/**\n\t\t * Defines the width and height of the shadow map. Higher values give better quality\n\t\t * shadows at the cost of computation time. Values must be powers of two.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (512,512)\n\t\t */\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\t/**\n\t\t * The depth map generated using the internal camera; a location beyond a\n\t\t * pixel's depth is in shadow. Computed internally during rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The distribution map generated using the internal camera; an occlusion is\n\t\t * calculated based on the distribution of depths. Computed internally during\n\t\t * rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.mapPass = null;\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map.\n\t\t * This is computed internally during rendering.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow. If you do not require dynamic\n\t\t * lighting / shadows, you may set this to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to `true`, shadow maps will be updated in the next `render` call.\n\t\t * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to\n\t\t * set this property to `true` and then make a render call to update the light's shadow.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\t/**\n\t * Used internally by the renderer to get the number of viewports that need\n\t * to be rendered for this shadow.\n\t *\n\t * @return {number} The viewport count.\n\t */\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\t/**\n\t * Gets the shadow cameras frustum. Used internally by the renderer to cull objects.\n\t *\n\t * @return {Frustum} The shadow camera frustum.\n\t */\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t */\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\t/**\n\t * Returns a viewport definition for the given viewport index.\n\t *\n\t * @param {number} viewportIndex - The viewport index.\n\t * @return {Vector4} The viewport.\n\t */\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\t/**\n\t * Returns the frame extends.\n\t *\n\t * @return {Vector2} The frame extends.\n\t */\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the values of the given light shadow instance to this instance.\n\t *\n\t * @param {LightShadow} source - The light shadow to copy.\n\t * @return {LightShadow} A reference to this light shadow instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new light shadow instance with copied values from this instance.\n\t *\n\t * @return {LightShadow} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the light shadow into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized light shadow.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new spot light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLightShadow = true;\n\n\t\t/**\n\t\t * Used to focus the shadow camera. The camera's field of view is set as a\n\t\t * percentage of the spotlight's field-of-view. Range is `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.focus = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone\n * that increases in size the further from the light it gets.\n *\n * This light can cast shadows - see the {@link SpotLightShadow} for details.\n *\n * ```js\n * // white spotlight shining from the side, modulated by a texture\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 100, 1000, 100 );\n * spotLight.map = new THREE.TextureLoader().load( url );\n *\n * spotLight.castShadow = true;\n * spotLight.shadow.mapSize.width = 1024;\n * spotLight.shadow.mapSize.height = 1024;\n * spotLight.shadow.camera.near = 500;\n * spotLight.shadow.camera.far = 4000;\n * spotLight.shadow.camera.fov = 30;s\n * ```\n *\n * @augments Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * Constructs a new spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The spot light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * Maximum range of the light. `0` means no limit.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI/3\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Value range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = penumbra;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * A texture used to modulate the color of the light. The spot light\n\t\t * color is mixed with the RGB value of this texture, with a ratio\n\t\t * corresponding to its alpha value. The cookie-like masking effect is\n\t\t * reproduced using pixel values (0, 0, 0, 1-cookie_value).\n\t\t *\n\t\t * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {SpotLightShadow}\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents the shadow configuration of point lights.\n *\n * @augments LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new point light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( -1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, -1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, -1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, -1 )\n\t\t];\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t * @param {number} [viewportIndex=0] - The viewport index.\n\t */\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions. A common\n * use case for this is to replicate the light emitted from a bare\n * lightbulb.\n *\n * This light can cast shadows - see the {@link PointLightShadow} for details.\n *\n * ```js\n * const light = new THREE.PointLight( 0xff0000, 1, 100 );\n * light.position.set( 50, 50, 50 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * Constructs a new point light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\t/**\n\t\t * When distance is zero, light will attenuate according to inverse-square\n\t\t * law to infinite distance. When distance is non-zero, light will attenuate\n\t\t * according to inverse-square law until near the distance cutoff, where it\n\t\t * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not\n\t\t * physically correct.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {PointLightShadow}\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Camera that uses [orthographic projection]{@link https://en.wikipedia.org/wiki/Orthographic_projection}.\n *\n * In this projection mode, an object's size in the rendered image stays\n * constant regardless of its distance from the camera. This can be useful\n * for rendering 2D scenes and UI elements, amongst other things.\n *\n * ```js\n * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass OrthographicCamera extends Camera {\n\n\t/**\n\t * Constructs a new orthographic camera.\n\t *\n\t * @param {number} [left=-1] - The left plane of the camera's frustum.\n\t * @param {number} [right=1] - The right plane of the camera's frustum.\n\t * @param {number} [top=1] - The top plane of the camera's frustum.\n\t * @param {number} [bottom=-1] - The bottom plane of the camera's frustum.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * The left plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.left = left;\n\n\t\t/**\n\t\t * The right plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.right = right;\n\n\t\t/**\n\t\t * The top plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.top = top;\n\n\t\t/**\n\t\t * The bottom plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.bottom = bottom;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link OrthographicCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link PerspectiveCamera}, `0` is a\n\t\t * valid value for an orthographic camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link OrthographicCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t * @see {@link PerspectiveCamera#setViewOffset}\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new directional light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction. This light will behave\n * as though it is infinitely far away and the rays produced from it are all\n * parallel. The common use case for this is to simulate daylight; the sun is\n * far enough away that its position can be considered to be infinite, and\n * all light rays coming from it are parallel.\n *\n * A common point of confusion for directional lights is that setting the\n * rotation has no effect. This is because three.js's DirectionalLight is the\n * equivalent to what is often called a 'Target Direct Light' in other\n * applications.\n *\n * This means that its direction is calculated as pointing from the light's\n * {@link Object3D#position} to the {@link DirectionalLight#target} position\n * (as opposed to a 'Free Direct Light' that just has a rotation\n * component).\n *\n * This light can cast shadows - see the {@link DirectionalLightShadow} for details.\n *\n * ```js\n * // White directional light at half intensity shining from the top.\n * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n * scene.add( directionalLight );\n * ```\n *\n * @augments Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * Constructs a new directional light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The directional light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {DirectionalLightShadow}\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n *\n * It cannot be used to cast shadows as it does not have a direction.\n *\n * ```js\n * const light = new THREE.AmbientLight( 0x404040 ); // soft white light\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * Constructs a new ambient light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\n/**\n * This class emits light uniformly across the face a rectangular plane.\n * This light type can be used to simulate light sources such as bright\n * windows or strip lighting.\n *\n * Important Notes:\n *\n * - There is no shadow support.\n * - Only PBR materials are supported.\n * - You have to include `RectAreaLightUniformsLib` (`WebGLRenderer`) or `RectAreaLightTexturesLib` (`WebGPURenderer`)\n * into your app and init the uniforms/textures.\n *\n * ```js\n * RectAreaLightUniformsLib.init(); // only relevant for WebGLRenderer\n * THREE.RectAreaLightNode.setLTC( RectAreaLightTexturesLib.init() ); // only relevant for WebGPURenderer\n *\n * const intensity = 1; const width = 10; const height = 10;\n * const rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );\n * rectLight.position.set( 5, 5, 0 );\n * rectLight.lookAt( 0, 0, 0 );\n * scene.add( rectLight )\n * ```\n *\n * @augments Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * Constructs a new area light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t * @param {number} [width=10] - The width of the light.\n\t * @param {number} [height=10] - The height of the light.\n\t */\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\t/**\n\t\t * The width of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a third-order spherical harmonics (SH). Light probes use this class\n * to encode lighting information.\n *\n * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf}\n * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf}\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Constructs a new spherical harmonics.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given SH coefficients to this instance by copying\n\t * the values.\n\t *\n\t * @param {Array} coefficients - The SH coefficients.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets all SH coefficients to `0`.\n\t *\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The radiance.\n\t */\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the\n\t * direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The irradiance.\n\t */\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * A convenience method for performing {@link SphericalHarmonics3#add} and\n\t * {@link SphericalHarmonics3#scale} at once.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this SH by the given scale factor.\n\t *\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given\n\t * alpha factor.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this spherical harmonics is equal with the given one.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality.\n\t * @return {boolean} Whether this spherical harmonics is equal with the given one.\n\t */\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical harmonics to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to copy.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\t/**\n\t * Returns a new spherical harmonics with copied values from this instance.\n\t *\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the SH coefficients of this instance from the given array.\n\t *\n\t * @param {Array} array - An array holding the SH coefficients.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array with the SH coefficients, or copies them into the provided\n\t * array. The coefficients are represented as numbers.\n\t *\n\t * @param {Array} [array=[]] - The target array.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {Array} An array with flat SH coefficients.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Array} shBasis - The target array holding the SH basis.\n\t */\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\n/**\n * Light probes are an alternative way of adding light to a 3D scene. Unlike\n * classical light sources (e.g. directional, point or spot lights), light\n * probes do not emit light. Instead they store information about light\n * passing through 3D space. During rendering, the light that hits a 3D\n * object is approximated by using the data from the light probe.\n *\n * Light probes are usually created from (radiance) environment maps. The\n * class {@link LightProbeGenerator} can be used to create light probes from\n * cube textures or render targets. However, light estimation data could also\n * be provided in other forms e.g. by WebXR. This enables the rendering of\n * augmented reality content that reacts to real world lighting.\n *\n * The current probe implementation in three.js supports so-called diffuse\n * light probes. This type of light probe is functionally equivalent to an\n * irradiance environment map.\n *\n * @augments Light\n */\nclass LightProbe extends Light {\n\n\t/**\n\t * Constructs a new light probe.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightProbe = true;\n\n\t\t/**\n\t\t * A light probe uses spherical harmonics to encode lighting information.\n\t\t *\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deserializes the light prove from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized light probe.\n\t * @return {LightProbe} A reference to this light probe.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass MaterialLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\t\tthis.textures = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = this.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\tcreateMaterialFromType( type ) {\n\n\t\treturn MaterialLoader.createMaterialFromType( type );\n\n\t}\n\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\nclass LoaderUtils {\n\n\tstatic decodeText( array ) { // @deprecated, r165\n\n\t\tconsole.warn( 'THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead.' );\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor ( let i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t}\n\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass BufferGeometryLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ObjectLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( `THREE.ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._visibility = data.visibility;\n\t\t\t\tobject._active = data.active;\n\t\t\t\tobject._bounds = data.bounds.map( bound => {\n\n\t\t\t\t\tconst box = new Box3();\n\t\t\t\t\tbox.min.fromArray( bound.boxMin );\n\t\t\t\t\tbox.max.fromArray( bound.boxMax );\n\n\t\t\t\t\tconst sphere = new Sphere();\n\t\t\t\t\tsphere.radius = bound.sphereRadius;\n\t\t\t\t\tsphere.center.fromArray( bound.sphereCenter );\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tboxInitialized: bound.boxInitialized,\n\t\t\t\t\t\tbox: box,\n\n\t\t\t\t\t\tsphereInitialized: bound.sphereInitialized,\n\t\t\t\t\t\tsphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\t\t\t\tif ( data.colorsTexture !== undefined ) object._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nclass ImageBitmapLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t}\n\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t} ).catch( e => {\n\n\t\t\t\t\tif ( onError ) onError( e );\n\n\t\t\t\t} );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tCache.remove( url );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( url, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n}\n\nlet _context;\n\n/**\n * Manages the global audio context in the engine.\n *\n * @hideconstructor\n */\nclass AudioContext {\n\n\t/**\n\t * Returns the global native audio context.\n\t *\n\t * @return {AudioContext} The native audio context.\n\t */\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\t/**\n\t * Allows to set the global native audio context from outside.\n\t *\n\t * @param {AudioContext} value - The native context to set.\n\t */\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\nclass AudioLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * A special type of camera that uses two perspective cameras with\n * stereoscopic projection. Can be used for rendering stereo effects\n * like [3D Anaglyph]{@link https://en.wikipedia.org/wiki/Anaglyph_3D} or\n * [Parallax Barrier]{@link https://en.wikipedia.org/wiki/parallax_barrier}.\n */\nclass StereoCamera {\n\n\t/**\n\t * Constructs a new stereo camera.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'StereoCamera';\n\n\t\t/**\n\t\t * The aspect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t\t/**\n\t\t * The eye separation which represents the distance\n\t\t * between the left and right camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.064\n\t\t */\n\t\tthis.eyeSep = 0.064;\n\n\t\t/**\n\t\t * The camera representing the left eye. This is added to layer `1` so objects to be\n\t\t * rendered by the left camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The camera representing the right eye. This is added to layer `2` so objects to be\n\t\t * rendered by the right camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the stereo camera based on the given perspective camera.\n\t *\n\t * @param {PerspectiveCamera} camera - The perspective camera.\n\t */\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\n/**\n * This type of camera can be used in order to efficiently render a scene with a\n * predefined set of cameras. This is an important performance aspect for\n * rendering VR scenes.\n *\n * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory\n * to define for each sub camera the `viewport` property which determines the\n * part of the viewport that is rendered with this camera.\n *\n * @augments PerspectiveCamera\n */\nclass ArrayCamera extends PerspectiveCamera {\n\n\t/**\n\t * Constructs a new array camera.\n\t *\n\t * @param {Array} [array=[]] - An array of perspective sub cameras.\n\t */\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayCamera = true;\n\n\t\t/**\n\t\t * An array of perspective sub cameras.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.cameras = array;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nclass Clock {\n\n\tconstructor( autoStart = true ) {\n\n\t\tthis.autoStart = autoStart;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tstart() {\n\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nfunction now() {\n\n\treturn performance.now();\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\nconst _orientation$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * The class represents a virtual listener of the all positional and non-positional audio effects\n * in the scene. A three.js application usually creates a single listener. It is a mandatory\n * constructor parameter for audios entities like {@link Audio} and {@link PositionalAudio}.\n *\n * In most cases, the listener object is a child of the camera. So the 3D transformation of the\n * camera represents the 3D transformation of the listener.\n *\n * @augments Object3D\n */\nclass AudioListener extends Object3D {\n\n\t/**\n\t * Constructs a new audio listener.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\t/**\n\t\t * The native audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = AudioContext.getContext();\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\t/**\n\t\t * An optional filter.\n\t\t *\n\t\t * Defined via {@AudioListener#setFilter}.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.filter = null;\n\n\t\t/**\n\t\t * Time delta values required for `linearRampToValueAtTime()` usage.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\t/**\n\t * Returns the listener's input node.\n\t *\n\t * This method is used by other audio nodes to connect to this listener.\n\t *\n\t * @return {GainNode} The input node.\n\t */\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Removes the current filter from this listener.\n\t *\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filter.\n\t *\n\t * @return {AudioNode} The filter.\n\t */\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\t/**\n\t * Sets the given filter to this listener.\n\t *\n\t * @param {AudioNode} value - The filter to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the applications master volume.\n\t *\n\t * @return {number} The master volume.\n\t */\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the applications master volume. This volume setting affects\n\t * all audio nodes in the scene.\n\t *\n\t * @param {number} value - The master volume to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t_orientation$1.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a non-positional ( global ) audio object.\n *\n * This and related audio modules make use of the [Web Audio API]{@link https://www.w3.org/TR/webaudio-1.1/}.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create a global audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop( true );\n * \tsound.setVolume( 0.5 );\n * \tsound.play();\n * });\n * ```\n *\n * @augments Object3D\n */\nclass Audio extends Object3D {\n\n\t/**\n\t * Constructs a new audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AudioListener}\n\t\t * @readonly\n\t\t */\n\t\tthis.listener = listener;\n\n\t\t/**\n\t\t * The audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = listener.context;\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\t/**\n\t\t * Whether to start playback automatically or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoplay = false;\n\n\t\t/**\n\t\t * A reference to an audio buffer.\n\t\t *\n\t\t * Defined via {@link Audio#setBuffer}.\n\t\t *\n\t\t * @type {?AudioBuffer}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * Modify pitch, measured in cents. +/- 100 is a semitone.\n\t\t * +/- 1200 is an octave.\n\t\t *\n\t\t * Defined via {@link Audio#setDetune}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.detune = 0;\n\n\t\t/**\n\t\t * Whether the audio should loop or not.\n\t\t *\n\t\t * Defined via {@link Audio#setLoop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.loop = false;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * start, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopStart = 0;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * stop, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopEnd = 0;\n\n\t\t/**\n\t\t * An offset to the time within the audio buffer the playback\n\t\t * should begin, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = 0;\n\n\t\t/**\n\t\t * Overrides the default duration of the audio.\n\t\t *\n\t\t * @type {undefined|number}\n\t\t * @default undefined\n\t\t */\n\t\tthis.duration = undefined;\n\n\t\t/**\n\t\t * The playback speed.\n\t\t *\n\t\t * Defined via {@link Audio#setPlaybackRate}.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 1\n\t\t */\n\t\tthis.playbackRate = 1;\n\n\t\t/**\n\t\t * Indicates whether the audio is playing or not.\n\t\t *\n\t\t * This flag will be automatically set when using {@link Audio#play},\n\t\t * {@link Audio#pause}, {@link Audio#stop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPlaying = false;\n\n\t\t/**\n\t\t * Indicates whether the audio playback can be controlled\n\t\t * with method like {@link Audio#play} or {@link Audio#pause}.\n\t\t *\n\t\t * This flag will be automatically set when audio sources are\n\t\t * defined.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.hasPlaybackControl = true;\n\n\t\t/**\n\t\t * Holds a reference to the current audio source.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @readonly\n\t\t * @default null\n\t\t */\n\t\tthis.source = null;\n\n\t\t/**\n\t\t * Defines the source type.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {('empty'|'audioNode'|'mediaNode'|'mediaStreamNode'|'buffer')}\n\t\t * @readonly\n\t\t * @default 'empty'\n\t\t */\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\t/**\n\t\t * Can be used to apply a variety of low-order filters to create\n\t\t * more complex sound effects e.g. via `BiquadFilterNode`.\n\t\t *\n\t\t * The property is automatically set by {@link Audio#setFilters}.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.filters = [];\n\n\t}\n\n\t/**\n\t * Returns the output audio node.\n\t *\n\t * @return {GainNode} The output node.\n\t */\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Sets the given audio node as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media element as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {HTMLMediaElement} mediaElement - The media element.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media stream as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {MediaStream} mediaStream - The media stream.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given audio buffer as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`.\n\t *\n\t * @param {AudioBuffer} audioBuffer - The audio buffer.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\t/**\n\t * Pauses the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tstop( delay = 0 ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop( this.context.currentTime + delay );\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio} A reference to this instance.\n\t */\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filters.\n\t *\n\t * @return {Array} The list of filters.\n\t */\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\t/**\n\t * Sets an array of filters and connects them with the audio source.\n\t *\n\t * @param {Array} [value] - A list of filters.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the detuning of oscillation in cents.\n\t *\n\t * @param {number} value - The detuning of oscillation in cents.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the detuning of oscillation in cents.\n\t *\n\t * @return {number} The detuning of oscillation in cents.\n\t */\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\t/**\n\t * Returns the first filter in the list of filters.\n\t *\n\t * @return {AudioNode|undefined} The first filter in the list of filters.\n\t */\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\t/**\n\t * Applies a single filter node to the audio.\n\t *\n\t * @param {AudioNode} [filter] - The filter to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\t/**\n\t * Sets the playback rate.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [value] - The playback rate to set.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current playback rate.\n\n\t * @return {number} The playback rate.\n\t */\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\t/**\n\t * Automatically called when playback finished.\n\t */\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\t\tthis._progress = 0;\n\n\t}\n\n\t/**\n\t * Returns the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {boolean} Whether the audio should loop or not.\n\t */\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\t/**\n\t * Sets the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {boolean} value - Whether the audio should loop or not.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop start value which defines where in the audio buffer the replay should\n\t * start, in seconds.\n\t *\n\t * @param {number} value - The loop start value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop end value which defines where in the audio buffer the replay should\n\t * stop, in seconds.\n\t *\n\t * @param {number} value - The loop end value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the volume.\n\t *\n\t * @return {number} The volume.\n\t */\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the volume.\n\t *\n\t * @param {number} value - The volume to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.sourceType !== 'buffer' ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio source type cannot be copied.' );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.autoplay = source.autoplay;\n\n\t\tthis.buffer = source.buffer;\n\t\tthis.detune = source.detune;\n\t\tthis.loop = source.loop;\n\t\tthis.loopStart = source.loopStart;\n\t\tthis.loopEnd = source.loopEnd;\n\t\tthis.offset = source.offset;\n\t\tthis.duration = source.duration;\n\t\tthis.playbackRate = source.playbackRate;\n\t\tthis.hasPlaybackControl = source.hasPlaybackControl;\n\t\tthis.sourceType = source.sourceType;\n\n\t\tthis.filters = source.filters.slice();\n\n\t\treturn this;\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor( this.listener ).copy( this, recursive );\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents a positional audio object.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create the PositionalAudio object (passing in the listener)\n * const sound = new THREE.PositionalAudio( listener );\n *\n * // load a sound and set it as the PositionalAudio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/song.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setRefDistance( 20 );\n * \tsound.play();\n * });\n *\n * // create an object for the sound to play from\n * const sphere = new THREE.SphereGeometry( 20, 32, 16 );\n * const material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );\n * const mesh = new THREE.Mesh( sphere, material );\n * scene.add( mesh );\n *\n * // finally add the sound to the mesh\n * mesh.add( sound );\n *\n * @augments Audio\n */\nclass PositionalAudio extends Audio {\n\n\t/**\n\t * Constructs a positional audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\t/**\n\t\t * The panner node represents the location, direction, and behavior of an audio\n\t\t * source in 3D space.\n\t\t *\n\t\t * @type {PannerNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\t/**\n\t * Returns the current reference distance.\n\t *\n\t * @return {number} The reference distance.\n\t */\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\t/**\n\t * Defines the reference distance for reducing volume as the audio source moves\n\t * further from the listener – i.e. the distance at which the volume reduction\n\t * starts taking effect.\n\t *\n\t * @param {number} value - The reference distance to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current rolloff factor.\n\t *\n\t * @return {number} The rolloff factor.\n\t */\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\t/**\n\t * Defines how quickly the volume is reduced as the source moves away from the listener.\n\t *\n\t * @param {number} value - The rolloff factor.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current distance model.\n\t *\n\t * @return {('linear'|'inverse'|'exponential')} The distance model.\n\t */\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\t/**\n\t * Defines which algorithm to use to reduce the volume of the audio source\n\t * as it moves away from the listener.\n\t *\n\t * Read [the spec]{@link https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype}\n\t * for more details.\n\t *\n\t * @param {('linear'|'inverse'|'exponential')} value - The distance model to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current max distance.\n\t *\n\t * @return {number} The max distance.\n\t */\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\t/**\n\t * Defines the maximum distance between the audio source and the listener,\n\t * after which the volume is not reduced any further.\n\t *\n\t * This value is used only by the `linear` distance model.\n\t *\n\t * @param {number} value - The max distance.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the directional cone in which the audio can be listened.\n\t *\n\t * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction.\n\t * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter.\n\t * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to analyse audio data.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create an Audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop(true);\n * \tsound.setVolume(0.5);\n * \tsound.play();\n * });\n *\n * // create an AudioAnalyser, passing in the sound and desired fftSize\n * const analyser = new THREE.AudioAnalyser( sound, 32 );\n *\n * // get the average frequency of the sound\n * const data = analyser.getAverageFrequency();\n * ```\n */\nclass AudioAnalyser {\n\n\t/**\n\t * Constructs a new audio analyzer.\n\t *\n\t * @param {Audio} audio - The audio to analyze.\n\t * @param {Audio} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.\n\t */\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AnalyserNode}\n\t\t */\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\t/**\n\t\t * Holds the analyzed data.\n\t\t *\n\t\t * @type {Uint8Array}\n\t\t */\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\t/**\n\t * Returns an array with frequency data of the audio.\n\t *\n\t * Each item in the array represents the decibel value for a specific frequency.\n\t * The frequencies are spread linearly from 0 to 1/2 of the sample rate.\n\t * For example, for 48000 sample rate, the last item of the array will represent\n\t * the decibel value for 24000 Hz.\n\t *\n\t * @return {Uint8Array} The frequency data.\n\t */\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\t/**\n\t * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}.\n\t *\n\t * @return {number} The average frequency.\n\t */\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\nclass PropertyMixer {\n\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'accu'\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t// apply the state of 'accu' to the binding when accus differ\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\nclass PropertyBinding {\n\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.warn( 'THREE.PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.isMaterial === true ) {\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.isObject3D === true ) {\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n *\n * - Instead pass this object as 'root'.\n *\n * - You can also add and remove objects later when the mixer\n * is running.\n *\n * Note:\n *\n * Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done\n * on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the\n * all objects in the group.\n *\n * - A single property can either be controlled through a\n * target group or directly, but not both.\n */\n\nclass AnimationObjectGroup {\n\n\tconstructor() {\n\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// remove & forget\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\nclass AnimationAction {\n\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\t\tthis.paused = false; // true -> zero effective time scale\n\t\tthis.enabled = true; // false -> zero effective weight\n\n\t\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n\t}\n\n\t// State & Scheduling\n\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t// return true when play has been called\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\tcrossFadeFrom( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcrossFadeTo( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Object Accessors\n\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n\nclass AnimationMixer extends EventDispatcher {\n\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\t\tthis.time = 0;\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t// get an existing action\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// advance the time and update apply the animation\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Allows you to seek to a specific time in an animation.\n\tsetTime( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t// return this mixer's root target object\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t// free all resources specific to a particular clip\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remove a targeted clip from the cache\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\nclass RenderTarget3D extends RenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isRenderTarget3D = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass RenderTargetArray extends RenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isRenderTargetArray = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass Uniform {\n\n\tconstructor( value ) {\n\n\t\tthis.value = value;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\nclass UniformsGroup extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isUniformsGroup = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\tthis.name = '';\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.uniforms = [];\n\n\t}\n\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\nclass GLBufferAttribute {\n\n\tconstructor( buffer, type, itemSize, elementSize, count ) {\n\n\t\tthis.isGLBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.buffer = buffer;\n\t\tthis.type = type;\n\t\tthis.itemSize = itemSize;\n\t\tthis.elementSize = elementSize;\n\t\tthis.count = count;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\nclass Raycaster {\n\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.camera = null;\n\t\tthis.layers = new Layers();\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Spherical coordinates]{@link https://en.wikipedia.org/wiki/Spherical_coordinate_system}.\n */\nclass Spherical {\n\n\t/**\n\t * Constructs a new spherical.\n\t *\n\t * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t * @param {number} [phi=0] - The polar angle in radians from the y (up) axis.\n\t * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.\n\t */\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\t/**\n\t\t * The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The polar angle in radians from the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.phi = phi;\n\n\t\t/**\n\t\t * The equator/azimuthal angle in radians around the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t}\n\n\t/**\n\t * Sets the spherical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The polar angle.\n\t * @param {number} theta - The azimuthal angle.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical to this instance.\n\t *\n\t * @param {Spherical} other - The spherical to copy.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -\n\t * `0.000001`.\n\t *\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = clamp( this.phi, EPS, Math.PI - EPS );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new spherical with copied values from this instance.\n\t *\n\t * @return {Spherical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Cylindrical coordinates]{@link https://en.wikipedia.org/wiki/Cylindrical_coordinate_system}.\n */\nclass Cylindrical {\n\n\t/**\n\t * Constructs a new cylindrical.\n\t *\n\t * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane.\n\t * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t * @param {number} [y=0] - The height above the x-z plane.\n\t */\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\t/**\n\t\t * The distance from the origin to a point in the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t\t/**\n\t\t * The height above the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle.\n\t * @param {number} y - The height value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given cylindrical to this instance.\n\t *\n\t * @param {Cylindrical} other - The cylindrical to copy.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new cylindrical with copied values from this instance.\n\t *\n\t * @return {Cylindrical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 2x2 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix2#set} method take arguments in\n * [row-major]{@link https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order}\n * order, while internally they are stored in the {@link Matrix2#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix2();\n * m.set( 11, 12,\n * 21, 22 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21,\n * 12, 22 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix2 {\n\n\t/**\n\t * Constructs a new 2x2 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t */\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 2x2 identity matrix.\n\t *\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} n11 - 1-1 matrix element.\n\t * @param {number} n12 - 1-2 matrix element.\n\t * @param {number} n21 - 2-1 matrix element.\n\t * @param {number} n22 - 2-2 matrix element.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox2 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector2} min - The lower boundary of the box.\n\t * @param {Vector2} max - The upper boundary of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 2D position data as instances of {@link Vector2}.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector2} center - The center of the box.\n\t * @param {Vector2} size - The x and y dimensions of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box2} box - The box to copy.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 2D.\n\t *\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector2} point - The point that should be included by the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions.\n\t *\n\t * @param {Vector2} vector - The vector that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector2} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width and height.\n\t *\n\t * @param {Vector2} point - A point in 2D space.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} A point as a proportion of this box's width and height.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector2} point - The point to clamp.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector2} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box2} box - The bounding box to intersect with.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box2} box - The bounding box that will be unioned with this instance.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 2D space.\n\t *\n\t * @param {Vector2} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box2} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical line segment in 3D space represented by a start and end point.\n */\nclass Line3 {\n\n\t/**\n\t * Constructs a new line segment.\n\t *\n\t * @param {Vector3} [start=(0,0,0)] - Start of the line segment.\n\t * @param {Vector3} [end=(0,0,0)] - End of the line segment.\n\t */\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\t/**\n\t\t * Start of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * End of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t}\n\n\t/**\n\t * Sets the start and end values by copying the given vectors.\n\t *\n\t * @param {Vector3} start - The start point.\n\t * @param {Vector3} end - The end point.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given line segment to this instance.\n\t *\n\t * @param {Line3} line - The line segment to copy.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center of the line segment.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the delta vector of the line segment's start and end point.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\t/**\n\t * Returns the squared Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The squared Euclidean distance.\n\t */\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\t/**\n\t * Returns the Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The Euclidean distance.\n\t */\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\t/**\n\t * Returns a vector at a certain position along the line segment.\n\t *\n\t * @param {number} t - A value between `[0,1]` to represent a position along the line segment.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns a point parameter based on the closest point as projected on the line segment.\n\t *\n\t * @param {Vector3} point - The point for which to return a point parameter.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @return {number} The point parameter.\n\t */\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns the closets point on the line for a given point.\n\t *\n\t * @param {Vector3} point - The point to compute the closest point on the line for.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the line.\n\t */\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Applies a 4x4 transformation matrix to this line segment.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this line segment is equal with the given one.\n\t *\n\t * @param {Line3} line - The line segment to test for equality.\n\t * @return {boolean} Whether this line segment is equal with the given one.\n\t */\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\t/**\n\t * Returns a new line segment with copied values from this instance.\n\t *\n\t * @return {Line3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This displays a cone shaped helper object for a {@link SpotLight}.\n *\n * ```js\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 10, 10, 10 );\n * scene.add( spotLight );\n *\n * const spotLightHelper = new THREE.SpotLightHelper( spotLight );\n * scene.add( spotLightHelper );\n * ```\n *\n * @augments Object3D\n */\nclass SpotLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new spot light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {SpotLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n/**\n * A helper object to assist with visualizing a {@link Skeleton}.\n *\n * ```js\n * const helper = new THREE.SkeletonHelper( skinnedMesh );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass SkeletonHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {Object3D} object - Usually an instance of {@link SkinnedMesh}. However, any 3D object\n\t * can be used if it represents a hierarchy of bones (see {@link Bone}).\n\t */\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color( 0, 0, 1 );\n\t\tconst color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\t/**\n\t\t * The object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = object;\n\n\t\t/**\n\t\t * he list of bones that the helper visualizes.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push( ...getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\n/**\n * This displays a helper object consisting of a spherical mesh for\n * visualizing an instance of {@link PointLight}.\n *\n * ```js\n * const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );\n * pointLight.position.set( 10, 10, 10 );\n * scene.add( pointLight );\n *\n * const sphereSize = 1;\n * const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );\n * scene.add( pointLightHelper );\n * ```\n *\n * @augments Mesh\n */\nclass PointLightHelper extends Mesh {\n\n\t/**\n\t * Constructs a new point light helper.\n\t *\n\t * @param {PointLight} light - The light to be visualized.\n\t * @param {number} [sphereSize=1] - The size of the sphere helper.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\n/**\n * Creates a visual aid consisting of a spherical mesh for a\n * given {@link HemisphereLight}.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * const helper = new THREE.HemisphereLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass HemisphereLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The size of the mesh used to visualize the light.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\n/**\n * The helper is an object to define grids. Grids are two-dimensional\n * arrays of lines.\n *\n * ```js\n * const size = 10;\n * const divisions = 10;\n *\n * const gridHelper = new THREE.GridHelper( size, divisions );\n * scene.add( gridHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass GridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new grid helper.\n\t *\n\t * @param {number} [size=10] - The size of the grid.\n\t * @param {number} [divisions=10] - The number of divisions across the grid.\n\t * @param {number|Color|string} [color1=0x444444] - The color of the center line.\n\t * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid.\n\t */\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This helper is an object to define polar grids. Grids are\n * two-dimensional arrays of lines.\n *\n * ```js\n * const radius = 10;\n * const sectors = 16;\n * const rings = 8;\n * const divisions = 64;\n *\n * const helper = new THREE.PolarGridHelper( radius, sectors, rings, divisions );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass PolarGridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new polar grid helper.\n\t *\n\t * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number.\n\t * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer.\n\t * @param {number} [rings=16] - The number of rings. This can be any positive integer.\n\t * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer.\n\t * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements.\n\t * @param {number|Color|string} [color2=0x888888] - The second color used for grid elements.\n\t */\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Helper object to assist with visualizing a {@link DirectionalLight}'s\n * effect on the scene. This consists of plane and a line representing the\n * light's position and direction.\n *\n * ```js\n * const light = new THREE.DirectionalLight( 0xFFFFFF );\n * scene.add( light );\n *\n * const helper = new THREE.DirectionalLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass DirectionalLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new directional light helper.\n\t *\n\t * @param {DirectionalLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The dimensions of the plane.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\t/**\n\t\t * Contains the line showing the location of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\t/**\n\t\t * Represents the target line of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n * This helps with visualizing what a camera contains in its frustum. It\n * visualizes the frustum of a camera using a line segments.\n *\n * Based on frustum visualization in [lightgl.js shadowmap example]{@link https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html}.\n *\n * `CameraHelper` must be a child of the scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n * const helper = new THREE.CameraHelper( camera );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass CameraHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Camera} camera - The camera to visualize.\n\t */\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\t/**\n\t\t * The camera being visualized.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This contains the points used to visualize the camera.\n\t\t *\n\t\t * @type {Object>}\n\t\t */\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} frustum - The frustum line color.\n\t * @param {Color} cone - The cone line color.\n\t * @param {Color} up - The up line color.\n\t * @param {Color} target - The target line color.\n\t * @param {Color} cross - The cross line color.\n\t */\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the helper based on the projection matrix of the camera.\n\t */\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// Adjust z values based on coordinate system\n\t\tconst nearZ = this.camera.coordinateSystem === WebGLCoordinateSystem ? -1 : 0;\n\n\t\t// center / target\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, nearZ );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, -1, -1, nearZ );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, -1, nearZ );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, -1, h, nearZ );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, nearZ );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, -1, -1, 1 );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, -1, 1 );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, -1, h, 1 );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, -1 * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, nearZ );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, -1, 0, 1 );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, -1, 1 );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, -1, 0, nearZ );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, nearZ );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, -1, nearZ );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, nearZ );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\n/**\n * Helper object to graphically show the world-axis-aligned bounding box\n * around an object. The actual bounding box is handled with {@link Box3},\n * this is just a visual helper for debugging. It can be automatically\n * resized with {@link BoxHelper#update} when the object it's created from\n * is transformed. Note that the object must have a geometry for this to work,\n * so it won't work with sprites.\n *\n * ```js\n * const sphere = new THREE.SphereGeometry();\n * const object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );\n * const box = new THREE.BoxHelper( object, 0xffff00 );\n * scene.add( box );\n * ```\n *\n * @augments LineSegments\n */\nclass BoxHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new box helper.\n\t *\n\t * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The 3D object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper's geometry to match the dimensions of the object,\n\t * including any children.\n\t */\n\tupdate() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\t/**\n\t * Updates the wireframe box for the passed object.\n\t *\n\t * @param {Object3D} object - The 3D object to create the helper for.\n\t * @return {BoxHelper} A reference to this instance.\n\t */\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Box3}.\n *\n * ```js\n * const box = new THREE.Box3();\n * box.setFromCenterAndSize( new THREE.Vector3( 1, 1, 1 ), new THREE.Vector3( 2, 1, 3 ) );\n *\n * const helper = new THREE.Box3Helper( box, 0xffff00 );\n * scene.add( helper )\n * ```\n *\n * @augments LineSegments\n */\nclass Box3Helper extends LineSegments {\n\n\t/**\n\t * Constructs a new box3 helper.\n\t *\n\t * @param {Box3} box - The box to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The box being visualized.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Plane}.\n *\n * ```js\n * const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );\n * const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );\n * scene.add( helper );\n * ```\n *\n * @augments Line\n */\nclass PlaneHelper extends Line {\n\n\t/**\n\t * Constructs a new plane helper.\n\t *\n\t * @param {Plane} plane - The plane to be visualized.\n\t * @param {number} [size=1] - The side length of plane helper.\n\t * @param {number|Color|string} [hex=0xffff00] - The helper's color.\n\t */\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\t/**\n\t\t * The plane being visualized.\n\t\t *\n\t\t * @type {Plane}\n\t\t */\n\t\tthis.plane = plane;\n\n\t\t/**\n\t\t * The side length of plane helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\n/**\n * An 3D arrow object for visualizing directions.\n *\n * ```js\n * const dir = new THREE.Vector3( 1, 2, 0 );\n *\n * //normalize the direction vector (convert to vector of length 1)\n * dir.normalize();\n *\n * const origin = new THREE.Vector3( 0, 0, 0 );\n * const length = 1;\n * const hex = 0xffff00;\n *\n * const arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );\n * scene.add( arrowHelper );\n * ```\n *\n * @augments Object3D\n */\nclass ArrowHelper extends Object3D {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector.\n\t * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts.\n\t * @param {number} [length=1] - Length of the arrow in world units.\n\t * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\t/**\n\t\t * The line part of the arrow helper.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\t/**\n\t\t * The cone part of the arrow helper.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\t/**\n\t * Sets the direction of the helper.\n\t *\n\t * @param {Vector3} dir - The normalized direction vector.\n\t */\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the length of the helper.\n\t *\n\t * @param {number} length - Length of the arrow in world units.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\t/**\n\t * Sets the color of the helper.\n\t *\n\t * @param {number|Color|string} color - The color to set.\n\t */\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\n/**\n * An axis object to visualize the 3 axes in a simple way.\n * The X axis is red. The Y axis is green. The Z axis is blue.\n *\n * ```js\n * const axesHelper = new THREE.AxesHelper( 5 );\n * scene.add( axesHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass AxesHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new axes helper.\n\t *\n\t * @param {number} [size=1] - Size of the lines representing the axes.\n\t */\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\t/**\n\t * Defines the colors of the axes helper.\n\t *\n\t * @param {number|Color|string} xAxisColor - The color for the x axis.\n\t * @param {number|Color|string} yAxisColor - The color for the y axis.\n\t * @param {number|Color|string} zAxisColor - The color for the z axis.\n\t * @return {AxesHelper} A reference to this axes helper.\n\t */\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This class is used to convert a series of paths to an array of\n * shapes. It is specifically used in context of fonts and SVG.\n */\nclass ShapePath {\n\n\t/**\n\t * Constructs a new shape path.\n\t */\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\t/**\n\t\t * The color of the shape.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The paths that have been generated for this shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default null\n\t\t */\n\t\tthis.subPaths = [];\n\n\t\t/**\n\t\t * The current path that is being generated.\n\t\t *\n\t\t * @type {?Path}\n\t\t * @default null\n\t\t */\n\t\tthis.currentPath = null;\n\n\t}\n\n\t/**\n\t * Creates a new path and moves it current point to the given one.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts the paths into an array of shapes.\n\t *\n\t * @param {boolean} isCCW - By default solid shapes are defined clockwise (CW) and holes are defined counterclockwise (CCW).\n\t * If this flag is set to `true`, then those are flipped.\n\t * @return {Array} An array of shapes.\n\t */\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n/**\n * Abstract base class for controls.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Controls extends EventDispatcher {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLDOMElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The object that is managed by the controls.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The HTML element used for event listeners.\n\t\t *\n\t\t * @type {?HTMLDOMElement}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Whether the controls responds to user input or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The internal state of the controls.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.state = -1;\n\n\t\t/**\n\t\t * This object defines the keyboard input of the controls.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = {};\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to the available mouse buttons.\n\t\t * It depends on the control implementation what kind of mouse buttons and actions are supported.\n\t\t *\n\t\t * @type {{LEFT: ?number, MIDDLE: ?number, RIGHT: ?number}}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null };\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to what kind of touch interaction.\n\t\t * It depends on the control implementation what kind of touch interaction and actions are supported.\n\t\t *\n\t\t * @type {{ONE: ?number, TWO: ?number}}\n\t\t */\n\t\tthis.touches = { ONE: null, TWO: null };\n\n\t}\n\n\t/**\n\t * Connects the controls to the DOM. This method has so called \"side effects\" since\n\t * it adds the module's event listeners to the DOM.\n\t */\n\tconnect() {}\n\n\t/**\n\t * Disconnects the controls from the DOM.\n\t */\n\tdisconnect() {}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {}\n\n\t/**\n\t * Controls should implement this method if they have to update their internal state\n\t * per simulation step.\n\t *\n\t * @param {number} [delta] - The time delta in seconds.\n\t */\n\tupdate( /* delta */ ) {}\n\n}\n\n/**\n * Scales the texture as large as possible within its surface without cropping\n * or stretching the texture. The method preserves the original aspect ratio of\n * the texture. Akin to CSS `object-fit: contain`\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Scales the texture to the smallest possible size to fill the surface, leaving\n * no empty space. The method preserves the original aspect ratio of the texture.\n * Akin to CSS `object-fit: cover`.\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n *\n * @param {Texture} texture - The texture.\n * @return {Texture} The updated texture.\n */\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n/**\n * Determines how many bytes must be used to represent the texture.\n *\n * @param {number} width - The width of the texture.\n * @param {number} height - The height of the texture.\n * @param {number} format - The texture's format.\n * @param {number} type - The texture's type.\n * @return {number} The byte length.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase LuminanceFormat:\n\t\t\treturn width * height;\n\t\tcase LuminanceAlphaFormat:\n\t\t\treturn width * height * 2;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\n/**\n * A class containing utility functions for textures.\n *\n * @hideconstructor\n */\nclass TextureUtils {\n\n\t/**\n\t * Scales the texture as large as possible within its surface without cropping\n\t * or stretching the texture. The method preserves the original aspect ratio of\n\t * the texture. Akin to CSS `object-fit: contain`\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic contain( texture, aspect ) {\n\n\t\treturn contain( texture, aspect );\n\n\t}\n\n\t/**\n\t * Scales the texture to the smallest possible size to fill the surface, leaving\n\t * no empty space. The method preserves the original aspect ratio of the texture.\n\t * Akin to CSS `object-fit: cover`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic cover( texture, aspect ) {\n\n\t\treturn cover( texture, aspect );\n\n\t}\n\n\t/**\n\t * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic fill( texture ) {\n\n\t\treturn fill( texture );\n\n\t}\n\n\t/**\n\t * Determines how many bytes must be used to represent the texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} format - The texture's format.\n\t * @param {number} type - The texture's type.\n\t * @return {number} The byte length.\n\t */\n\tstatic getByteLength( width, height, format, type ) {\n\n\t\treturn getByteLength( width, height, format, type );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\tconsole.warn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RenderTargetArray, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, getByteLength, getUnlitUniformColorSpace, mergeUniforms, probeAsync, toNormalizedProjectionMatrix, toReversedProjectionMatrix, warnOnce };\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { Color, Matrix3, Vector2, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, cloneUniforms, BackSide, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, Euler, Matrix4, IntType, RGBAFormat, HalfFloatType, UnsignedByteType, FloatType, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, BufferGeometry, BufferAttribute, WebGLRenderTarget, NoBlending, OrthographicCamera, LinearFilter, LinearSRGBColorSpace, warnOnce, arrayNeedsUint32, Uint32BufferAttribute, Uint16BufferAttribute, Vector4, DataArrayTexture, LessEqualCompare, Texture, DepthTexture, Data3DTexture, CubeTexture, GLSL3, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, LinearTransfer, AddOperation, MixOperation, MultiplyOperation, ObjectSpaceNormalMap, TangentSpaceNormalMap, NormalBlending, DoubleSide, UniformsUtils, Layers, Frustum, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, NearestFilter, LessEqualDepth, AddEquation, SubtractEquation, ReverseSubtractEquation, ZeroFactor, OneFactor, SrcColorFactor, SrcAlphaFactor, SrcAlphaSaturateFactor, DstColorFactor, DstAlphaFactor, OneMinusSrcColorFactor, OneMinusSrcAlphaFactor, OneMinusDstColorFactor, OneMinusDstAlphaFactor, ConstantColorFactor, OneMinusConstantColorFactor, ConstantAlphaFactor, OneMinusConstantAlphaFactor, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, CullFaceNone, CullFaceBack, CullFaceFront, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, MinEquation, MaxEquation, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestMipmapNearestFilter, NearestMipmapLinearFilter, LinearMipmapNearestFilter, LinearMipmapLinearFilter, NeverCompare, AlwaysCompare, LessCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, NoColorSpace, DepthStencilFormat, getByteLength, UnsignedIntType, UnsignedInt248Type, UnsignedShortType, DepthFormat, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, ByteType, ShortType, AlphaFormat, RGBFormat, LuminanceFormat, LuminanceAlphaFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, createCanvasElement, SRGBColorSpace, REVISION, toNormalizedProjectionMatrix, toReversedProjectionMatrix, probeAsync, WebGLCoordinateSystem } from './three.core.js';\nexport { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Fog, FogExp2, FramebufferTexture, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NormalAnimationBlendMode, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, RenderTargetArray, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp } from './three.core.js';\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif ( range.start <= previousRange.start + previousRange.count + 1 ) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660, 0.0556434,\\n\\t\\t-1.5371385, 1.8760108, -0.2040259,\\n\\t\\t-0.4985314, 0.0415560, 1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\\n\\t\\temissiveColor = sRGBTransferEOTF( emissiveColor );\\n\\t#endif\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"vec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferEOTF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\t\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n float x2 = x * x;\\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\\n\\treturn fab;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( const in vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\t\\n\\t\\tfloat lightToPositionLength = length( lightToPosition );\\n\\t\\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 CineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t#else\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$e = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$a = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include \\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$2 = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix[ 3 ];\\n\\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\tfunction dispose() {\n\n\t\tif ( boxMesh !== undefined ) {\n\n\t\t\tboxMesh.geometry.dispose();\n\t\t\tboxMesh.material.dispose();\n\n\t\t\tboxMesh = undefined;\n\n\t\t}\n\n\t\tif ( planeMesh !== undefined ) {\n\n\t\t\tplaneMesh.geometry.dispose();\n\t\t\tplaneMesh.material.dispose();\n\n\t\t\tplaneMesh = undefined;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\tconst reverseDepthBuffer = parameters.reverseDepthBuffer === true && extensions.has( 'EXT_clip_control' );\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\treverseDepthBuffer: reverseDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( -1, 1, -1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, -1 ),\n\t/*@__PURE__*/ new Vector3( -1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ) ];\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._lodPlanes = [];\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\n\t\tthis._blurMaterial = null;\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene\n\t * @param {number} sigma\n\t * @param {number} near\n\t * @param {number} far\n\t * @param {Object} [options={}]\n\t * @return {WebGLRenderTarget}\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t} = options;\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( size );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t * The smallest supported equirectangular image size is 64 x 32.\n\t *\n\t * @param {Texture} equirectangular\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - Optional render target.\n\t * @return {WebGLRenderTarget}\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t * The smallest supported cube size is 16 x 16.\n\t *\n\t * @param {Texture} cubemap\n\t * @param {null} [renderTarget=null] - Optional render target.\n\t * @return {WebGLRenderTarget}\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tthis._lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\t\tconst mesh = new Mesh( this._lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\t\tconst n = this._lodPlanes.length;\n\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( n - i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn\n\t * @param {number} lodOut\n\t * @param {number} sigma\n\t * @param {Vector3} [poleAxis]\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst lodPlanes = [];\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodPlanes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = LessEqualCompare; // #28670\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nconst _m0 = /*@__PURE__*/ new Matrix3();\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace );\n\n\tconst encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`;\n\n\tswitch ( ColorManagement.getTransfer( colorSpace ) ) {\n\n\t\tcase LinearTransfer:\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t\tcase SRGBTransfer:\n\t\t\treturn [ encodingMatrix, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported color space: ', colorSpace );\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\n\treturn [\n\n\t\t`vec4 ${functionName}( vec4 value ) {`,\n\n\t\t`\treturn ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`,\n\n\t\t'}',\n\n\t].join( '\\n' );\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'Cineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase AgXToneMapping:\n\t\t\ttoneMappingName = 'AgX';\n\t\t\tbreak;\n\n\t\tcase NeutralToneMapping:\n\t\t\ttoneMappingName = 'Neutral';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0 );\n\n\tconst r = _v0.x.toFixed( 4 );\n\tconst g = _v0.y.toFixed( 4 );\n\tconst b = _v0.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\tparameters.reverseDepthBuffer ? '#define USE_REVERSEDEPTHBUF' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\t\t\tparameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\tparameters.reverseDepthBuffer ? '#define USE_REVERSEDEPTHBUF' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst reverseDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: material.flatShading === true,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\t\treverseDepthBuffer: reverseDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\t\t\tdecodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.reverseDepthBuffer )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.decodeVideoTextureEmissive )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction has( object ) {\n\n\t\treturn properties.has( object );\n\n\t}\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\thas: has,\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\trenderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst reversedFuncs = {\n\t[ NeverDepth ]: AlwaysDepth,\n\t[ LessDepth ]: GreaterDepth,\n\t[ EqualDepth ]: NotEqualDepth,\n\t[ LessEqualDepth ]: GreaterEqualDepth,\n\n\t[ AlwaysDepth ]: NeverDepth,\n\t[ GreaterDepth ]: LessDepth,\n\t[ NotEqualDepth ]: EqualDepth,\n\t[ GreaterEqualDepth ]: LessEqualDepth,\n};\n\nfunction WebGLState( gl, extensions ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\t\tlet reversed = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetReversed: function ( value ) {\n\n\t\t\t\tif ( reversed !== value ) {\n\n\t\t\t\t\tconst ext = extensions.get( 'EXT_clip_control' );\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst oldDepth = currentDepthClear;\n\t\t\t\t\tcurrentDepthClear = null;\n\t\t\t\t\tthis.setClear( oldDepth );\n\n\t\t\t\t}\n\n\t\t\t\treversed = value;\n\n\t\t\t},\n\n\t\t\tgetReversed: function () {\n\n\t\t\t\treturn reversed;\n\n\t\t\t},\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( reversed ) depthFunc = reversedFuncs[ depthFunc ];\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\tdepth = 1 - depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t\treversed = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\n\t\tdepthBuffer.setReversed( false );\n\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getTargetType( texture ) {\n\n\t\tif ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP;\n\t\tif ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D;\n\t\tif ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY;\n\t\treturn _gl.TEXTURE_2D;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\tconsole.warn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\tproperties.remove( renderTarget.depthTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\tconst isUseMultisampledRTT = useMultisampledRTT( renderTarget );\n\t\t\tif ( isUseMultisampledRTT ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( isMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\tconst textureProperties = properties.get( renderTarget.depthTexture );\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! textureProperties.__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = textureProperties.__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\t// if the bound depth texture has changed\n\t\tif ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {\n\n\t\t\t// fire the dispose event to get rid of stored state associated with the previously bound depth buffer\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tif ( renderTargetProperties.__depthDisposeCallback ) {\n\n\t\t\t\trenderTargetProperties.__depthDisposeCallback();\n\n\t\t\t}\n\n\t\t\t// set up dispose listeners to track when the currently attached buffer is implicitly unbound\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tconst disposeEvent = () => {\n\n\t\t\t\t\tdelete renderTargetProperties.__boundDepthTexture;\n\t\t\t\t\tdelete renderTargetProperties.__depthDisposeCallback;\n\t\t\t\t\tdepthTexture.removeEventListener( 'dispose', disposeEvent );\n\n\t\t\t\t};\n\n\t\t\t\tdepthTexture.addEventListener( 'dispose', disposeEvent );\n\t\t\t\trenderTargetProperties.__depthDisposeCallback = disposeEvent;\n\n\t\t\t}\n\n\t\t\trenderTargetProperties.__boundDepthTexture = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];\n\t\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer === undefined ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer;\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( _gl.TEXTURE_2D );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst targetType = getTargetType( renderTarget );\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( targetType, webglTexture );\n\t\t\t\tgenerateMipmap( targetType );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === LuminanceFormat ) return gl.LUMINANCE;\n\t\tif ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\nclass WebXRDepthSensing {\n\n\tconstructor() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t\tthis.depthNear = 0;\n\t\tthis.depthFar = 0;\n\n\t}\n\n\tinit( renderer, depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new Texture();\n\n\t\t\tconst texProps = renderer.properties.get( texture );\n\t\t\ttexProps.__webglTexture = depthData.texture;\n\n\t\t\tif ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\t\t\t\t// Check that the browser implements the necessary APIs to use an\n\t\t\t\t// XRProjectionLayer rather than an XRWebGLLayer\n\t\t\t\tconst useLayers = typeof XRWebGLBinding !== 'undefined' && 'createProjectionLayer' in XRWebGLBinding.prototype;\n\n\t\t\t\tif ( ! useLayers ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false )\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t *\n\t\t * @param {ArrayCamera} camera - The camera to update.\n\t\t * @param {PerspectiveCamera} cameraL - The left camera.\n\t\t * @param {PerspectiveCamera} cameraR - The right camera.\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Check if the projection uses an infinite far plane.\n\t\t\tif ( projL[ 10 ] === -1 ) {\n\n\t\t\t\t// Use the projection matrix from the left eye.\n\t\t\t\t// The camera offset is sufficient to include the view volumes\n\t\t\t\t// of both eyes (assuming symmetric projections).\n\t\t\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\t\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t\t\t} else {\n\n\t\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t\t// although must now be relative to the new union camera.\n\t\t\t\tconst near2 = near + zOffset;\n\t\t\t\tconst far2 = far + zOffset;\n\t\t\t\tconst left2 = left - xOffset;\n\t\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tlet depthNear = camera.near;\n\t\t\tlet depthFar = camera.far;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tif ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;\n\t\t\t\tif ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\tcameraL.layers.mask = camera.layers.mask | 0b010;\n\t\t\tcameraR.layers.mask = camera.layers.mask | 0b100;\n\t\t\tcameraXR.layers.mask = cameraL.layers.mask | cameraR.layers.mask;\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\t\t\t\tconst gpuDepthSensingEnabled = enabledFeatures &&\n\t\t\t\t\tenabledFeatures.includes( 'depth-sensing' ) &&\n\t\t\t\t\tsession.depthUsage == 'gpu-optimized';\n\n\t\t\t\tif ( gpuDepthSensingEnabled && glBinding ) {\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( renderer, depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconsole.error( 'THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\nclass WebGLRenderer {\n\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t\treverseDepthBuffer = false,\n\t\t} = parameters;\n\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = canvas;\n\n\t\t// Debug configuration container\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = NoToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// transmission render target scale\n\t\tthis.transmissionResolutionScale = 1.0;\n\n\t\t// camera matrices cache\n\n\t\tconst _currentProjectionMatrix = new Matrix4();\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl, extensions );\n\n\t\t\tif ( capabilities.reverseDepthBuffer && reverseDepthBuffer ) {\n\n\t\t\t\tstate.buffers.depth.setReversed( true );\n\n\t\t\t}\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t_this.capabilities = capabilities;\n\t\t\t_this.extensions = extensions;\n\t\t\t_this.properties = properties;\n\t\t\t_this.renderLists = renderLists;\n\t\t\t_this.shadowMap = shadowMap;\n\t\t\t_this.state = state;\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\tthis.xr = xr;\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor( ...arguments );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha( ...arguments );\n\n\t\t};\n\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = targetFormat === RGBAIntegerFormat ||\n\t\t\t\t\t\ttargetFormat === RGIntegerFormat ||\n\t\t\t\t\t\ttargetFormat === RedIntegerFormat;\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = targetType === UnsignedByteType ||\n\t\t\t\t\t\ttargetType === UnsignedIntType ||\n\t\t\t\t\t\ttargetType === UnsignedShortType ||\n\t\t\t\t\t\ttargetType === UnsignedInt248Type ||\n\t\t\t\t\t\ttargetType === UnsignedShort4444Type ||\n\t\t\t\t\t\ttargetType === UnsignedShort5551Type;\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tbits |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t}\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t//\n\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tbackground.dispose();\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'THREE.WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tcurrentRenderState = renderStateStack.pop();\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: 4,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst object = renderItem.object;\n\t\t\t\t\tconst geometry = renderItem.geometry;\n\t\t\t\t\tconst material = renderItem.material;\n\t\t\t\t\tconst group = renderItem.group;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst object = renderItem.object;\n\t\t\t\tconst geometry = renderItem.geometry;\n\t\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\t\tconst group = renderItem.group;\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tconst reverseDepthBuffer = state.buffers.depth.getReversed();\n\n\t\t\t\tif ( reverseDepthBuffer ) {\n\n\t\t\t\t\t_currentProjectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\t\ttoNormalizedProjectionMatrix( _currentProjectionMatrix );\n\t\t\t\t\ttoReversedProjectionMatrix( _currentProjectionMatrix );\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', _currentProjectionMatrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tconst _scratchFrameBuffer = _gl.createFramebuffer();\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t} else if ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t// check if the depth texture is already bound to the frame buffer and that it's been initialized\n\t\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\t\t\tif ( renderTargetProperties.__boundDepthTexture !== depthTexture ) {\n\n\t\t\t\t\t\t// check if the depth texture is compatible\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdepthTexture !== null &&\n\t\t\t\t\t\t\tproperties.has( depthTexture ) &&\n\t\t\t\t\t\t\t( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height )\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tthrow new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Swap the depth buffer to the currently attached one\n\t\t\t\t\t\ttextures.setupDepthRenderbuffer( renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\t// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers\n\t\t\t// being bound that are different sizes.\n\t\t\tif ( activeMipmapLevel !== 0 ) {\n\n\t\t\t\tframebuffer = _scratchFrameBuffer;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\tconst layer = activeCubeFace;\n\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel, layer );\n\n\t\t\t} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {\n\n\t\t\t\t// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.\n\t\t\t\t// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t}\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t// set the active frame buffer to the one we want to read\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\n\t\t\t\t\t// reset the frame buffer to the currently set buffer before waiting\n\t\t\t\t\tconst currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer );\n\n\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t// read the data and delete the buffer\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\treturn buffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\t// support previous signature with position first\n\t\t\tif ( texture.isTexture !== true ) {\n\n\t\t\t\t// @deprecated, r165\n\t\t\t\twarnOnce( 'WebGLRenderer: copyFramebufferToTexture function signature has changed.' );\n\n\t\t\t\tposition = arguments[ 0 ] || null;\n\t\t\t\ttexture = arguments[ 1 ];\n\n\t\t\t}\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tconst _srcFramebuffer = _gl.createFramebuffer();\n\t\tconst _dstFramebuffer = _gl.createFramebuffer();\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {\n\n\t\t\t// support previous signature with dstPosition first\n\t\t\tif ( srcTexture.isTexture !== true ) {\n\n\t\t\t\t// @deprecated, r165\n\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed.' );\n\n\t\t\t\tdstPosition = arguments[ 0 ] || null;\n\t\t\t\tsrcTexture = arguments[ 1 ];\n\t\t\t\tdstTexture = arguments[ 2 ];\n\t\t\t\tdstLevel = arguments[ 3 ] || 0;\n\t\t\t\tsrcRegion = null;\n\n\t\t\t}\n\n\t\t\t// support the previous signature with just a single dst mipmap level\n\t\t\tif ( dstLevel === null ) {\n\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t// @deprecated, r171\n\t\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );\n\t\t\t\t\tdstLevel = srcLevel;\n\t\t\t\t\tsrcLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdstLevel = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// gather the necessary dimensions to copy\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t\t} else {\n\n\t\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\t\theight = Math.floor( image.height * levelScale );\n\t\t\t\tif ( srcTexture.isDataArrayTexture ) {\n\n\t\t\t\t\tdepth = image.depth;\n\n\t\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepth = 1;\n\n\t\t\t\t}\n\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\t// Set up the destination target\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\t// used for copying data from cpu\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\t// set up the src texture\n\t\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;\n\t\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;\n\t\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\t\t\t\tconst srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );\n\t\t\t\tconst dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i );\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) {\n\n\t\t\t\t// get the appropriate frame buffers\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\n\t\t\t\t// bind the frame buffer targets\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// unbind read, draw buffers\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t// copy data into the 3d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// copy data into the 2d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reset values\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\t\t_gl.generateMipmap( glTarget );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.copyTextureToTexture3D = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0 ) {\n\n\t\t\t// support previous signature with source box first\n\t\t\tif ( srcTexture.isTexture !== true ) {\n\n\t\t\t\t// @deprecated, r165\n\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture3D function signature has changed.' );\n\n\t\t\t\tsrcRegion = arguments[ 0 ] || null;\n\t\t\t\tdstPosition = arguments[ 1 ] || null;\n\t\t\t\tsrcTexture = arguments[ 2 ];\n\t\t\t\tdstTexture = arguments[ 3 ];\n\t\t\t\tlevel = arguments[ 4 ] || 0;\n\n\t\t\t}\n\n\t\t\t// @deprecated, r170\n\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use \"copyTextureToTexture\" instead.' );\n\n\t\t\treturn this.copyTextureToTexture( srcTexture, dstTexture, srcRegion, dstPosition, level );\n\n\t\t};\n\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorspace = ColorManagement._getDrawingBufferColorSpace( colorSpace );\n\t\tgl.unpackColorSpace = ColorManagement._getUnpackColorSpace();\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, Data3DTexture, DataArrayTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, LuminanceAlphaFormat, LuminanceFormat, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement };\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst DEV_MODE = true;\nconst ENABLE_EXTRA_SECURITY_HOOKS = true;\nconst ENABLE_SHADYDOM_NOPATCH = true;\nconst NODE_MODE = false;\n// Allows minifiers to rename references to globalThis\nconst global = globalThis;\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n ? (event) => {\n const shouldEmit = global\n .emitLitDebugLogEvents;\n if (!shouldEmit) {\n return;\n }\n global.dispatchEvent(new CustomEvent('lit-debug', {\n detail: event,\n }));\n }\n : undefined;\n// Used for connecting beginRender and endRender events when there are nested\n// renders when errors are thrown preventing an endRender event from being\n// called.\nlet debugLogRenderId = 0;\nlet issueWarning;\nif (DEV_MODE) {\n global.litIssuedWarnings ??= new Set();\n // Issue a warning, if we haven't already.\n issueWarning = (code, warning) => {\n warning += code\n ? ` See https://lit.dev/msg/${code} for more information.`\n : '';\n if (!global.litIssuedWarnings.has(warning)) {\n console.warn(warning);\n global.litIssuedWarnings.add(warning);\n }\n };\n issueWarning('dev-mode', `Lit is in dev mode. Not recommended for production!`);\n}\nconst wrap = ENABLE_SHADYDOM_NOPATCH &&\n global.ShadyDOM?.inUse &&\n global.ShadyDOM?.noPatch === true\n ? global.ShadyDOM.wrap\n : (node) => node;\nconst trustedTypes = global.trustedTypes;\n/**\n * Our TrustedTypePolicy for HTML which is declared using the html template\n * tag function.\n *\n * That HTML is a developer-authored constant, and is parsed with innerHTML\n * before any untrusted expressions have been mixed in. Therefor it is\n * considered safe by construction.\n */\nconst policy = trustedTypes\n ? trustedTypes.createPolicy('lit-html', {\n createHTML: (s) => s,\n })\n : undefined;\nconst identityFunction = (value) => value;\nconst noopSanitizer = (_node, _name, _type) => identityFunction;\n/** Sets the global sanitizer factory. */\nconst setSanitizer = (newSanitizer) => {\n if (!ENABLE_EXTRA_SECURITY_HOOKS) {\n return;\n }\n if (sanitizerFactoryInternal !== noopSanitizer) {\n throw new Error(`Attempted to overwrite existing lit-html security policy.` +\n ` setSanitizeDOMValueFactory should be called at most once.`);\n }\n sanitizerFactoryInternal = newSanitizer;\n};\n/**\n * Only used in internal tests, not a part of the public API.\n */\nconst _testOnlyClearSanitizerFactoryDoNotCallOrElse = () => {\n sanitizerFactoryInternal = noopSanitizer;\n};\nconst createSanitizer = (node, name, type) => {\n return sanitizerFactoryInternal(node, name, type);\n};\n// Added to an attribute name to mark the attribute as bound so we can find\n// it easily.\nconst boundAttributeSuffix = '$lit$';\n// This marker is used in many syntactic positions in HTML, so it must be\n// a valid element name and attribute name. We don't support dynamic names (yet)\n// but this at least ensures that the parse tree is closer to the template\n// intention.\nconst marker = `lit$${Math.random().toFixed(9).slice(2)}$`;\n// String used to tell if a comment is a marker comment\nconst markerMatch = '?' + marker;\n// Text used to insert a comment marker node. We use processing instruction\n// syntax because it's slightly smaller, but parses as a comment node.\nconst nodeMarker = `<${markerMatch}>`;\nconst d = NODE_MODE && global.document === undefined\n ? {\n createTreeWalker() {\n return {};\n },\n }\n : document;\n// Creates a dynamic marker. We never have to search for these in the DOM.\nconst createMarker = () => d.createComment('');\nconst isPrimitive = (value) => value === null || (typeof value != 'object' && typeof value != 'function');\nconst isArray = Array.isArray;\nconst isIterable = (value) => isArray(value) ||\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof value?.[Symbol.iterator] === 'function';\nconst SPACE_CHAR = `[ \\t\\n\\f\\r]`;\nconst ATTR_VALUE_CHAR = `[^ \\t\\n\\f\\r\"'\\`<>=]`;\nconst NAME_CHAR = `[^\\\\s\"'>=/]`;\n// These regexes represent the five parsing states that we care about in the\n// Template's HTML scanner. They match the *end* of the state they're named\n// after.\n// Depending on the match, we transition to a new state. If there's no match,\n// we stay in the same state.\n// Note that the regexes are stateful. We utilize lastIndex and sync it\n// across the multiple regexes used. In addition to the five regexes below\n// we also dynamically create a regex to find the matching end tags for raw\n// text elements.\n/**\n * End of text is: `<` followed by:\n * (comment start) or (tag) or (dynamic tag binding)\n */\nconst textEndRegex = /<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g;\nconst COMMENT_START = 1;\nconst TAG_NAME = 2;\nconst DYNAMIC_TAG_NAME = 3;\nconst commentEndRegex = /-->/g;\n/**\n * Comments not started with \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n`;\n//# sourceMappingURL=close-material-svg.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { html } from 'lit';\nexport default html `\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n`;\n//# sourceMappingURL=controls-svg.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { html } from 'lit';\nexport default html `\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\n`;\n//# sourceMappingURL=view-in-ar-material-svg.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { html, render } from 'lit';\nimport CloseIcon from './assets/close-material-svg.js';\nimport ControlsPrompt from './assets/controls-svg.js';\nimport ARGlyph from './assets/view-in-ar-material-svg.js';\nconst templateResult = html `\n\n
    \n
    \n
    \n \n \n \n
    \n\n
    \n\n \n
    \n \n \n \n
    \n\n
    \n \n \n ${ARGlyph}\n \n \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n ${ControlsPrompt}\n \n
    \n
    \n\n
    \n \n \n
    \n
    \n \n \n
    \n\n
    \n \n\n
    \n \n
    \n
    \n
    \n
    \n
    \n\n
    \n \n \n ${CloseIcon}\n \n \n
    \n
    \n
    \n
    \n \n
    `;\nexport const makeTemplate = (shadowRoot) => {\n render(templateResult, shadowRoot);\n};\n//# sourceMappingURL=template.js.map","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2022, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptDecoder = (function() {\n\t\"use strict\";\n\n\t// Built with clang version 14.0.4\n\t// Built from meshoptimizer 0.18\n\tvar wasm_base = \"b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq:P8Yqdbk;3sezu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfgocl4cifcd4hxdndndndnaoc9WGgmTmbcbhPcehsawcjdfhzalhHinaraH9Rax6midnaraHaxfgl9RcK6mbczhoinawcj;cbfaogifgoc9WfhOdndndndndnaHaic9WfgAco4fRbbaAci4coG4ciGPlbedibkaO9cb83ibaOcwf9cb83ibxikaOalRblalRbbgAco4gCaCciSgCE86bbaocGfalclfaCfgORbbaAcl4ciGgCaCciSgCE86bbaocVfaOaCfgORbbaAcd4ciGgCaCciSgCE86bbaoc7faOaCfgORbbaAciGgAaAciSgAE86bbaoctfaOaAfgARbbalRbegOco4gCaCciSgCE86bbaoc91faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc4faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc93faAaCfgARbbaOciGgOaOciSgOE86bbaoc94faAaOfgARbbalRbdgOco4gCaCciSgCE86bbaoc95faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc96faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc97faAaCfgARbbaOciGgOaOciSgOE86bbaoc98faAaOfgORbbalRbiglco4gAaAciSgAE86bbaoc99faOaAfgORbbalcl4ciGgAaAciSgAE86bbaoc9:faOaAfgORbbalcd4ciGgAaAciSgAE86bbaocufaOaAfgoRbbalciGglalciSglE86bbaoalfhlxdkaOalRbwalRbbgAcl4gCaCcsSgCE86bbaocGfalcwfaCfgORbbaAcsGgAaAcsSgAE86bbaocVfaOaAfgORbbalRbegAcl4gCaCcsSgCE86bbaoc7faOaCfgORbbaAcsGgAaAcsSgAE86bbaoctfaOaAfgORbbalRbdgAcl4gCaCcsSgCE86bbaoc91faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc4faOaAfgORbbalRbigAcl4gCaCcsSgCE86bbaoc93faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc94faOaAfgORbbalRblgAcl4gCaCcsSgCE86bbaoc95faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc96faOaAfgORbbalRbvgAcl4gCaCcsSgCE86bbaoc97faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc98faOaAfgORbbalRbogAcl4gCaCcsSgCE86bbaoc99faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc9:faOaAfgORbbalRbrglcl4gAaAcsSgAE86bbaocufaOaAfgoRbbalcsGglalcsSglE86bbaoalfhlxekaOal8Pbb83bbaOcwfalcwf8Pbb83bbalczfhlkdnaiam9pmbaiczfhoaral9RcL0mekkaiam6mialTmidnakTmbawaPfRbbhOcbhoazhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkkazcefhzaPcefgPad6hsalhHaPad9hmexvkkcbhlasceGmdxikalaxad2fhCdnakTmbcbhHcehsawcjdfhminaral9Rax6mialTmdalaxfhlawaHfRbbhOcbhoamhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkamcefhmaHcefgHad6hsaHad9hmbkaChlxikcbhocehsinaral9Rax6mdalTmealaxfhlaocefgoad6hsadao9hmbkaChlxdkcbhlasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqalmbkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;yzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabavcefciGaiVcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabavcdfciGaiVcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabavcufciGaiVcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabavciGaiVcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2geTmbinababydbgdcwtcw91:Yadce91cjjj;8ifcjjj98G::NUdbabclfhbaecufgembkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaiczfhiaeczfheadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb\";\n\tvar wasm_simd = \"b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;t9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;h8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincehHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAci6hHalhOaAcefgohAaoclSmdxekkcbhlaHceGmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;uzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:EPliuo97eue978Jjjjjbca9Rhidndnadcl9hmbdnaec98GglTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaiaeciGgvcdtgdVcbczad9R;8kbaiabalcdtfglad;8qbbdnavTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkalaiad;8qbbskdnaec98GgxTmbcbhvabhdinadczfglalpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgvax6mbkkaxae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabaxcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbhdabheinaeaepbbbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepkbbaeczfheadclfgdav6mbkkdnaval9pmbaialciGgdcdtgeVcbc;abae9R;8kbaiabavcdtfgvae;8qbbdnadTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepklbkavaiae;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb\";\n\n\tvar detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]);\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar wasm = WebAssembly.validate(detector) ? wasm_simd : wasm_base;\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction decode(fun, target, count, size, source, filter) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar count4 = (count + 3) & ~3;\n\t\tvar tp = sbrk(count4 * size);\n\t\tvar sp = sbrk(source.length);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(source, sp);\n\t\tvar res = fun(tp, count, size, sp, source.length);\n\t\tif (res == 0 && filter) {\n\t\t\tfilter(tp, count4, size);\n\t\t}\n\t\ttarget.set(heap.subarray(tp, tp + count * size));\n\t\tsbrk(tp - sbrk(0));\n\t\tif (res != 0) {\n\t\t\tthrow new Error(\"Malformed buffer data: \" + res);\n\t\t}\n\t}\n\n\tvar filters = {\n\t\tNONE: \"\",\n\t\tOCTAHEDRAL: \"meshopt_decodeFilterOct\",\n\t\tQUATERNION: \"meshopt_decodeFilterQuat\",\n\t\tEXPONENTIAL: \"meshopt_decodeFilterExp\",\n\t};\n\n\tvar decoders = {\n\t\tATTRIBUTES: \"meshopt_decodeVertexBuffer\",\n\t\tTRIANGLES: \"meshopt_decodeIndexBuffer\",\n\t\tINDICES: \"meshopt_decodeIndexSequence\",\n\t};\n\n\tvar workers = [];\n\tvar requestId = 0;\n\n\tfunction createWorker(url) {\n\t\tvar worker = {\n\t\t\tobject: new Worker(url),\n\t\t\tpending: 0,\n\t\t\trequests: {}\n\t\t};\n\n\t\tworker.object.onmessage = function(event) {\n\t\t\tvar data = event.data;\n\n\t\t\tworker.pending -= data.count;\n\t\t\tworker.requests[data.id][data.action](data.value);\n\n\t\t\tdelete worker.requests[data.id];\n\t\t};\n\n\t\treturn worker;\n\t}\n\n\tfunction initWorkers(count) {\n\t\tvar source =\n\t\t\t\"var instance; var ready = WebAssembly.instantiate(new Uint8Array([\" + new Uint8Array(unpack(wasm)) + \"]), {})\" +\n\t\t\t\".then(function(result) { instance = result.instance; instance.exports.__wasm_call_ctors(); });\" +\n\t\t\t\"self.onmessage = workerProcess;\" +\n\t\t\tdecode.toString() + workerProcess.toString();\n\n\t\tvar blob = new Blob([source], {type: 'text/javascript'});\n\t\tvar url = URL.createObjectURL(blob);\n\n\t\tfor (var i = 0; i < count; ++i) {\n\t\t\tworkers[i] = createWorker(url);\n\t\t}\n\n\t\tURL.revokeObjectURL(url);\n\t}\n\n\tfunction decodeWorker(count, size, source, mode, filter) {\n\t\tvar worker = workers[0];\n\n\t\tfor (var i = 1; i < workers.length; ++i) {\n\t\t\tif (workers[i].pending < worker.pending) {\n\t\t\t\tworker = workers[i];\n\t\t\t}\n\t\t}\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tvar data = new Uint8Array(source);\n\t\t\tvar id = requestId++;\n\n\t\t\tworker.pending += count;\n\t\t\tworker.requests[id] = { resolve: resolve, reject: reject };\n\t\t\tworker.object.postMessage({ id: id, count: count, size: size, source: data, mode: mode, filter: filter }, [ data.buffer ]);\n\t\t});\n\t}\n\n\tfunction workerProcess(event) {\n\t\tready.then(function() {\n\t\t\tvar data = event.data;\n\t\t\ttry {\n\t\t\t\tvar target = new Uint8Array(data.count * data.size);\n\t\t\t\tdecode(instance.exports[data.mode], target, data.count, data.size, data.source, instance.exports[data.filter]);\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"resolve\", value: target }, [ target.buffer ]);\n\t\t\t} catch (error) {\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"reject\", value: error });\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\tuseWorkers: function(count) {\n\t\t\tinitWorkers(count);\n\t\t},\n\t\tdecodeVertexBuffer: function(target, count, size, source, filter) {\n\t\t\tdecode(instance.exports.meshopt_decodeVertexBuffer, target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeIndexBuffer: function(target, count, size, source) {\n\t\t\tdecode(instance.exports.meshopt_decodeIndexBuffer, target, count, size, source);\n\t\t},\n\t\tdecodeIndexSequence: function(target, count, size, source) {\n\t\t\tdecode(instance.exports.meshopt_decodeIndexSequence, target, count, size, source);\n\t\t},\n\t\tdecodeGltfBuffer: function(target, count, size, source, mode, filter) {\n\t\t\tdecode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeGltfBufferAsync: function(count, size, source, mode, filter) {\n\t\t\tif (workers.length > 0) {\n\t\t\t\treturn decodeWorker(count, size, source, decoders[mode], filters[filter]);\n\t\t\t}\n\n\t\t\treturn ready.then(function() {\n\t\t\t\tvar target = new Uint8Array(count * size);\n\t\t\t\tdecode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t\t\treturn target;\n\t\t\t});\n\t\t}\n\t};\n})();\n\nexport { MeshoptDecoder };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tColorManagement,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\nclass DRACOLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\n\tparse( buffer, onLoad, onError = ()=>{} ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace, onError ).catch( onError );\n\n\t}\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst result = geometryData.attributes[ i ];\n\t\t\tconst name = result.name;\n\t\t\tconst array = result.array;\n\t\t\tconst itemSize = result.itemSize;\n\n\t\t\tconst attribute = new BufferAttribute( array, itemSize );\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, result.vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i );\n\t\t\tColorManagement.toWorkingColorSpace( _color, SRGBColorSpace );\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) => {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorker.toString();\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) => {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) => attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and `.drc` files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) {\n\n\t\tconst numComponents = attribute.num_components();\n\t\tconst numPoints = dracoGeometry.num_points();\n\t\tconst numValues = numPoints * numComponents;\n\t\tconst byteLength = numValues * attributeType.BYTES_PER_ELEMENT;\n\t\tconst dataType = getDracoDataType( draco, attributeType );\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr );\n\t\tconst array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tarray: array,\n\t\t\titemSize: numComponents\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, attributeType ) {\n\n\t\tswitch ( attributeType ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n\nexport { DRACOLoader };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param {Array} geometries\n * @param {boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute} attribute\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array} attributes\n * @return {Array}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n *\n * @param {Object} cache\n * @return {Material}\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array} targets\n * @param {GLTFParser} parser\n * @return {Promise}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\tif ( uri.search( /\\.ktx2($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/ktx2/ ) === 0 ) return 'image/ktx2';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet safariVersion = - 1;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tconst userAgent = navigator.userAgent;\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true;\n\t\t\tconst safariMatch = userAgent.match( /Version\\/(\\d+)/ );\n\t\t\tsafariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : - 1;\n\n\t\t\tisFirefox = userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t *\n\t * @param {Object} cache\n\t * @param {Object3D} index\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/**\n\t * Returns a reference to a shared resource, cloning it if necessary.\n\t *\n\t * @param {Object} cache\n\t * @param {number} index\n\t * @param {Object} object\n\t * @return {Object}\n\t */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\t// Ignore normalized since we copy from sparse\n\t\t\t\tbufferAttribute.normalized = false;\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute.normalized = normalized;\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\t\t\ttexture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( texture, sourceDef );\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t *\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @param {string} colorSpace\n\t * @return {Promise}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * When Object3D instances are targeted by animation, they need unique names.\n\t *\n\t * @param {string} originalName\n\t * @return {string}\n\t */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array} primitives\n\t * @return {Promise>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( animationName, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","/**\n * @author Deepkolos / https://github.com/deepkolos\n */\n\nexport class WorkerPool {\n\n\tconstructor( pool = 4 ) {\n\n\t\tthis.pool = pool;\n\t\tthis.queue = [];\n\t\tthis.workers = [];\n\t\tthis.workersResolve = [];\n\t\tthis.workerStatus = 0;\n\n\t}\n\n\t_initWorker( workerId ) {\n\n\t\tif ( ! this.workers[ workerId ] ) {\n\n\t\t\tconst worker = this.workerCreator();\n\t\t\tworker.addEventListener( 'message', this._onMessage.bind( this, workerId ) );\n\t\t\tthis.workers[ workerId ] = worker;\n\n\t\t}\n\n\t}\n\n\t_getIdleWorker() {\n\n\t\tfor ( let i = 0; i < this.pool; i ++ )\n\t\t\tif ( ! ( this.workerStatus & ( 1 << i ) ) ) return i;\n\n\t\treturn - 1;\n\n\t}\n\n\t_onMessage( workerId, msg ) {\n\n\t\tconst resolve = this.workersResolve[ workerId ];\n\t\tresolve && resolve( msg );\n\n\t\tif ( this.queue.length ) {\n\n\t\t\tconst { resolve, msg, transfer } = this.queue.shift();\n\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t} else {\n\n\t\t\tthis.workerStatus ^= 1 << workerId;\n\n\t\t}\n\n\t}\n\n\tsetWorkerCreator( workerCreator ) {\n\n\t\tthis.workerCreator = workerCreator;\n\n\t}\n\n\tsetWorkerLimit( pool ) {\n\n\t\tthis.pool = pool;\n\n\t}\n\n\tpostMessage( msg, transfer ) {\n\n\t\treturn new Promise( ( resolve ) => {\n\n\t\t\tconst workerId = this._getIdleWorker();\n\n\t\t\tif ( workerId !== - 1 ) {\n\n\t\t\t\tthis._initWorker( workerId );\n\t\t\t\tthis.workerStatus |= 1 << workerId;\n\t\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t\t} else {\n\n\t\t\t\tthis.queue.push( { resolve, msg, transfer } );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workers.forEach( ( worker ) => worker.terminate() );\n\t\tthis.workersResolve.length = 0;\n\t\tthis.workers.length = 0;\n\t\tthis.queue.length = 0;\n\t\tthis.workerStatus = 0;\n\n\t}\n\n}\n","const t=0,e=1,n=2,i=3,s=0,a=0,r=2,o=0,l=1,f=160,h=161,U=162,c=163,_=166,p=0,g=1,y=0,x=1,u=2,b=3,d=4,w=5,m=6,D=7,B=8,L=9,v=10,A=11,k=12,V=13,I=14,S=15,F=16,O=17,E=18,T=0,C=1,M=2,P=3,z=4,W=5,H=6,N=7,K=8,X=9,R=10,Y=11,j=0,q=1,G=2,J=13,Q=14,Z=15,$=128,tt=64,et=32,nt=16,it=0,st=1,at=2,rt=3,ot=4,lt=5,ft=6,ht=7,Ut=8,ct=9,_t=10,pt=13,gt=14,yt=15,xt=16,ut=17,bt=20,dt=21,wt=22,mt=23,Dt=24,Bt=27,Lt=28,vt=29,At=30,kt=31,Vt=34,It=35,St=36,Ft=37,Ot=38,Et=41,Tt=42,Ct=43,Mt=44,Pt=45,zt=48,Wt=49,Ht=50,Nt=58,Kt=59,Xt=62,Rt=63,Yt=64,jt=65,qt=68,Gt=69,Jt=70,Qt=71,Zt=74,$t=75,te=76,ee=77,ne=78,ie=81,se=82,ae=83,re=84,oe=85,le=88,fe=89,he=90,Ue=91,ce=92,_e=95,pe=96,ge=97,ye=98,xe=99,ue=100,be=101,de=102,we=103,me=104,De=105,Be=106,Le=107,ve=108,Ae=109,ke=110,Ve=111,Ie=112,Se=113,Fe=114,Oe=115,Ee=116,Te=117,Ce=118,Me=119,Pe=120,ze=121,We=122,He=123,Ne=124,Ke=125,Xe=126,Re=127,Ye=128,je=129,qe=130,Ge=131,Je=132,Qe=133,Ze=134,$e=135,tn=136,en=137,nn=138,sn=139,an=140,rn=141,on=142,ln=143,fn=144,hn=145,Un=146,cn=147,_n=148,pn=149,gn=150,yn=151,xn=152,un=153,bn=154,dn=155,wn=156,mn=157,Dn=158,Bn=159,Ln=160,vn=161,An=162,kn=163,Vn=164,In=165,Sn=166,Fn=167,On=168,En=169,Tn=170,Cn=171,Mn=172,Pn=173,zn=174,Wn=175,Hn=176,Nn=177,Kn=178,Xn=179,Rn=180,Yn=181,jn=182,qn=183,Gn=184,Jn=1000156007,Qn=1000156008,Zn=1000156009,$n=1000156010,ti=1000156011,ei=1000156017,ni=1000156018,ii=1000156019,si=1000156020,ai=1000156021,ri=1000054e3,oi=1000054001,li=1000054002,fi=1000054003,hi=1000054004,Ui=1000054005,ci=1000054006,_i=1000054007,pi=1000066e3,gi=1000066001,yi=1000066002,xi=1000066003,ui=1000066004,bi=1000066005,di=1000066006,wi=1000066007,mi=1000066008,Di=1000066009,Bi=1000066010,Li=1000066011,vi=1000066012,Ai=1000066013,ki=100034e4,Vi=1000340001;class Ii{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null}}class Si{constructor(t,e,n,i){this._dataView=void 0,this._littleEndian=void 0,this._offset=void 0,this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint8Array(t){const e=new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+this._offset,t);return this._offset+=t,e}_skip(t){return this._offset+=t,this}_scan(t,e){void 0===e&&(e=0);const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i0?U+a.byteLength:0;c%8&&(c+=8-c%8);const _=[],p=new DataView(new ArrayBuffer(3*t.levels.length*8)),g=new Uint32Array(t.levels.length);let y=0;0===t.supercompressionScheme&&(y=function(t,e){const n=Math.max(t,4),i=Math.min(t,4);let s=n;for(;s%i!=0;)s+=n;return s}(function(t){return t.levels[0].levelData.byteLength/function(t,e){let n=1;const i=[t.pixelWidth,t.pixelHeight,t.pixelDepth],s=function(t){const[e,n,i]=t.dataFormatDescriptor[0].texelBlockDimension;return[e+1,n+1,i+1]}(t);for(let t=0;t<3;t++)if(i[t]>0){const e=Math.ceil(Math.floor(i[t]*Math.pow(2,-0))/s[t]);n*=Math.max(1,e)}return t.layerCount>0&&(n*=t.layerCount),t.faceCount>0&&(n*=t.faceCount),n}(t)}(t)));let x=(c||U+a.byteLength)+n.byteLength;for(let e=t.levels.length-1;e>=0;e--){if(x%y){const t=Mi(x,y);_.push(new Uint8Array(t)),x+=t}const n=t.levels[e];_.push(n.levelData),g[e]=x,x+=n.levelData.byteLength}for(let e=0;e0?c:0),!0),b.setBigUint64(60,BigInt(n.byteLength),!0),new Uint8Array(Ci([new Uint8Array(Oi).buffer,u,p.buffer,o,a,c>0?new ArrayBuffer(c-(U+a.byteLength)):new ArrayBuffer(0),n,..._]))}export{Z as KHR_DF_CHANNEL_RGBSDA_ALPHA,G as KHR_DF_CHANNEL_RGBSDA_BLUE,Q as KHR_DF_CHANNEL_RGBSDA_DEPTH,q as KHR_DF_CHANNEL_RGBSDA_GREEN,j as KHR_DF_CHANNEL_RGBSDA_RED,J as KHR_DF_CHANNEL_RGBSDA_STENCIL,g as KHR_DF_FLAG_ALPHA_PREMULTIPLIED,p as KHR_DF_FLAG_ALPHA_STRAIGHT,s as KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,U as KHR_DF_MODEL_ASTC,f as KHR_DF_MODEL_ETC1,c as KHR_DF_MODEL_ETC1S,h as KHR_DF_MODEL_ETC2,l as KHR_DF_MODEL_RGBSDA,_ as KHR_DF_MODEL_UASTC,o as KHR_DF_MODEL_UNSPECIFIED,H as KHR_DF_PRIMARIES_ACES,N as KHR_DF_PRIMARIES_ACESCC,Y as KHR_DF_PRIMARIES_ADOBERGB,z as KHR_DF_PRIMARIES_BT2020,M as KHR_DF_PRIMARIES_BT601_EBU,P as KHR_DF_PRIMARIES_BT601_SMPTE,C as KHR_DF_PRIMARIES_BT709,W as KHR_DF_PRIMARIES_CIEXYZ,R as KHR_DF_PRIMARIES_DISPLAYP3,K as KHR_DF_PRIMARIES_NTSC1953,X as KHR_DF_PRIMARIES_PAL525,T as KHR_DF_PRIMARIES_UNSPECIFIED,et as KHR_DF_SAMPLE_DATATYPE_EXPONENT,$ as KHR_DF_SAMPLE_DATATYPE_FLOAT,nt as KHR_DF_SAMPLE_DATATYPE_LINEAR,tt as KHR_DF_SAMPLE_DATATYPE_SIGNED,F as KHR_DF_TRANSFER_ACESCC,O as KHR_DF_TRANSFER_ACESCCT,E as KHR_DF_TRANSFER_ADOBERGB,D as KHR_DF_TRANSFER_BT1886,k as KHR_DF_TRANSFER_DCIP3,L as KHR_DF_TRANSFER_HLG_EOTF,B as KHR_DF_TRANSFER_HLG_OETF,b as KHR_DF_TRANSFER_ITU,x as KHR_DF_TRANSFER_LINEAR,d as KHR_DF_TRANSFER_NTSC,I as KHR_DF_TRANSFER_PAL625_EOTF,V as KHR_DF_TRANSFER_PAL_OETF,v as KHR_DF_TRANSFER_PQ_EOTF,A as KHR_DF_TRANSFER_PQ_OETF,w as KHR_DF_TRANSFER_SLOG,m as KHR_DF_TRANSFER_SLOG2,u as KHR_DF_TRANSFER_SRGB,S as KHR_DF_TRANSFER_ST240,y as KHR_DF_TRANSFER_UNSPECIFIED,a as KHR_DF_VENDORID_KHRONOS,r as KHR_DF_VERSION,e as KHR_SUPERCOMPRESSION_BASISLZ,t as KHR_SUPERCOMPRESSION_NONE,i as KHR_SUPERCOMPRESSION_ZLIB,n as KHR_SUPERCOMPRESSION_ZSTD,Ii as KTX2Container,Ut as VK_FORMAT_A1R5G5B5_UNORM_PACK16,Gt as VK_FORMAT_A2B10G10R10_SINT_PACK32,jt as VK_FORMAT_A2B10G10R10_SNORM_PACK32,qt as VK_FORMAT_A2B10G10R10_UINT_PACK32,Yt as VK_FORMAT_A2B10G10R10_UNORM_PACK32,Rt as VK_FORMAT_A2R10G10B10_SINT_PACK32,Kt as VK_FORMAT_A2R10G10B10_SNORM_PACK32,Xt as VK_FORMAT_A2R10G10B10_UINT_PACK32,Nt as VK_FORMAT_A2R10G10B10_UNORM_PACK32,Vi as VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,ki as VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,Li as VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT,Rn as VK_FORMAT_ASTC_10x10_SRGB_BLOCK,Xn as VK_FORMAT_ASTC_10x10_UNORM_BLOCK,mi as VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT,zn as VK_FORMAT_ASTC_10x5_SRGB_BLOCK,Pn as VK_FORMAT_ASTC_10x5_UNORM_BLOCK,Di as VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT,Hn as VK_FORMAT_ASTC_10x6_SRGB_BLOCK,Wn as VK_FORMAT_ASTC_10x6_UNORM_BLOCK,Bi as VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT,Kn as VK_FORMAT_ASTC_10x8_SRGB_BLOCK,Nn as VK_FORMAT_ASTC_10x8_UNORM_BLOCK,vi as VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT,jn as VK_FORMAT_ASTC_12x10_SRGB_BLOCK,Yn as VK_FORMAT_ASTC_12x10_UNORM_BLOCK,Ai as VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT,Gn as VK_FORMAT_ASTC_12x12_SRGB_BLOCK,qn as VK_FORMAT_ASTC_12x12_UNORM_BLOCK,pi as VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,Dn as VK_FORMAT_ASTC_4x4_SRGB_BLOCK,mn as VK_FORMAT_ASTC_4x4_UNORM_BLOCK,gi as VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT,Ln as VK_FORMAT_ASTC_5x4_SRGB_BLOCK,Bn as VK_FORMAT_ASTC_5x4_UNORM_BLOCK,yi as VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT,An as VK_FORMAT_ASTC_5x5_SRGB_BLOCK,vn as VK_FORMAT_ASTC_5x5_UNORM_BLOCK,xi as VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT,Vn as VK_FORMAT_ASTC_6x5_SRGB_BLOCK,kn as VK_FORMAT_ASTC_6x5_UNORM_BLOCK,ui as VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,Sn as VK_FORMAT_ASTC_6x6_SRGB_BLOCK,In as VK_FORMAT_ASTC_6x6_UNORM_BLOCK,bi as VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT,On as VK_FORMAT_ASTC_8x5_SRGB_BLOCK,Fn as VK_FORMAT_ASTC_8x5_UNORM_BLOCK,di as VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT,Tn as VK_FORMAT_ASTC_8x6_SRGB_BLOCK,En as VK_FORMAT_ASTC_8x6_UNORM_BLOCK,wi as VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT,Mn as VK_FORMAT_ASTC_8x8_SRGB_BLOCK,Cn as VK_FORMAT_ASTC_8x8_UNORM_BLOCK,We as VK_FORMAT_B10G11R11_UFLOAT_PACK32,ti as VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,ai as VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,rt as VK_FORMAT_B4G4R4A4_UNORM_PACK16,ht as VK_FORMAT_B5G5R5A1_UNORM_PACK16,lt as VK_FORMAT_B5G6R5_UNORM_PACK16,Wt as VK_FORMAT_B8G8R8A8_SINT,Pt as VK_FORMAT_B8G8R8A8_SNORM,Ht as VK_FORMAT_B8G8R8A8_SRGB,zt as VK_FORMAT_B8G8R8A8_UINT,Mt as VK_FORMAT_B8G8R8A8_UNORM,It as VK_FORMAT_B8G8R8_SINT,kt as VK_FORMAT_B8G8R8_SNORM,St as VK_FORMAT_B8G8R8_SRGB,Vt as VK_FORMAT_B8G8R8_UINT,At as VK_FORMAT_B8G8R8_UNORM,Ze as VK_FORMAT_BC1_RGBA_SRGB_BLOCK,Qe as VK_FORMAT_BC1_RGBA_UNORM_BLOCK,Je as VK_FORMAT_BC1_RGB_SRGB_BLOCK,Ge as VK_FORMAT_BC1_RGB_UNORM_BLOCK,tn as VK_FORMAT_BC2_SRGB_BLOCK,$e as VK_FORMAT_BC2_UNORM_BLOCK,nn as VK_FORMAT_BC3_SRGB_BLOCK,en as VK_FORMAT_BC3_UNORM_BLOCK,an as VK_FORMAT_BC4_SNORM_BLOCK,sn as VK_FORMAT_BC4_UNORM_BLOCK,on as VK_FORMAT_BC5_SNORM_BLOCK,rn as VK_FORMAT_BC5_UNORM_BLOCK,fn as VK_FORMAT_BC6H_SFLOAT_BLOCK,ln as VK_FORMAT_BC6H_UFLOAT_BLOCK,Un as VK_FORMAT_BC7_SRGB_BLOCK,hn as VK_FORMAT_BC7_UNORM_BLOCK,Ne as VK_FORMAT_D16_UNORM,Ye as VK_FORMAT_D16_UNORM_S8_UINT,je as VK_FORMAT_D24_UNORM_S8_UINT,Xe as VK_FORMAT_D32_SFLOAT,qe as VK_FORMAT_D32_SFLOAT_S8_UINT,He as VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,wn as VK_FORMAT_EAC_R11G11_SNORM_BLOCK,dn as VK_FORMAT_EAC_R11G11_UNORM_BLOCK,bn as VK_FORMAT_EAC_R11_SNORM_BLOCK,un as VK_FORMAT_EAC_R11_UNORM_BLOCK,gn as VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,pn as VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,xn as VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,yn as VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,_n as VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,cn as VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,$n as VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,si as VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,hi as VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,ri as VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,Ui as VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,oi as VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,ci as VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,li as VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,_i as VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,fi as VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,Zn as VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,Qn as VK_FORMAT_R10X6G10X6_UNORM_2PACK16,Jn as VK_FORMAT_R10X6_UNORM_PACK16,ii as VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,ni as VK_FORMAT_R12X4G12X4_UNORM_2PACK16,ei as VK_FORMAT_R12X4_UNORM_PACK16,ge as VK_FORMAT_R16G16B16A16_SFLOAT,pe as VK_FORMAT_R16G16B16A16_SINT,ce as VK_FORMAT_R16G16B16A16_SNORM,_e as VK_FORMAT_R16G16B16A16_UINT,Ue as VK_FORMAT_R16G16B16A16_UNORM,he as VK_FORMAT_R16G16B16_SFLOAT,fe as VK_FORMAT_R16G16B16_SINT,oe as VK_FORMAT_R16G16B16_SNORM,le as VK_FORMAT_R16G16B16_UINT,re as VK_FORMAT_R16G16B16_UNORM,ae as VK_FORMAT_R16G16_SFLOAT,se as VK_FORMAT_R16G16_SINT,ne as VK_FORMAT_R16G16_SNORM,ie as VK_FORMAT_R16G16_UINT,ee as VK_FORMAT_R16G16_UNORM,te as VK_FORMAT_R16_SFLOAT,$t as VK_FORMAT_R16_SINT,Qt as VK_FORMAT_R16_SNORM,Zt as VK_FORMAT_R16_UINT,Jt as VK_FORMAT_R16_UNORM,Ae as VK_FORMAT_R32G32B32A32_SFLOAT,ve as VK_FORMAT_R32G32B32A32_SINT,Le as VK_FORMAT_R32G32B32A32_UINT,Be as VK_FORMAT_R32G32B32_SFLOAT,De as VK_FORMAT_R32G32B32_SINT,me as VK_FORMAT_R32G32B32_UINT,we as VK_FORMAT_R32G32_SFLOAT,de as VK_FORMAT_R32G32_SINT,be as VK_FORMAT_R32G32_UINT,ue as VK_FORMAT_R32_SFLOAT,xe as VK_FORMAT_R32_SINT,ye as VK_FORMAT_R32_UINT,at as VK_FORMAT_R4G4B4A4_UNORM_PACK16,st as VK_FORMAT_R4G4_UNORM_PACK8,ft as VK_FORMAT_R5G5B5A1_UNORM_PACK16,ot as VK_FORMAT_R5G6B5_UNORM_PACK16,ze as VK_FORMAT_R64G64B64A64_SFLOAT,Pe as VK_FORMAT_R64G64B64A64_SINT,Me as VK_FORMAT_R64G64B64A64_UINT,Ce as VK_FORMAT_R64G64B64_SFLOAT,Te as VK_FORMAT_R64G64B64_SINT,Ee as VK_FORMAT_R64G64B64_UINT,Oe as VK_FORMAT_R64G64_SFLOAT,Fe as VK_FORMAT_R64G64_SINT,Se as VK_FORMAT_R64G64_UINT,Ie as VK_FORMAT_R64_SFLOAT,Ve as VK_FORMAT_R64_SINT,ke as VK_FORMAT_R64_UINT,Tt as VK_FORMAT_R8G8B8A8_SINT,Ot as VK_FORMAT_R8G8B8A8_SNORM,Ct as VK_FORMAT_R8G8B8A8_SRGB,Et as VK_FORMAT_R8G8B8A8_UINT,Ft as VK_FORMAT_R8G8B8A8_UNORM,Lt as VK_FORMAT_R8G8B8_SINT,Dt as VK_FORMAT_R8G8B8_SNORM,vt as VK_FORMAT_R8G8B8_SRGB,Bt as VK_FORMAT_R8G8B8_UINT,mt as VK_FORMAT_R8G8B8_UNORM,dt as VK_FORMAT_R8G8_SINT,ut as VK_FORMAT_R8G8_SNORM,wt as VK_FORMAT_R8G8_SRGB,bt as VK_FORMAT_R8G8_UINT,xt as VK_FORMAT_R8G8_UNORM,gt as VK_FORMAT_R8_SINT,_t as VK_FORMAT_R8_SNORM,yt as VK_FORMAT_R8_SRGB,pt as VK_FORMAT_R8_UINT,ct as VK_FORMAT_R8_UNORM,Re as VK_FORMAT_S8_UINT,it as VK_FORMAT_UNDEFINED,Ke as VK_FORMAT_X8_D24_UNORM_PACK32,Pi as read,Wi as write};\n","let A,I,B;const g={env:{emscripten_notify_memory_growth:function(A){B=new Uint8Array(I.exports.memory.buffer)}}};class Q{init(){return A||(A=\"undefined\"!=typeof fetch?fetch(\"data:application/wasm;base64,\"+C).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,\"base64\"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0)}decode(A,g=0){if(!I)throw new Error(\"ZSTDDecoder: Await .init() before decoding.\");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C=\"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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQhBSAGQQR2IQRBICAAdCIAQQFyIQkgASgCACEPQQAhAiADIQYCQANAIAlBAkggAiAPS3JFBEAgAiEHAkAgCARAA0AgBEH//wNxQf//A0YEQCAHQRhqIQcgBiAQSQR/IAZBAmoiBigAACAFdgUgBUEQaiEFIARBEHYLIQQMAQsLA0AgBEEDcSIIQQNGBEAgBUECaiEFIARBAnYhBCAHQQNqIQcMAQsLIAcgCGoiByAPSw0EIAVBAmohBQNAIAIgB0kEQCANIAJBAXRqQQA7AQAgAkEBaiECDAELCyAGIA5LQQAgBiAFQQN1aiIHIAxLG0UEQCAHKAAAIAVBB3EiBXYhBAwCCyAEQQJ2IQQLIAYhBwsCfyALQX9qIAQgAEF/anEiBiAAQQF0QX9qIgggCWsiEUkNABogBCAIcSIEQQAgESAEIABIG2shBiALCyEIIA0gAkEBdGogBkF/aiIEOwEAIAlBASAGayAEIAZBAUgbayEJA0AgCSAASARAIABBAXUhACALQX9qIQsMAQsLAn8gByAOS0EAIAcgBSAIaiIFQQN1aiIGIAxLG0UEQCAFQQdxDAELIAUgDCIGIAdrQQN0awshBSACQQFqIQIgBEUhCCAGKAAAIAVBH3F2IQQMAQsLQWwgCUEBRyAFQSBKcg0BGiABIAJBf2o2AgAgBiAFQQdqQQN1aiADawwBC0FQCyEAIApBEGokACAACwkAQQFBBSAAGwsMACAAIAEoAAA2AAALqgMBCn8jAEHwAGsiCiQAIAJBAWohDiAAQQhqIQtBgIAEIAVBf2p0QRB1IQxBACECQQEhBkEBIAV0IglBf2oiDyEIA0AgAiAORkUEQAJAIAEgAkEBdCINai8BACIHQf//A0YEQCALIAhBA3RqIAI2AgQgCEF/aiEIQQEhBwwBCyAGQQAgDCAHQRB0QRB1ShshBgsgCiANaiAHOwEAIAJBAWohAgwBCwsgACAFNgIEIAAgBjYCACAJQQN2IAlBAXZqQQNqIQxBACEAQQAhBkEAIQIDQCAGIA5GBEADQAJAIAAgCUYNACAKIAsgAEEDdGoiASgCBCIGQQF0aiICIAIvAQAiAkEBajsBACABIAUgAhAUayIIOgADIAEgAiAIQf8BcXQgCWs7AQAgASAEIAZBAnQiAmooAgA6AAIgASACIANqKAIANgIEIABBAWohAAwBCwsFIAEgBkEBdGouAQAhDUEAIQcDQCAHIA1ORQRAIAsgAkEDdGogBjYCBANAIAIgDGogD3EiAiAISw0ACyAHQQFqIQcMAQsLIAZBAWohBgwBCwsgCkHwAGokAAsjAEIAIAEQCSAAhUKHla+vmLbem55/fkLj3MqV/M7y9YV/fAsQACAAQn43AwggACABNgIACyQBAX8gAARAIAEoAgQiAgRAIAEoAgggACACEQEADwsgABAmCwsfACAAIAEgAi8BABAINgIAIAEQBBogACACQQRqNgIEC0oBAX9BoCAoAgAiASAAaiIAQX9MBEBBiCBBMDYCAEF/DwsCQCAAPwBBEHRNDQAgABBmDQBBiCBBMDYCAEF/DwtBoCAgADYCACABC9cBAQh/Qbp/IQoCQCACKAIEIgggAigCACIJaiIOIAEgAGtLDQBBbCEKIAkgBCADKAIAIgtrSw0AIAAgCWoiBCACKAIIIgxrIQ0gACABQWBqIg8gCyAJQQAQKSADIAkgC2o2AgACQAJAIAwgBCAFa00EQCANIQUMAQsgDCAEIAZrSw0CIAcgDSAFayIAaiIBIAhqIAdNBEAgBCABIAgQDxoMAgsgBCABQQAgAGsQDyEBIAIgACAIaiIINgIEIAEgAGshBAsgBCAPIAUgCEEBECkLIA4hCgsgCgubAgEBfyMAQYABayINJAAgDSADNgJ8AkAgAkEDSwRAQX8hCQwBCwJAAkACQAJAIAJBAWsOAwADAgELIAZFBEBBuH8hCQwEC0FsIQkgBS0AACICIANLDQMgACAHIAJBAnQiAmooAgAgAiAIaigCABA7IAEgADYCAEEBIQkMAwsgASAJNgIAQQAhCQwCCyAKRQRAQWwhCQwCC0EAIQkgC0UgDEEZSHINAUEIIAR0QQhqIQBBACECA0AgAiAATw0CIAJBQGshAgwAAAsAC0FsIQkgDSANQfwAaiANQfgAaiAFIAYQFSICEAMNACANKAJ4IgMgBEsNACAAIA0gDSgCfCAHIAggAxAYIAEgADYCACACIQkLIA1BgAFqJAAgCQsLACAAIAEgAhALGgsQACAALwAAIAAtAAJBEHRyCy8AAn9BuH8gAUEISQ0AGkFyIAAoAAQiAEF3Sw0AGkG4fyAAQQhqIgAgACABSxsLCwkAIAAgATsAAAsDAAELigYBBX8gACAAKAIAIgVBfnE2AgBBACAAIAVBAXZqQYQgKAIAIgQgAEYbIQECQAJAIAAoAgQiAkUNACACKAIAIgNBAXENACACQQhqIgUgA0EBdkF4aiIDQQggA0EISxtnQR9zQQJ0QYAfaiIDKAIARgRAIAMgAigCDDYCAAsgAigCCCIDBEAgAyACKAIMNgIECyACKAIMIgMEQCADIAIoAgg2AgALIAIgAigCACAAKAIAQX5xajYCAEGEICEAAkACQCABRQ0AIAEgAjYCBCABKAIAIgNBAXENASADQQF2QXhqIgNBCCADQQhLG2dBH3NBAnRBgB9qIgMoAgAgAUEIakYEQCADIAEoAgw2AgALIAEoAggiAwRAIAMgASgCDDYCBAsgASgCDCIDBEAgAyABKAIINgIAQYQgKAIAIQQLIAIgAigCACABKAIAQX5xajYCACABIARGDQAgASABKAIAQQF2akEEaiEACyAAIAI2AgALIAIoAgBBAXZBeGoiAEEIIABBCEsbZ0Efc0ECdEGAH2oiASgCACEAIAEgBTYCACACIAA2AgwgAkEANgIIIABFDQEgACAFNgIADwsCQCABRQ0AIAEoAgAiAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAigCACABQQhqRgRAIAIgASgCDDYCAAsgASgCCCICBEAgAiABKAIMNgIECyABKAIMIgIEQCACIAEoAgg2AgBBhCAoAgAhBAsgACAAKAIAIAEoAgBBfnFqIgI2AgACQCABIARHBEAgASABKAIAQQF2aiAANgIEIAAoAgAhAgwBC0GEICAANgIACyACQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgIoAgAhASACIABBCGoiAjYCACAAIAE2AgwgAEEANgIIIAFFDQEgASACNgIADwsgBUEBdkF4aiIBQQggAUEISxtnQR9zQQJ0QYAfaiICKAIAIQEgAiAAQQhqIgI2AgAgACABNgIMIABBADYCCCABRQ0AIAEgAjYCAAsLDgAgAARAIABBeGoQJQsLgAIBA38CQCAAQQ9qQXhxQYQgKAIAKAIAQQF2ayICEB1Bf0YNAAJAQYQgKAIAIgAoAgAiAUEBcQ0AIAFBAXZBeGoiAUEIIAFBCEsbZ0Efc0ECdEGAH2oiASgCACAAQQhqRgRAIAEgACgCDDYCAAsgACgCCCIBBEAgASAAKAIMNgIECyAAKAIMIgFFDQAgASAAKAIINgIAC0EBIQEgACAAKAIAIAJBAXRqIgI2AgAgAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAygCACECIAMgAEEIaiIDNgIAIAAgAjYCDCAAQQA2AgggAkUNACACIAM2AgALIAELtwIBA38CQAJAIABBASAAGyICEDgiAA0AAkACQEGEICgCACIARQ0AIAAoAgAiA0EBcQ0AIAAgA0EBcjYCACADQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgEoAgAgAEEIakYEQCABIAAoAgw2AgALIAAoAggiAQRAIAEgACgCDDYCBAsgACgCDCIBBEAgASAAKAIINgIACyACECchAkEAIQFBhCAoAgAhACACDQEgACAAKAIAQX5xNgIAQQAPCyACQQ9qQXhxIgMQHSICQX9GDQIgAkEHakF4cSIAIAJHBEAgACACaxAdQX9GDQMLAkBBhCAoAgAiAUUEQEGAICAANgIADAELIAAgATYCBAtBhCAgADYCACAAIANBAXRBAXI2AgAMAQsgAEUNAQsgAEEIaiEBCyABC7kDAQJ/IAAgA2ohBQJAIANBB0wEQANAIAAgBU8NAiAAIAItAAA6AAAgAEEBaiEAIAJBAWohAgwAAAsACyAEQQFGBEACQCAAIAJrIgZBB00EQCAAIAItAAA6AAAgACACLQABOgABIAAgAi0AAjoAAiAAIAItAAM6AAMgAEEEaiACIAZBAnQiBkHAHmooAgBqIgIQFyACIAZB4B5qKAIAayECDAELIAAgAhAMCyACQQhqIQIgAEEIaiEACwJAAkACQAJAIAUgAU0EQCAAIANqIQEgBEEBRyAAIAJrQQ9Kcg0BA0AgACACEAwgAkEIaiECIABBCGoiACABSQ0ACwwFCyAAIAFLBEAgACEBDAQLIARBAUcgACACa0EPSnINASAAIQMgAiEEA0AgAyAEEAwgBEEIaiEEIANBCGoiAyABSQ0ACwwCCwNAIAAgAhAHIAJBEGohAiAAQRBqIgAgAUkNAAsMAwsgACEDIAIhBANAIAMgBBAHIARBEGohBCADQRBqIgMgAUkNAAsLIAIgASAAa2ohAgsDQCABIAVPDQEgASACLQAAOgAAIAFBAWohASACQQFqIQIMAAALAAsLQQECfyAAIAAoArjgASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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\";export{Q as ZSTDDecoder};\n","import { LinearTransfer, Matrix3, SRGBTransfer } from 'three';\n\n// Reference: http://www.russellcottrell.com/photo/matrixCalculator.htm\n\nconst P3_PRIMARIES = [ 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 ];\nconst P3_LUMINANCE_COEFFICIENTS = [ 0.2289, 0.6917, 0.0793 ];\nconst REC2020_PRIMARIES = [ 0.708, 0.292, 0.170, 0.797, 0.131, 0.046 ];\nconst REC2020_LUMINANCE_COEFFICIENTS = [ 0.2627, 0.6780, 0.0593 ];\nconst D65 = [ 0.3127, 0.3290 ];\n\n/******************************************************************************\n * Display P3 definitions\n */\n\nconst LINEAR_DISPLAY_P3_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4865709, 0.2656677, 0.1982173,\n\t0.2289746, 0.6917385, 0.0792869,\n\t0.0000000, 0.0451134, 1.0439444\n);\n\nconst XYZ_TO_LINEAR_DISPLAY_P3 = /*@__PURE__*/ new Matrix3().set(\n\t2.4934969, - 0.9313836, - 0.4027108,\n\t- 0.8294890, 1.7626641, 0.0236247,\n\t0.0358458, - 0.0761724, 0.9568845\n);\n\nexport const DisplayP3ColorSpace = 'display-p3';\nexport const LinearDisplayP3ColorSpace = 'display-p3-linear';\n\nexport const DisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: SRGBTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\nexport const LinearDisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\tworkingColorSpaceConfig: { unpackColorSpace: DisplayP3ColorSpace },\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\n/******************************************************************************\n * Rec. 2020 definitions\n */\n\nconst LINEAR_REC2020_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.6369580, 0.1446169, 0.1688810,\n\t0.2627002, 0.6779981, 0.0593017,\n\t0.0000000, 0.0280727, 1.0609851\n);\n\nconst XYZ_TO_LINEAR_REC2020 = /*@__PURE__*/ new Matrix3().set(\n\t1.7166512, - 0.3556708, - 0.2533663,\n\t- 0.6666844, 1.6164812, 0.0157685,\n\t0.0176399, - 0.0427706, 0.9421031\n);\n\nexport const LinearRec2020ColorSpace = 'rec2020-linear';\n\nexport const LinearRec2020ColorSpaceImpl = {\n\tprimaries: REC2020_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_REC2020_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_REC2020,\n\tluminanceCoefficients: REC2020_LUMINANCE_COEFFICIENTS,\n};\n","/**\n * Loader for KTX 2.0 GPU Texture containers.\n *\n * KTX 2.0 is a container format for various GPU texture formats. The loader\n * supports Basis Universal GPU textures, which can be quickly transcoded to\n * a wide variety of GPU texture compression formats, as well as some\n * uncompressed DataTexture and Data3DTexture formats.\n *\n * References:\n * - KTX: http://github.khronos.org/KTX-Specification/\n * - DFD: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor\n * - BasisU HDR: https://github.com/BinomialLLC/basis_universal/wiki/UASTC-HDR-Texture-Specification-v1.0\n */\n\nimport {\n\tCompressedTexture,\n\tCompressedArrayTexture,\n\tCompressedCubeTexture,\n\tData3DTexture,\n\tDataTexture,\n\tFileLoader,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tRedFormat,\n\tRGB_BPTC_UNSIGNED_Format,\n\tRGB_ETC1_Format,\n\tRGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format,\n\tRGBA_ASTC_4x4_Format,\n\tRGBA_ASTC_6x6_Format,\n\tRGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format,\n\tRGBA_S3TC_DXT1_Format,\n\tRGBAFormat,\n\tRGFormat,\n\tSRGBColorSpace,\n\tUnsignedByteType,\n} from 'three';\nimport { WorkerPool } from '../utils/WorkerPool.js';\nimport {\n\tread,\n\tKHR_DF_FLAG_ALPHA_PREMULTIPLIED,\n\tKHR_DF_TRANSFER_SRGB,\n\tKHR_SUPERCOMPRESSION_NONE,\n\tKHR_SUPERCOMPRESSION_ZSTD,\n\tVK_FORMAT_UNDEFINED,\n\tVK_FORMAT_R16_SFLOAT,\n\tVK_FORMAT_R16G16_SFLOAT,\n\tVK_FORMAT_R16G16B16A16_SFLOAT,\n\tVK_FORMAT_R32_SFLOAT,\n\tVK_FORMAT_R32G32_SFLOAT,\n\tVK_FORMAT_R32G32B32A32_SFLOAT,\n\tVK_FORMAT_R8_SRGB,\n\tVK_FORMAT_R8_UNORM,\n\tVK_FORMAT_R8G8_SRGB,\n\tVK_FORMAT_R8G8_UNORM,\n\tVK_FORMAT_R8G8B8A8_SRGB,\n\tVK_FORMAT_R8G8B8A8_UNORM,\n\tVK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,\n\tVK_FORMAT_ASTC_6x6_SRGB_BLOCK,\n\tVK_FORMAT_ASTC_6x6_UNORM_BLOCK,\n\tKHR_DF_PRIMARIES_UNSPECIFIED,\n\tKHR_DF_PRIMARIES_BT709,\n\tKHR_DF_PRIMARIES_DISPLAYP3\n} from '../libs/ktx-parse.module.js';\nimport { ZSTDDecoder } from '../libs/zstddec.module.js';\nimport { DisplayP3ColorSpace, LinearDisplayP3ColorSpace } from '../math/ColorSpaces.js';\n\nconst _taskCache = new WeakMap();\n\nlet _activeLoaders = 0;\n\nlet _zstd;\n\nclass KTX2Loader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.transcoderPath = '';\n\t\tthis.transcoderBinary = null;\n\t\tthis.transcoderPending = null;\n\n\t\tthis.workerPool = new WorkerPool();\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = null;\n\n\t\tif ( typeof MSC_TRANSCODER !== 'undefined' ) {\n\n\t\t\tconsole.warn(\n\n\t\t\t\t'THREE.KTX2Loader: Please update to latest \"basis_transcoder\".'\n\t\t\t\t+ ' \"msc_basis_transcoder\" is no longer supported in three.js r125+.'\n\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tsetTranscoderPath( path ) {\n\n\t\tthis.transcoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( num ) {\n\n\t\tthis.workerPool.setWorkerLimit( num );\n\n\t\treturn this;\n\n\t}\n\n\tasync detectSupportAsync( renderer ) {\n\n\t\tthis.workerConfig = {\n\t\t\tastcSupported: await renderer.hasFeatureAsync( 'texture-compression-astc' ),\n\t\t\tastcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856\n\t\t\tetc1Supported: await renderer.hasFeatureAsync( 'texture-compression-etc1' ),\n\t\t\tetc2Supported: await renderer.hasFeatureAsync( 'texture-compression-etc2' ),\n\t\t\tdxtSupported: await renderer.hasFeatureAsync( 'texture-compression-bc' ),\n\t\t\tbptcSupported: await renderer.hasFeatureAsync( 'texture-compression-bptc' ),\n\t\t\tpvrtcSupported: await renderer.hasFeatureAsync( 'texture-compression-pvrtc' )\n\t\t};\n\n\t\treturn this;\n\n\t}\n\n\tdetectSupport( renderer ) {\n\n\t\tif ( renderer.isWebGPURenderer === true ) {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.hasFeature( 'texture-compression-astc' ),\n\t\t\t\tastcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856\n\t\t\t\tetc1Supported: renderer.hasFeature( 'texture-compression-etc1' ),\n\t\t\t\tetc2Supported: renderer.hasFeature( 'texture-compression-etc2' ),\n\t\t\t\tdxtSupported: renderer.hasFeature( 'texture-compression-bc' ),\n\t\t\t\tbptcSupported: renderer.hasFeature( 'texture-compression-bptc' ),\n\t\t\t\tpvrtcSupported: renderer.hasFeature( 'texture-compression-pvrtc' )\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ),\n\t\t\t\tastcHDRSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' )\n\t\t\t\t\t&& renderer.extensions.get( 'WEBGL_compressed_texture_astc' ).getSupportedProfiles().includes( 'hdr' ),\n\t\t\t\tetc1Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc1' ),\n\t\t\t\tetc2Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc' ),\n\t\t\t\tdxtSupported: renderer.extensions.has( 'WEBGL_compressed_texture_s3tc' ),\n\t\t\t\tbptcSupported: renderer.extensions.has( 'EXT_texture_compression_bptc' ),\n\t\t\t\tpvrtcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_pvrtc' )\n\t\t\t\t\t|| renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' )\n\t\t\t};\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinit() {\n\n\t\tif ( ! this.transcoderPending ) {\n\n\t\t\t// Load transcoder wrapper.\n\t\t\tconst jsLoader = new FileLoader( this.manager );\n\t\t\tjsLoader.setPath( this.transcoderPath );\n\t\t\tjsLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst jsContent = jsLoader.loadAsync( 'basis_transcoder.js' );\n\n\t\t\t// Load transcoder WASM binary.\n\t\t\tconst binaryLoader = new FileLoader( this.manager );\n\t\t\tbinaryLoader.setPath( this.transcoderPath );\n\t\t\tbinaryLoader.setResponseType( 'arraybuffer' );\n\t\t\tbinaryLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst binaryContent = binaryLoader.loadAsync( 'basis_transcoder.wasm' );\n\n\t\t\tthis.transcoderPending = Promise.all( [ jsContent, binaryContent ] )\n\t\t\t\t.then( ( [ jsContent, binaryContent ] ) => {\n\n\t\t\t\t\tconst fn = KTX2Loader.BasisWorker.toString();\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* constants */',\n\t\t\t\t\t\t'let _EngineFormat = ' + JSON.stringify( KTX2Loader.EngineFormat ),\n\t\t\t\t\t\t'let _EngineType = ' + JSON.stringify( KTX2Loader.EngineType ),\n\t\t\t\t\t\t'let _TranscoderFormat = ' + JSON.stringify( KTX2Loader.TranscoderFormat ),\n\t\t\t\t\t\t'let _BasisFormat = ' + JSON.stringify( KTX2Loader.BasisFormat ),\n\t\t\t\t\t\t'/* basis_transcoder.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t\t].join( '\\n' );\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\t\t\t\t\tthis.transcoderBinary = binaryContent;\n\n\t\t\t\t\tthis.workerPool.setWorkerCreator( () => {\n\n\t\t\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\t\t\t\t\t\tconst transcoderBinary = this.transcoderBinary.slice( 0 );\n\n\t\t\t\t\t\tworker.postMessage( { type: 'init', config: this.workerConfig, transcoderBinary }, [ transcoderBinary ] );\n\n\t\t\t\t\t\treturn worker;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\tif ( _activeLoaders > 0 ) {\n\n\t\t\t\t// Each instance loads a transcoder and allocates workers, increasing network and memory cost.\n\n\t\t\t\tconsole.warn(\n\n\t\t\t\t\t'THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.'\n\t\t\t\t\t+ ' Use a single KTX2Loader instance, or call .dispose() on old instances.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t_activeLoaders ++;\n\n\t\t}\n\n\t\treturn this.transcoderPending;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( buffer, onLoad, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\treturn cachedTask.promise.then( onLoad ).catch( onError );\n\n\t\t}\n\n\t\tthis._createTexture( buffer )\n\t\t\t.then( ( texture ) => onLoad ? onLoad( texture ) : null )\n\t\t\t.catch( onError );\n\n\t}\n\n\t_createTextureFrom( transcodeResult, container ) {\n\n\t\tconst { type: messageType, error, data: { faces, width, height, format, type, dfdFlags } } = transcodeResult;\n\n\t\tif ( messageType === 'error' ) return Promise.reject( error );\n\n\t\tlet texture;\n\n\t\tif ( container.faceCount === 6 ) {\n\n\t\t\ttexture = new CompressedCubeTexture( faces, format, type );\n\n\t\t} else {\n\n\t\t\tconst mipmaps = faces[ 0 ].mipmaps;\n\n\t\t\ttexture = container.layerCount > 1\n\t\t\t\t? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, type )\n\t\t\t\t: new CompressedTexture( mipmaps, width, height, format, type );\n\n\t\t}\n\n\t\ttexture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.generateMipmaps = false;\n\n\t\ttexture.needsUpdate = true;\n\t\ttexture.colorSpace = parseColorSpace( container );\n\t\ttexture.premultiplyAlpha = !! ( dfdFlags & KHR_DF_FLAG_ALPHA_PREMULTIPLIED );\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * @param {ArrayBuffer} buffer\n\t * @param {?Object} config\n\t * @return {Promise}\n\t */\n\tasync _createTexture( buffer, config = {} ) {\n\n\t\tconst container = read( new Uint8Array( buffer ) );\n\n\t\t// Basis UASTC HDR is a subset of ASTC, which can be transcoded efficiently\n\t\t// to BC6H. To detect whether a KTX2 file uses Basis UASTC HDR, or default\n\t\t// ASTC, inspect the DFD color model.\n\t\t//\n\t\t// Source: https://github.com/BinomialLLC/basis_universal/issues/381\n\t\tconst isBasisHDR = container.vkFormat === VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT\n\t\t\t&& container.dataFormatDescriptor[ 0 ].colorModel === 0xA7;\n\n\t\t// If the device supports ASTC, Basis UASTC HDR requires no transcoder.\n\t\tconst needsTranscoder = container.vkFormat === VK_FORMAT_UNDEFINED\n\t\t\t|| isBasisHDR && ! this.workerConfig.astcHDRSupported;\n\n\t\tif ( ! needsTranscoder ) {\n\n\t\t\treturn createRawTexture( container );\n\n\t\t}\n\n\t\t//\n\t\tconst taskConfig = config;\n\t\tconst texturePending = this.init().then( () => {\n\n\t\t\treturn this.workerPool.postMessage( { type: 'transcode', buffer, taskConfig: taskConfig }, [ buffer ] );\n\n\t\t} ).then( ( e ) => this._createTextureFrom( e.data, container ) );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, { promise: texturePending } );\n\n\t\treturn texturePending;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workerPool.dispose();\n\t\tif ( this.workerSourceURL ) URL.revokeObjectURL( this.workerSourceURL );\n\n\t\t_activeLoaders --;\n\n\t\treturn this;\n\n\t}\n\n}\n\n\n/* CONSTANTS */\n\nKTX2Loader.BasisFormat = {\n\tETC1S: 0,\n\tUASTC: 1,\n\tUASTC_HDR: 2,\n};\n\n// Source: https://github.com/BinomialLLC/basis_universal/blob/master/webgl/texture_test/index.html\nKTX2Loader.TranscoderFormat = {\n\tETC1: 0,\n\tETC2: 1,\n\tBC1: 2,\n\tBC3: 3,\n\tBC4: 4,\n\tBC5: 5,\n\tBC7_M6_OPAQUE_ONLY: 6,\n\tBC7_M5: 7,\n\tPVRTC1_4_RGB: 8,\n\tPVRTC1_4_RGBA: 9,\n\tASTC_4x4: 10,\n\tATC_RGB: 11,\n\tATC_RGBA_INTERPOLATED_ALPHA: 12,\n\tRGBA32: 13,\n\tRGB565: 14,\n\tBGR565: 15,\n\tRGBA4444: 16,\n\tBC6H: 22,\n\tRGB_HALF: 24,\n\tRGBA_HALF: 25,\n};\n\nKTX2Loader.EngineFormat = {\n\tRGBAFormat: RGBAFormat,\n\tRGBA_ASTC_4x4_Format: RGBA_ASTC_4x4_Format,\n\tRGB_BPTC_UNSIGNED_Format: RGB_BPTC_UNSIGNED_Format,\n\tRGBA_BPTC_Format: RGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format: RGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format: RGBA_S3TC_DXT5_Format,\n\tRGB_ETC1_Format: RGB_ETC1_Format,\n\tRGB_ETC2_Format: RGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format: RGB_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT1_Format: RGBA_S3TC_DXT1_Format,\n};\n\nKTX2Loader.EngineType = {\n\tUnsignedByteType: UnsignedByteType,\n\tHalfFloatType: HalfFloatType,\n\tFloatType: FloatType,\n};\n\n/* WEB WORKER */\n\nKTX2Loader.BasisWorker = function () {\n\n\tlet config;\n\tlet transcoderPending;\n\tlet BasisModule;\n\n\tconst EngineFormat = _EngineFormat; // eslint-disable-line no-undef\n\tconst EngineType = _EngineType; // eslint-disable-line no-undef\n\tconst TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef\n\tconst BasisFormat = _BasisFormat; // eslint-disable-line no-undef\n\n\tself.addEventListener( 'message', function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tconfig = message.config;\n\t\t\t\tinit( message.transcoderBinary );\n\t\t\t\tbreak;\n\n\t\t\tcase 'transcode':\n\t\t\t\ttranscoderPending.then( () => {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst { faces, buffers, width, height, hasAlpha, format, type, dfdFlags } = transcode( message.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'transcode', id: message.id, data: { faces, width, height, hasAlpha, format, type, dfdFlags } }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} );\n\n\tfunction init( wasmBinary ) {\n\n\t\ttranscoderPending = new Promise( ( resolve ) => {\n\n\t\t\tBasisModule = { wasmBinary, onRuntimeInitialized: resolve };\n\t\t\tBASIS( BasisModule ); // eslint-disable-line no-undef\n\n\t\t} ).then( () => {\n\n\t\t\tBasisModule.initializeBasis();\n\n\t\t\tif ( BasisModule.KTX2File === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.KTX2Loader: Please update Basis Universal transcoder.' );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tfunction transcode( buffer ) {\n\n\t\tconst ktx2File = new BasisModule.KTX2File( new Uint8Array( buffer ) );\n\n\t\tfunction cleanup() {\n\n\t\t\tktx2File.close();\n\t\t\tktx2File.delete();\n\n\t\t}\n\n\t\tif ( ! ktx2File.isValid() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid or unsupported .ktx2 file' );\n\n\t\t}\n\n\t\tlet basisFormat;\n\n\t\tif ( ktx2File.isUASTC() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC;\n\n\t\t} else if ( ktx2File.isETC1S() ) {\n\n\t\t\tbasisFormat = BasisFormat.ETC1S;\n\n\t\t} else if ( ktx2File.isHDR() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC_HDR;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unknown Basis encoding' );\n\n\t\t}\n\n\t\tconst width = ktx2File.getWidth();\n\t\tconst height = ktx2File.getHeight();\n\t\tconst layerCount = ktx2File.getLayers() || 1;\n\t\tconst levelCount = ktx2File.getLevels();\n\t\tconst faceCount = ktx2File.getFaces();\n\t\tconst hasAlpha = ktx2File.getHasAlpha();\n\t\tconst dfdFlags = ktx2File.getDFDFlags();\n\n\t\tconst { transcoderFormat, engineFormat, engineType } = getTranscoderFormat( basisFormat, width, height, hasAlpha );\n\n\t\tif ( ! width || ! height || ! levelCount ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid texture' );\n\n\t\t}\n\n\t\tif ( ! ktx2File.startTranscoding() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader: .startTranscoding failed' );\n\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst buffers = [];\n\n\t\tfor ( let face = 0; face < faceCount; face ++ ) {\n\n\t\t\tconst mipmaps = [];\n\n\t\t\tfor ( let mip = 0; mip < levelCount; mip ++ ) {\n\n\t\t\t\tconst layerMips = [];\n\n\t\t\t\tlet mipWidth, mipHeight;\n\n\t\t\t\tfor ( let layer = 0; layer < layerCount; layer ++ ) {\n\n\t\t\t\t\tconst levelInfo = ktx2File.getImageLevelInfo( mip, layer, face );\n\n\t\t\t\t\tif ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( levelCount > 1 ) {\n\n\t\t\t\t\t\tmipWidth = levelInfo.origWidth;\n\t\t\t\t\t\tmipHeight = levelInfo.origHeight;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with\n\t\t\t\t\t\t// mipmaps must use multiple-of-four dimensions, for some texture formats and APIs.\n\t\t\t\t\t\t// See mrdoob/three.js#25908.\n\t\t\t\t\t\tmipWidth = levelInfo.width;\n\t\t\t\t\t\tmipHeight = levelInfo.height;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) );\n\t\t\t\t\tconst status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, - 1, - 1 );\n\n\t\t\t\t\tif ( engineType === EngineType.HalfFloatType ) {\n\n\t\t\t\t\t\tdst = new Uint16Array( dst.buffer, dst.byteOffset, dst.byteLength / Uint16Array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! status ) {\n\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tthrow new Error( 'THREE.KTX2Loader: .transcodeImage failed.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayerMips.push( dst );\n\n\t\t\t\t}\n\n\t\t\t\tconst mipData = concat( layerMips );\n\n\t\t\t\tmipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } );\n\t\t\t\tbuffers.push( mipData.buffer );\n\n\t\t\t}\n\n\t\t\tfaces.push( { mipmaps, width, height, format: engineFormat, type: engineType } );\n\n\t\t}\n\n\t\tcleanup();\n\n\t\treturn { faces, buffers, width, height, hasAlpha, dfdFlags, format: engineFormat, type: engineType };\n\n\t}\n\n\t//\n\n\t// Optimal choice of a transcoder target format depends on the Basis format (ETC1S, UASTC, or\n\t// UASTC HDR), device capabilities, and texture dimensions. The list below ranks the formats\n\t// separately for each format. Currently, priority is assigned based on:\n\t//\n\t// high quality > low quality > uncompressed\n\t//\n\t// Prioritization may be revisited, or exposed for configuration, in the future.\n\t//\n\t// Reference: https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXDeveloperGuide.md\n\tconst FORMAT_OPTIONS = [\n\t\t{\n\t\t\tif: 'astcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: Infinity,\n\t\t\tpriorityUASTC: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 3,\n\t\t\tpriorityUASTC: 2,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'dxtSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC1, TranscoderFormat.BC3 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 4,\n\t\t\tpriorityUASTC: 5,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc2Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1, TranscoderFormat.ETC2 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 1,\n\t\t\tpriorityUASTC: 3,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc1Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 2,\n\t\t\tpriorityUASTC: 4,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'pvrtcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA ],\n\t\t\tengineFormat: [ EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 5,\n\t\t\tpriorityUASTC: 6,\n\t\t\tneedsPowerOfTwo: true,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC6H ],\n\t\t\tengineFormat: [ EngineFormat.RGB_BPTC_UNSIGNED_Format ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\n\t\t// Uncompressed fallbacks.\n\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA32, TranscoderFormat.RGBA32 ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat, EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.UnsignedByteType, EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 100,\n\t\t\tpriorityUASTC: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA_HALF ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t}\n\t];\n\n\tconst OPTIONS = {\n\t\t// TODO: For ETC1S we intentionally sort by _UASTC_ priority, preserving\n\t\t// a historical accident shown to avoid performance pitfalls for Linux with\n\t\t// Firefox & AMD GPU (RadeonSI). Further work needed.\n\t\t// See https://github.com/mrdoob/three.js/pull/29730.\n\t\t[ BasisFormat.ETC1S ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.ETC1S ) )\n\t\t\t.sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ),\n\n\t\t[ BasisFormat.UASTC ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC ) )\n\t\t\t.sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ),\n\n\t\t[ BasisFormat.UASTC_HDR ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC_HDR ) )\n\t\t\t.sort( ( a, b ) => a.priorityHDR - b.priorityHDR ),\n\t};\n\n\tfunction getTranscoderFormat( basisFormat, width, height, hasAlpha ) {\n\n\t\tconst options = OPTIONS[ basisFormat ];\n\n\t\tfor ( let i = 0; i < options.length; i ++ ) {\n\n\t\t\tconst opt = options[ i ];\n\n\t\t\tif ( opt.if && ! config[ opt.if ] ) continue;\n\t\t\tif ( ! opt.basisFormat.includes( basisFormat ) ) continue;\n\t\t\tif ( hasAlpha && opt.transcoderFormat.length < 2 ) continue;\n\t\t\tif ( opt.needsPowerOfTwo && ! ( isPowerOfTwo( width ) && isPowerOfTwo( height ) ) ) continue;\n\n\t\t\tconst transcoderFormat = opt.transcoderFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineFormat = opt.engineFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineType = opt.engineType[ 0 ];\n\n\t\t\treturn { transcoderFormat, engineFormat, engineType };\n\n\t\t}\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Failed to identify transcoding target.' );\n\n\t}\n\n\tfunction isPowerOfTwo( value ) {\n\n\t\tif ( value <= 2 ) return true;\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t}\n\n\t/**\n\t * Concatenates N byte arrays.\n\t *\n\t * @param {Uint8Array[]} arrays\n\t * @return {Uint8Array}\n\t */\n\tfunction concat( arrays ) {\n\n\t\tif ( arrays.length === 1 ) return arrays[ 0 ];\n\n\t\tlet totalByteLength = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\ttotalByteLength += array.byteLength;\n\n\t\t}\n\n\t\tconst result = new Uint8Array( totalByteLength );\n\n\t\tlet byteOffset = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\tresult.set( array, byteOffset );\n\n\t\t\tbyteOffset += array.byteLength;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n};\n\n// Parsing for non-Basis textures. These textures may have supercompression\n// like Zstd, but they do not require transcoding.\n\nconst UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGFormat, RedFormat ] );\n\nconst FORMAT_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R8G8_UNORM ]: RGFormat,\n\t[ VK_FORMAT_R8G8_SRGB ]: RGFormat,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R16_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R8_SRGB ]: RedFormat,\n\t[ VK_FORMAT_R8_UNORM ]: RedFormat,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: RGBA_ASTC_4x4_Format,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: RGBA_ASTC_6x6_Format,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: RGBA_ASTC_6x6_Format,\n\n};\n\nconst TYPE_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8_SRGB ]: UnsignedByteType,\n\t[ VK_FORMAT_R8_UNORM ]: UnsignedByteType,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: HalfFloatType,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: UnsignedByteType,\n\n};\n\nasync function createRawTexture( container ) {\n\n\tconst { vkFormat } = container;\n\n\tif ( FORMAT_MAP[ vkFormat ] === undefined ) {\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported vkFormat.' );\n\n\t}\n\n\t//\n\n\tlet zstd;\n\n\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\tif ( ! _zstd ) {\n\n\t\t\t_zstd = new Promise( async ( resolve ) => {\n\n\t\t\t\tconst zstd = new ZSTDDecoder();\n\t\t\t\tawait zstd.init();\n\t\t\t\tresolve( zstd );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tzstd = await _zstd;\n\n\t}\n\n\t//\n\n\tconst mipmaps = [];\n\n\n\tfor ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) {\n\n\t\tconst levelWidth = Math.max( 1, container.pixelWidth >> levelIndex );\n\t\tconst levelHeight = Math.max( 1, container.pixelHeight >> levelIndex );\n\t\tconst levelDepth = container.pixelDepth ? Math.max( 1, container.pixelDepth >> levelIndex ) : 0;\n\n\t\tconst level = container.levels[ levelIndex ];\n\n\t\tlet levelData;\n\n\t\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_NONE ) {\n\n\t\t\tlevelData = level.levelData;\n\n\t\t} else if ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\t\tlevelData = zstd.decode( level.levelData, level.uncompressedByteLength );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported supercompressionScheme.' );\n\n\t\t}\n\n\t\tlet data;\n\n\t\tif ( TYPE_MAP[ vkFormat ] === FloatType ) {\n\n\t\t\tdata = new Float32Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Float32Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else if ( TYPE_MAP[ vkFormat ] === HalfFloatType ) {\n\n\t\t\tdata = new Uint16Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Uint16Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tdata = levelData;\n\n\t\t}\n\n\t\tmipmaps.push( {\n\n\t\t\tdata: data,\n\t\t\twidth: levelWidth,\n\t\t\theight: levelHeight,\n\t\t\tdepth: levelDepth,\n\n\t\t} );\n\n\t}\n\n\tlet texture;\n\n\tif ( UNCOMPRESSED_FORMATS.has( FORMAT_MAP[ vkFormat ] ) ) {\n\n\t\ttexture = container.pixelDepth === 0\n\t\t\t? new DataTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight )\n\t\t\t: new Data3DTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight, container.pixelDepth );\n\n\t} else {\n\n\t\tif ( container.pixelDepth > 0 ) throw new Error( 'THREE.KTX2Loader: Unsupported pixelDepth.' );\n\n\t\ttexture = new CompressedTexture( mipmaps, container.pixelWidth, container.pixelHeight );\n\n\t\ttexture.minFilter = mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\n\t}\n\n\ttexture.mipmaps = mipmaps;\n\n\ttexture.type = TYPE_MAP[ vkFormat ];\n\ttexture.format = FORMAT_MAP[ vkFormat ];\n\ttexture.colorSpace = parseColorSpace( container );\n\ttexture.needsUpdate = true;\n\n\t//\n\n\treturn Promise.resolve( texture );\n\n}\n\nfunction parseColorSpace( container ) {\n\n\tconst dfd = container.dataFormatDescriptor[ 0 ];\n\n\tif ( dfd.colorPrimaries === KHR_DF_PRIMARIES_BT709 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? SRGBColorSpace : LinearSRGBColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_DISPLAYP3 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? DisplayP3ColorSpace : LinearDisplayP3ColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_UNSPECIFIED ) {\n\n\t\treturn NoColorSpace;\n\n\t} else {\n\n\t\tconsole.warn( `THREE.KTX2Loader: Unsupported color primaries, \"${ dfd.colorPrimaries }\"` );\n\t\treturn NoColorSpace;\n\n\t}\n\n}\n\nexport { KTX2Loader };\n","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b;\nconst $retainerCount = Symbol('retainerCount');\nconst $recentlyUsed = Symbol('recentlyUsed');\nconst $evict = Symbol('evict');\nconst $evictionThreshold = Symbol('evictionThreshold');\nconst $cache = Symbol('cache');\n/**\n * The CacheEvictionPolicy manages the lifecycle for items in a cache,\n * evicting any items outside some threshold bounds in \"recently used\" order,\n * if they are evictable.\n *\n * Items are considered cached as they are retained. When all retainers\n * of an item release it, that item is considered evictable.\n */\nexport class CacheEvictionPolicy {\n constructor(cache, evictionThreshold = 5) {\n this[_a] = new Map();\n this[_b] = [];\n this[$cache] = cache;\n this[$evictionThreshold] = evictionThreshold;\n }\n /**\n * The eviction threshold is the maximum number of items to hold\n * in cache indefinitely. Items within the threshold (in recently\n * used order) will continue to be cached even if they have zero\n * retainers.\n */\n set evictionThreshold(value) {\n this[$evictionThreshold] = value;\n this[$evict]();\n }\n get evictionThreshold() {\n return this[$evictionThreshold];\n }\n /**\n * A reference to the cache that operates under this policy\n */\n get cache() {\n return this[$cache];\n }\n /**\n * Given an item key, returns the number of retainers of that item\n */\n retainerCount(key) {\n return this[$retainerCount].get(key) || 0;\n }\n /**\n * Resets the internal tracking of cache item retainers. Use only in cases\n * where it is certain that all retained cache items have been accounted for!\n */\n reset() {\n this[$retainerCount].clear();\n this[$recentlyUsed] = [];\n }\n /**\n * Mark a given cache item as retained, where the item is represented\n * by its key. An item can have any number of retainers.\n */\n retain(key) {\n if (!this[$retainerCount].has(key)) {\n this[$retainerCount].set(key, 0);\n }\n this[$retainerCount].set(key, this[$retainerCount].get(key) + 1);\n const recentlyUsedIndex = this[$recentlyUsed].indexOf(key);\n if (recentlyUsedIndex !== -1) {\n this[$recentlyUsed].splice(recentlyUsedIndex, 1);\n }\n this[$recentlyUsed].unshift(key);\n // Evict, in case retaining a new item pushed an evictable item beyond the\n // eviction threshold\n this[$evict]();\n }\n /**\n * Mark a given cache item as released by one of its retainers, where the item\n * is represented by its key. When all retainers of an item have released it,\n * the item is considered evictable.\n */\n release(key) {\n if (this[$retainerCount].has(key)) {\n this[$retainerCount].set(key, Math.max(this[$retainerCount].get(key) - 1, 0));\n }\n this[$evict]();\n }\n [(_a = $retainerCount, _b = $recentlyUsed, $evict)]() {\n if (this[$recentlyUsed].length < this[$evictionThreshold]) {\n return;\n }\n for (let i = this[$recentlyUsed].length - 1; i >= this[$evictionThreshold]; --i) {\n const key = this[$recentlyUsed][i];\n const retainerCount = this[$retainerCount].get(key);\n if (retainerCount === 0) {\n this[$cache].delete(key);\n this[$recentlyUsed].splice(i, 1);\n }\n }\n }\n}\n//# sourceMappingURL=cache-eviction-policy.js.map","/* @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * KHR_materials_variants specification allows duplicated variant names\n * but it makes handling the extension complex.\n * We ensure tha names and make it easier.\n * If you want to export the extension with the original names\n * you are recommended to write GLTFExporter plugin to restore the names.\n *\n * @param variantNames {Array}\n * @return {Array}\n */\nconst ensureUniqueNames = (variantNames) => {\n const uniqueNames = [];\n const knownNames = new Set();\n for (const name of variantNames) {\n let uniqueName = name;\n let suffix = 0;\n // @TODO: An easy solution.\n // O(N^2) in the worst scenario where N is variantNames.length.\n // Fix me if needed.\n while (knownNames.has(uniqueName)) {\n uniqueName = name + '.' + (++suffix);\n }\n knownNames.add(uniqueName);\n uniqueNames.push(uniqueName);\n }\n return uniqueNames;\n};\n/**\n * Convert mappings array to table object to make handling the extension easier.\n *\n * @param\n * extensionDef {glTF.meshes[n].primitive.extensions.KHR_materials_variants}\n * @param variantNames {Array} Required to be unique names\n * @return {Map}\n */\nconst mappingsArrayToTable = (extensionDef) => {\n const table = new Map();\n for (const mapping of extensionDef.mappings) {\n for (const variant of mapping.variants) {\n table.set(variant, { material: null, gltfMaterialIndex: mapping.material });\n }\n }\n return table;\n};\nexport default class GLTFMaterialsVariantsExtension {\n constructor(parser) {\n this.parser = parser;\n this.name = 'KHR_materials_variants';\n }\n // Note that the following properties will be overridden even if they are\n // pre-defined\n // - gltf.userData.variants\n // - mesh.userData.variantMaterials\n afterRoot(gltf) {\n const parser = this.parser;\n const json = parser.json;\n if (json.extensions === undefined ||\n json.extensions[this.name] === undefined) {\n return null;\n }\n const extensionDef = json.extensions[this.name];\n const variantsDef = extensionDef.variants || [];\n const variants = ensureUniqueNames(variantsDef.map((v) => v.name));\n for (const scene of gltf.scenes) {\n // Save the variants data under associated mesh.userData\n scene.traverse(object => {\n const mesh = object;\n if (!mesh.material) {\n return;\n }\n const association = parser.associations.get(mesh);\n if (association == null || association.meshes == null ||\n association.primitives == null) {\n return;\n }\n const meshDef = json.meshes[association.meshes];\n const primitivesDef = meshDef.primitives;\n const primitiveDef = primitivesDef[association.primitives];\n const extensionsDef = primitiveDef.extensions;\n if (!extensionsDef || !extensionsDef[this.name]) {\n return;\n }\n mesh.userData.variantMaterials =\n mappingsArrayToTable(extensionsDef[this.name]);\n });\n }\n gltf.userData.variants = variants;\n return Promise.resolve();\n }\n}\n//# sourceMappingURL=VariantMaterialLoaderPlugin.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b;\nimport { EventDispatcher, Texture } from 'three';\nimport { MeshoptDecoder } from 'three/examples/jsm/libs/meshopt_decoder.module.js';\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader.js';\nimport { CacheEvictionPolicy } from '../utilities/cache-eviction-policy.js';\nimport GLTFMaterialsVariantsExtension from './gltf-instance/VariantMaterialLoaderPlugin.js';\nTexture.DEFAULT_ANISOTROPY = 4;\n/**\n * A helper to Promise-ify a Three.js GLTFLoader\n */\nexport const loadWithLoader = (url, loader, progressCallback = () => { }) => {\n const onProgress = (event) => {\n const fraction = event.loaded / event.total;\n progressCallback(Math.max(0, Math.min(1, isFinite(fraction) ? fraction : 1)));\n };\n return new Promise((resolve, reject) => {\n loader.load(url, resolve, onProgress, reject);\n });\n};\n/** Helper to load a script tag. */\nconst fetchScript = (src) => {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n document.body.appendChild(script);\n script.onload = resolve;\n script.onerror = reject;\n script.async = true;\n script.src = src;\n });\n};\nconst cache = new Map();\nconst preloaded = new Map();\nlet dracoDecoderLocation;\nconst dracoLoader = new DRACOLoader();\nlet ktx2TranscoderLocation;\nconst ktx2Loader = new KTX2Loader();\nlet meshoptDecoderLocation;\nlet meshoptDecoder;\nexport const $loader = Symbol('loader');\nexport const $evictionPolicy = Symbol('evictionPolicy');\nconst $GLTFInstance = Symbol('GLTFInstance');\nexport class CachingGLTFLoader extends EventDispatcher {\n static setDRACODecoderLocation(url) {\n dracoDecoderLocation = url;\n dracoLoader.setDecoderPath(url);\n }\n static getDRACODecoderLocation() {\n return dracoDecoderLocation;\n }\n static setKTX2TranscoderLocation(url) {\n ktx2TranscoderLocation = url;\n ktx2Loader.setTranscoderPath(url);\n }\n static getKTX2TranscoderLocation() {\n return ktx2TranscoderLocation;\n }\n static setMeshoptDecoderLocation(url) {\n if (meshoptDecoderLocation !== url) {\n meshoptDecoderLocation = url;\n meshoptDecoder = fetchScript(url)\n .then(() => MeshoptDecoder.ready)\n .then(() => MeshoptDecoder);\n }\n }\n static getMeshoptDecoderLocation() {\n return meshoptDecoderLocation;\n }\n static initializeKTX2Loader(renderer) {\n ktx2Loader.detectSupport(renderer);\n }\n static get cache() {\n return cache;\n }\n /** @nocollapse */\n static clearCache() {\n cache.forEach((_value, url) => {\n this.delete(url);\n });\n this[$evictionPolicy].reset();\n }\n static has(url) {\n return cache.has(url);\n }\n /** @nocollapse */\n static async delete(url) {\n if (!this.has(url)) {\n return;\n }\n const gltfLoads = cache.get(url);\n preloaded.delete(url);\n cache.delete(url);\n const gltf = await gltfLoads;\n // Dispose of the cached glTF's materials and geometries:\n gltf.dispose();\n }\n /**\n * Returns true if the model that corresponds to the specified url is\n * available in our local cache.\n */\n static hasFinishedLoading(url) {\n return !!preloaded.get(url);\n }\n constructor(GLTFInstance) {\n super();\n this[_b] = new GLTFLoader().register(parser => new GLTFMaterialsVariantsExtension(parser));\n this[$GLTFInstance] = GLTFInstance;\n this[$loader].setDRACOLoader(dracoLoader);\n this[$loader].setKTX2Loader(ktx2Loader);\n }\n get [(_a = $evictionPolicy, _b = $loader, $evictionPolicy)]() {\n return this.constructor[$evictionPolicy];\n }\n /**\n * Preloads a glTF, populating the cache. Returns a promise that resolves\n * when the cache is populated.\n */\n async preload(url, element, progressCallback = () => { }) {\n this[$loader].setWithCredentials(element.withCredentials);\n this.dispatchEvent({ type: 'preload', element: element, src: url });\n if (!cache.has(url)) {\n if (meshoptDecoder != null) {\n this[$loader].setMeshoptDecoder(await meshoptDecoder);\n }\n const rawGLTFLoads = loadWithLoader(url, this[$loader], (progress) => {\n progressCallback(progress * 0.8);\n });\n const GLTFInstance = this[$GLTFInstance];\n const gltfInstanceLoads = rawGLTFLoads\n .then((rawGLTF) => {\n return GLTFInstance.prepare(rawGLTF);\n })\n .then((preparedGLTF) => {\n progressCallback(0.9);\n return new GLTFInstance(preparedGLTF);\n })\n .catch((reason => {\n console.error(reason);\n return new GLTFInstance();\n }));\n cache.set(url, gltfInstanceLoads);\n }\n await cache.get(url);\n preloaded.set(url, true);\n if (progressCallback) {\n progressCallback(1.0);\n }\n }\n /**\n * Loads a glTF from the specified url and resolves a unique clone of the\n * glTF. If the glTF has already been loaded, makes a clone of the cached\n * copy.\n */\n async load(url, element, progressCallback = () => { }) {\n await this.preload(url, element, progressCallback);\n const gltf = await cache.get(url);\n const clone = await gltf.clone();\n this[$evictionPolicy].retain(url);\n // Patch dispose so that we can properly account for instance use\n // in the caching layer:\n clone.dispose = () => {\n this[$evictionPolicy].release(url);\n };\n return clone;\n }\n}\nCachingGLTFLoader[_a] = new CacheEvictionPolicy(CachingGLTFLoader);\n//# sourceMappingURL=CachingGLTFLoader.js.map","import {\n\tMatrix4,\n\tObject3D,\n\tVector2,\n\tVector3\n} from 'three';\n\nclass CSS2DObject extends Object3D {\n\n\tconstructor( element = document.createElement( 'div' ) ) {\n\n\t\tsuper();\n\n\t\tthis.isCSS2DObject = true;\n\n\t\tthis.element = element;\n\n\t\tthis.element.style.position = 'absolute';\n\t\tthis.element.style.userSelect = 'none';\n\n\t\tthis.element.setAttribute( 'draggable', false );\n\n\t\tthis.center = new Vector2( 0.5, 0.5 ); // ( 0, 0 ) is the lower left; ( 1, 1 ) is the top right\n\n\t\tthis.addEventListener( 'removed', function () {\n\n\t\t\tthis.traverse( function ( object ) {\n\n\t\t\t\tif (\n\t\t\t\t\tobject.element instanceof object.element.ownerDocument.defaultView.Element &&\n\t\t\t\t\tobject.element.parentNode !== null\n\t\t\t\t) {\n\n\t\t\t\t\tobject.element.remove();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.element = source.element.cloneNode( true );\n\n\t\tthis.center = source.center;\n\n\t\treturn this;\n\n\t}\n\n}\n\n//\n\nconst _vector = new Vector3();\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _a = new Vector3();\nconst _b = new Vector3();\n\nclass CSS2DRenderer {\n\n\tconstructor( parameters = {} ) {\n\n\t\tconst _this = this;\n\n\t\tlet _width, _height;\n\t\tlet _widthHalf, _heightHalf;\n\n\t\tconst cache = {\n\t\t\tobjects: new WeakMap()\n\t\t};\n\n\t\tconst domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' );\n\n\t\tdomElement.style.overflow = 'hidden';\n\n\t\tthis.domElement = domElement;\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_viewMatrix.copy( camera.matrixWorldInverse );\n\t\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix );\n\n\t\t\trenderObject( scene, scene, camera );\n\t\t\tzOrder( scene );\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\n\t\t};\n\n\t\tfunction hideObject( object ) {\n\n\t\t\tif ( object.isCSS2DObject ) object.element.style.display = 'none';\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\thideObject( object.children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera ) {\n\n\t\t\tif ( object.visible === false ) {\n\n\t\t\t\thideObject( object );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( object.isCSS2DObject ) {\n\n\t\t\t\t_vector.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t_vector.applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\tconst visible = ( _vector.z >= - 1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true );\n\n\t\t\t\tconst element = object.element;\n\t\t\t\telement.style.display = visible === true ? '' : 'none';\n\n\t\t\t\tif ( visible === true ) {\n\n\t\t\t\t\tobject.onBeforeRender( _this, scene, camera );\n\n\t\t\t\t\telement.style.transform = 'translate(' + ( - 100 * object.center.x ) + '%,' + ( - 100 * object.center.y ) + '%)' + 'translate(' + ( _vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - _vector.y * _heightHalf + _heightHalf ) + 'px)';\n\n\t\t\t\t\tif ( element.parentNode !== domElement ) {\n\n\t\t\t\t\t\tdomElement.appendChild( element );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.onAfterRender( _this, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t\tconst objectData = {\n\t\t\t\t\tdistanceToCameraSquared: getDistanceToSquared( camera, object )\n\t\t\t\t};\n\n\t\t\t\tcache.objects.set( object, objectData );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( object.children[ i ], scene, camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getDistanceToSquared( object1, object2 ) {\n\n\t\t\t_a.setFromMatrixPosition( object1.matrixWorld );\n\t\t\t_b.setFromMatrixPosition( object2.matrixWorld );\n\n\t\t\treturn _a.distanceToSquared( _b );\n\n\t\t}\n\n\t\tfunction filterAndFlatten( scene ) {\n\n\t\t\tconst result = [];\n\n\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isCSS2DObject ) result.push( object );\n\n\t\t\t} );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction zOrder( scene ) {\n\n\t\t\tconst sorted = filterAndFlatten( scene ).sort( function ( a, b ) {\n\n\t\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\t\treturn b.renderOrder - a.renderOrder;\n\n\t\t\t\t}\n\n\t\t\t\tconst distanceA = cache.objects.get( a ).distanceToCameraSquared;\n\t\t\t\tconst distanceB = cache.objects.get( b ).distanceToCameraSquared;\n\n\t\t\t\treturn distanceA - distanceB;\n\n\t\t\t} );\n\n\t\t\tconst zMax = sorted.length;\n\n\t\t\tfor ( let i = 0, l = sorted.length; i < l; i ++ ) {\n\n\t\t\t\tsorted[ i ].element.style.zIndex = zMax - i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { CSS2DObject, CSS2DRenderer };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tGroup,\n\tMatrix4,\n\tMesh,\n\tVector3\n} from 'three';\n\nimport { mergeGroups, deepCloneAttribute } from './BufferGeometryUtils.js';\n\nconst _color = /*@__PURE__*/new Color();\nconst _matrix = /*@__PURE__*/new Matrix4();\n\nfunction createMeshesFromInstancedMesh( instancedMesh ) {\n\n\tconst group = new Group();\n\n\tconst count = instancedMesh.count;\n\tconst geometry = instancedMesh.geometry;\n\tconst material = instancedMesh.material;\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tinstancedMesh.getMatrixAt( i, mesh.matrix );\n\t\tmesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );\n\n\t\tgroup.add( mesh );\n\n\t}\n\n\tgroup.copy( instancedMesh );\n\tgroup.updateMatrixWorld(); // ensure correct world matrices of meshes\n\n\treturn group;\n\n}\n\nfunction createMeshesFromMultiMaterialMesh( mesh ) {\n\n\tif ( Array.isArray( mesh.material ) === false ) {\n\n\t\tconsole.warn( 'THREE.SceneUtils.createMeshesFromMultiMaterialMesh(): The given mesh has no multiple materials.' );\n\t\treturn mesh;\n\n\t}\n\n\tconst object = new Group();\n\tobject.copy( mesh );\n\n\t// merge groups (which automatically sorts them)\n\n\tconst geometry = mergeGroups( mesh.geometry );\n\n\tconst index = geometry.index;\n\tconst groups = geometry.groups;\n\tconst attributeNames = Object.keys( geometry.attributes );\n\n\t// create a mesh for each group by extracting the buffer data into a new geometry\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst start = group.start;\n\t\tconst end = start + group.count;\n\n\t\tconst newGeometry = new BufferGeometry();\n\t\tconst newMaterial = mesh.material[ group.materialIndex ];\n\n\t\t// process all buffer attributes\n\n\t\tfor ( let j = 0; j < attributeNames.length; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.attributes[ name ];\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tconst newLength = group.count * itemSize;\n\t\t\tconst type = attribute.array.constructor;\n\n\t\t\tconst newArray = new type( newLength );\n\t\t\tconst newAttribute = new BufferAttribute( newArray, itemSize );\n\n\t\t\tfor ( let k = start, n = 0; k < end; k ++, n ++ ) {\n\n\t\t\t\tconst ind = index.getX( k );\n\n\t\t\t\tif ( itemSize >= 1 ) newAttribute.setX( n, attribute.getX( ind ) );\n\t\t\t\tif ( itemSize >= 2 ) newAttribute.setY( n, attribute.getY( ind ) );\n\t\t\t\tif ( itemSize >= 3 ) newAttribute.setZ( n, attribute.getZ( ind ) );\n\t\t\t\tif ( itemSize >= 4 ) newAttribute.setW( n, attribute.getW( ind ) );\n\n\t\t\t}\n\n\n\t\t\tnewGeometry.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\tconst newMesh = new Mesh( newGeometry, newMaterial );\n\t\tobject.add( newMesh );\n\n\t}\n\n\treturn object;\n\n}\n\nfunction createMultiMaterialObject( geometry, materials ) {\n\n\tconst group = new Group();\n\n\tfor ( let i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t}\n\n\treturn group;\n\n}\n\nfunction reduceVertices( object, func, initialValue ) {\n\n\tlet value = initialValue;\n\tconst vertex = new Vector3();\n\n\tobject.updateWorldMatrix( true, true );\n\n\tobject.traverseVisible( ( child ) => {\n\n\t\tconst { geometry } = child;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst { position } = geometry.attributes;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( child.isMesh ) {\n\n\t\t\t\t\t\tchild.getVertexPosition( i, vertex );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! child.isSkinnedMesh ) {\n\n\t\t\t\t\t\tvertex.applyMatrix4( child.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = func( value, vertex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn value;\n\n}\n\n/**\n * @param {InstancedMesh} mesh\n * @param {function(int, int):int} compareFn\n */\nfunction sortInstancedMesh( mesh, compareFn ) {\n\n\t// store copy of instanced attributes for lookups\n\n\tconst instanceMatrixRef = deepCloneAttribute( mesh.instanceMatrix );\n\tconst instanceColorRef = mesh.instanceColor ? deepCloneAttribute( mesh.instanceColor ) : null;\n\n\tconst attributeRefs = new Map();\n\n\tfor ( const name in mesh.geometry.attributes ) {\n\n\t\tconst attribute = mesh.geometry.attributes[ name ];\n\n\t\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\t\tattributeRefs.set( attribute, deepCloneAttribute( attribute ) );\n\n\t\t}\n\n\t}\n\n\n\t// compute sort order\n\n\tconst tokens = [];\n\n\tfor ( let i = 0; i < mesh.count; i ++ ) tokens.push( i );\n\n\ttokens.sort( compareFn );\n\n\n\t// apply sort order\n\n\tfor ( let i = 0; i < tokens.length; i ++ ) {\n\n\t\tconst refIndex = tokens[ i ];\n\n\t\t_matrix.fromArray( instanceMatrixRef.array, refIndex * mesh.instanceMatrix.itemSize );\n\t\t_matrix.toArray( mesh.instanceMatrix.array, i * mesh.instanceMatrix.itemSize );\n\n\t\tif ( mesh.instanceColor ) {\n\n\t\t\t_color.fromArray( instanceColorRef.array, refIndex * mesh.instanceColor.itemSize );\n\t\t\t_color.toArray( mesh.instanceColor.array, i * mesh.instanceColor.itemSize );\n\n\t\t}\n\n\t\tfor ( const name in mesh.geometry.attributes ) {\n\n\t\t\tconst attribute = mesh.geometry.attributes[ name ];\n\n\t\t\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\t\t\tconst attributeRef = attributeRefs.get( attribute );\n\n\t\t\t\tattribute.setX( i, attributeRef.getX( refIndex ) );\n\t\t\t\tif ( attribute.itemSize > 1 ) attribute.setY( i, attributeRef.getY( refIndex ) );\n\t\t\t\tif ( attribute.itemSize > 2 ) attribute.setZ( i, attributeRef.getZ( refIndex ) );\n\t\t\t\tif ( attribute.itemSize > 3 ) attribute.setW( i, attributeRef.getW( refIndex ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D} object Object to traverse.\n * @yields {Object3D} Objects that passed the filter condition.\n */\nfunction* traverseGenerator( object ) {\n\n\tyield object;\n\n\tconst children = object.children;\n\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\tyield* traverseGenerator( children[ i ] );\n\n\t}\n\n}\n\n/**\n * @param {Object3D} object Object to traverse.\n * @yields {Object3D} Objects that passed the filter condition.\n */\nfunction* traverseVisibleGenerator( object ) {\n\n\tif ( object.visible === false ) return;\n\n\tyield object;\n\n\tconst children = object.children;\n\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\tyield* traverseVisibleGenerator( children[ i ] );\n\n\t}\n\n}\n\n/**\n * @param {Object3D} object Object to traverse.\n * @yields {Object3D} Objects that passed the filter condition.\n */\nfunction* traverseAncestorsGenerator( object ) {\n\n\tconst parent = object.parent;\n\n\tif ( parent !== null ) {\n\n\t\tyield parent;\n\n\t\tyield* traverseAncestorsGenerator( parent );\n\n\t}\n\n}\n\nexport {\n\tcreateMeshesFromInstancedMesh,\n\tcreateMeshesFromMultiMaterialMesh,\n\tcreateMultiMaterialObject,\n\treduceVertices,\n\tsortInstancedMesh,\n\ttraverseGenerator,\n\ttraverseVisibleGenerator,\n\ttraverseAncestorsGenerator\n};\n","import {\n\tBufferAttribute,\n\tClampToEdgeWrapping,\n\tColor,\n\tDoubleSide,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tMathUtils,\n\tMatrix4,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tPropertyBinding,\n\tRGBAFormat,\n\tRepeatWrapping,\n\tScene,\n\tSource,\n\tSRGBColorSpace,\n\tCompressedTexture,\n\tVector3,\n\tQuaternion,\n\tREVISION\n} from 'three';\n\n/**\n * The KHR_mesh_quantization extension allows these extra attribute component types\n *\n * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md#extending-mesh-attributes\n */\nconst KHR_mesh_quantization_ExtraAttrTypes = {\n\tPOSITION: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'unsigned byte normalized',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t\t'unsigned short normalized',\n\t],\n\tNORMAL: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTANGENT: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTEXCOORD: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t],\n};\n\n\nclass GLTFExporter {\n\n\tconstructor() {\n\n\t\tthis.textureUtils = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFLightExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsUnlitExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( writer );\n\n\t\t} );\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t *\n\t * @param {Scene|Array} input Scene or Array of THREE.Scenes\n\t * @param {Function} onDone Callback on completed\n\t * @param {Function} onError Callback on errors\n\t * @param {Object} options options\n\t */\n\tparse( input, onDone, onError, options ) {\n\n\t\tconst writer = new GLTFWriter();\n\t\tconst plugins = [];\n\n\t\tfor ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) {\n\n\t\t\tplugins.push( this.pluginCallbacks[ i ]( writer ) );\n\n\t\t}\n\n\t\twriter.setPlugins( plugins );\n\t\twriter.setTextureUtils( this.textureUtils );\n\t\twriter.writeAsync( input, onDone, options ).catch( onError );\n\n\t}\n\n\tparseAsync( input, options ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( input, resolve, reject, options );\n\n\t\t} );\n\n\t}\n\n}\n\n//------------------------------------------------------------------------------\n// Constants\n//------------------------------------------------------------------------------\n\nconst WEBGL_CONSTANTS = {\n\tPOINTS: 0x0000,\n\tLINES: 0x0001,\n\tLINE_LOOP: 0x0002,\n\tLINE_STRIP: 0x0003,\n\tTRIANGLES: 0x0004,\n\tTRIANGLE_STRIP: 0x0005,\n\tTRIANGLE_FAN: 0x0006,\n\n\tBYTE: 0x1400,\n\tUNSIGNED_BYTE: 0x1401,\n\tSHORT: 0x1402,\n\tUNSIGNED_SHORT: 0x1403,\n\tINT: 0x1404,\n\tUNSIGNED_INT: 0x1405,\n\tFLOAT: 0x1406,\n\n\tARRAY_BUFFER: 0x8892,\n\tELEMENT_ARRAY_BUFFER: 0x8893,\n\n\tNEAREST: 0x2600,\n\tLINEAR: 0x2601,\n\tNEAREST_MIPMAP_NEAREST: 0x2700,\n\tLINEAR_MIPMAP_NEAREST: 0x2701,\n\tNEAREST_MIPMAP_LINEAR: 0x2702,\n\tLINEAR_MIPMAP_LINEAR: 0x2703,\n\n\tCLAMP_TO_EDGE: 33071,\n\tMIRRORED_REPEAT: 33648,\n\tREPEAT: 10497\n};\n\nconst KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization';\n\nconst THREE_TO_WEBGL = {};\n\nTHREE_TO_WEBGL[ NearestFilter ] = WEBGL_CONSTANTS.NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR;\nTHREE_TO_WEBGL[ LinearFilter ] = WEBGL_CONSTANTS.LINEAR;\nTHREE_TO_WEBGL[ LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR;\n\nTHREE_TO_WEBGL[ ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE;\nTHREE_TO_WEBGL[ RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT;\nTHREE_TO_WEBGL[ MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT;\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\tposition: 'translation',\n\tquaternion: 'rotation',\n\tmorphTargetInfluences: 'weights'\n};\n\nconst DEFAULT_SPECULAR_COLOR = new Color();\n\n// GLB constants\n// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\nconst GLB_HEADER_BYTES = 12;\nconst GLB_HEADER_MAGIC = 0x46546C67;\nconst GLB_VERSION = 2;\n\nconst GLB_CHUNK_PREFIX_BYTES = 8;\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A;\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942;\n\n//------------------------------------------------------------------------------\n// Utility functions\n//------------------------------------------------------------------------------\n\n/**\n * Compare two arrays\n * @param {Array} array1 Array 1 to compare\n * @param {Array} array2 Array 2 to compare\n * @return {boolean} Returns true if both arrays are equal\n */\nfunction equalArray( array1, array2 ) {\n\n\treturn ( array1.length === array2.length ) && array1.every( function ( element, index ) {\n\n\t\treturn element === array2[ index ];\n\n\t} );\n\n}\n\n/**\n * Converts a string to an ArrayBuffer.\n * @param {string} text\n * @return {ArrayBuffer}\n */\nfunction stringToArrayBuffer( text ) {\n\n\treturn new TextEncoder().encode( text ).buffer;\n\n}\n\n/**\n * Is identity matrix\n *\n * @param {Matrix4} matrix\n * @returns {boolean} Returns true, if parameter is identity matrix\n */\nfunction isIdentityMatrix( matrix ) {\n\n\treturn equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] );\n\n}\n\n/**\n * Get the min and max vectors from the given attribute\n *\n * @param {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count\n * @param {number} start Start index\n * @param {number} count Range to cover\n * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components)\n */\nfunction getMinMax( attribute, start, count ) {\n\n\tconst output = {\n\n\t\tmin: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ),\n\t\tmax: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY )\n\n\t};\n\n\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\tlet value;\n\n\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t} else {\n\n\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toutput.min[ a ] = Math.min( output.min[ a ], value );\n\t\t\toutput.max[ a ] = Math.max( output.max[ a ], value );\n\n\t\t}\n\n\t}\n\n\treturn output;\n\n}\n\n/**\n * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment\n *\n * @param {number} bufferSize The size the original buffer. Should be an integer.\n * @returns {number} new buffer size with required padding as an integer.\n *\n */\nfunction getPaddedBufferSize( bufferSize ) {\n\n\treturn Math.ceil( bufferSize / 4 ) * 4;\n\n}\n\n/**\n * Returns a buffer aligned to 4-byte boundary.\n *\n * @param {ArrayBuffer} arrayBuffer Buffer to pad\n * @param {number} [paddingByte=0] Should be an integer\n * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer\n */\nfunction getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) {\n\n\tconst paddedLength = getPaddedBufferSize( arrayBuffer.byteLength );\n\n\tif ( paddedLength !== arrayBuffer.byteLength ) {\n\n\t\tconst array = new Uint8Array( paddedLength );\n\t\tarray.set( new Uint8Array( arrayBuffer ) );\n\n\t\tif ( paddingByte !== 0 ) {\n\n\t\t\tfor ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) {\n\n\t\t\t\tarray[ i ] = paddingByte;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn array.buffer;\n\n\t}\n\n\treturn arrayBuffer;\n\n}\n\nfunction getCanvas() {\n\n\tif ( typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined' ) {\n\n\t\treturn new OffscreenCanvas( 1, 1 );\n\n\t}\n\n\treturn document.createElement( 'canvas' );\n\n}\n\nfunction getToBlobPromise( canvas, mimeType ) {\n\n\tif ( canvas.toBlob !== undefined ) {\n\n\t\treturn new Promise( ( resolve ) => canvas.toBlob( resolve, mimeType ) );\n\n\t}\n\n\tlet quality;\n\n\t// Blink's implementation of convertToBlob seems to default to a quality level of 100%\n\t// Use the Blink default quality levels of toBlob instead so that file sizes are comparable.\n\tif ( mimeType === 'image/jpeg' ) {\n\n\t\tquality = 0.92;\n\n\t} else if ( mimeType === 'image/webp' ) {\n\n\t\tquality = 0.8;\n\n\t}\n\n\treturn canvas.convertToBlob( {\n\n\t\ttype: mimeType,\n\t\tquality: quality\n\n\t} );\n\n}\n\n/**\n * Writer\n */\nclass GLTFWriter {\n\n\tconstructor() {\n\n\t\tthis.plugins = [];\n\n\t\tthis.options = {};\n\t\tthis.pending = [];\n\t\tthis.buffers = [];\n\n\t\tthis.byteOffset = 0;\n\t\tthis.buffers = [];\n\t\tthis.nodeMap = new Map();\n\t\tthis.skins = [];\n\n\t\tthis.extensionsUsed = {};\n\t\tthis.extensionsRequired = {};\n\n\t\tthis.uids = new Map();\n\t\tthis.uid = 0;\n\n\t\tthis.json = {\n\t\t\tasset: {\n\t\t\t\tversion: '2.0',\n\t\t\t\tgenerator: 'THREE.GLTFExporter r' + REVISION\n\t\t\t}\n\t\t};\n\n\t\tthis.cache = {\n\t\t\tmeshes: new Map(),\n\t\t\tattributes: new Map(),\n\t\t\tattributesNormalized: new Map(),\n\t\t\tmaterials: new Map(),\n\t\t\ttextures: new Map(),\n\t\t\timages: new Map()\n\t\t};\n\n\t\tthis.textureUtils = null;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t *\n\t * @param {Scene|Array} input Scene or Array of THREE.Scenes\n\t * @param {Function} onDone Callback on completed\n\t * @param {Object} options options\n\t */\n\tasync writeAsync( input, onDone, options = {} ) {\n\n\t\tthis.options = Object.assign( {\n\t\t\t// default options\n\t\t\tbinary: false,\n\t\t\ttrs: false,\n\t\t\tonlyVisible: true,\n\t\t\tmaxTextureSize: Infinity,\n\t\t\tanimations: [],\n\t\t\tincludeCustomExtensions: false\n\t\t}, options );\n\n\t\tif ( this.options.animations.length > 0 ) {\n\n\t\t\t// Only TRS properties, and not matrices, may be targeted by animation.\n\t\t\tthis.options.trs = true;\n\n\t\t}\n\n\t\tawait this.processInputAsync( input );\n\n\t\tawait Promise.all( this.pending );\n\n\t\tconst writer = this;\n\t\tconst buffers = writer.buffers;\n\t\tconst json = writer.json;\n\t\toptions = writer.options;\n\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\t\tconst extensionsRequired = writer.extensionsRequired;\n\n\t\t// Merge buffers.\n\t\tconst blob = new Blob( buffers, { type: 'application/octet-stream' } );\n\n\t\t// Declare extensions.\n\t\tconst extensionsUsedList = Object.keys( extensionsUsed );\n\t\tconst extensionsRequiredList = Object.keys( extensionsRequired );\n\n\t\tif ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList;\n\t\tif ( extensionsRequiredList.length > 0 ) json.extensionsRequired = extensionsRequiredList;\n\n\t\t// Update bytelength of the single buffer.\n\t\tif ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;\n\n\t\tif ( options.binary === true ) {\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\t// Binary chunk.\n\t\t\t\tconst binaryChunk = getPaddedArrayBuffer( reader.result );\n\t\t\t\tconst binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tbinaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );\n\t\t\t\tbinaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true );\n\n\t\t\t\t// JSON chunk.\n\t\t\t\tconst jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );\n\t\t\t\tconst jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tjsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );\n\t\t\t\tjsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true );\n\n\t\t\t\t// GLB header.\n\t\t\t\tconst header = new ArrayBuffer( GLB_HEADER_BYTES );\n\t\t\t\tconst headerView = new DataView( header );\n\t\t\t\theaderView.setUint32( 0, GLB_HEADER_MAGIC, true );\n\t\t\t\theaderView.setUint32( 4, GLB_VERSION, true );\n\t\t\t\tconst totalByteLength = GLB_HEADER_BYTES\n\t\t\t\t\t+ jsonChunkPrefix.byteLength + jsonChunk.byteLength\n\t\t\t\t\t+ binaryChunkPrefix.byteLength + binaryChunk.byteLength;\n\t\t\t\theaderView.setUint32( 8, totalByteLength, true );\n\n\t\t\t\tconst glbBlob = new Blob( [\n\t\t\t\t\theader,\n\t\t\t\t\tjsonChunkPrefix,\n\t\t\t\t\tjsonChunk,\n\t\t\t\t\tbinaryChunkPrefix,\n\t\t\t\t\tbinaryChunk\n\t\t\t\t], { type: 'application/octet-stream' } );\n\n\t\t\t\tconst glbReader = new FileReader();\n\t\t\t\tglbReader.readAsArrayBuffer( glbBlob );\n\t\t\t\tglbReader.onloadend = function () {\n\n\t\t\t\t\tonDone( glbReader.result );\n\n\t\t\t\t};\n\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tif ( json.buffers && json.buffers.length > 0 ) {\n\n\t\t\t\tconst reader = new FileReader();\n\t\t\t\treader.readAsDataURL( blob );\n\t\t\t\treader.onloadend = function () {\n\n\t\t\t\t\tconst base64data = reader.result;\n\t\t\t\t\tjson.buffers[ 0 ].uri = base64data;\n\t\t\t\t\tonDone( json );\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tonDone( json );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\t/**\n\t * Serializes a userData.\n\t *\n\t * @param {THREE.Object3D|THREE.Material} object\n\t * @param {Object} objectDef\n\t */\n\tserializeUserData( object, objectDef ) {\n\n\t\tif ( Object.keys( object.userData ).length === 0 ) return;\n\n\t\tconst options = this.options;\n\t\tconst extensionsUsed = this.extensionsUsed;\n\n\t\ttry {\n\n\t\t\tconst json = JSON.parse( JSON.stringify( object.userData ) );\n\n\t\t\tif ( options.includeCustomExtensions && json.gltfExtensions ) {\n\n\t\t\t\tif ( objectDef.extensions === undefined ) objectDef.extensions = {};\n\n\t\t\t\tfor ( const extensionName in json.gltfExtensions ) {\n\n\t\t\t\t\tobjectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ];\n\t\t\t\t\textensionsUsed[ extensionName ] = true;\n\n\t\t\t\t}\n\n\t\t\t\tdelete json.gltfExtensions;\n\n\t\t\t}\n\n\t\t\tif ( Object.keys( json ).length > 0 ) objectDef.extras = json;\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: userData of \\'' + object.name + '\\' ' +\n\t\t\t\t'won\\'t be serialized because of JSON.stringify error - ' + error.message );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns ids for buffer attributes.\n\t *\n\t * @param {Object} attribute\n\t * @param {boolean} [isRelativeCopy=false]\n\t * @return {number} An integer\n\t */\n\tgetUID( attribute, isRelativeCopy = false ) {\n\n\t\tif ( this.uids.has( attribute ) === false ) {\n\n\t\t\tconst uids = new Map();\n\n\t\t\tuids.set( true, this.uid ++ );\n\t\t\tuids.set( false, this.uid ++ );\n\n\t\t\tthis.uids.set( attribute, uids );\n\n\t\t}\n\n\t\tconst uids = this.uids.get( attribute );\n\n\t\treturn uids.get( isRelativeCopy );\n\n\t}\n\n\t/**\n\t * Checks if normal attribute values are normalized.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {boolean}\n\t */\n\tisNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) ) return false;\n\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = normal.count; i < il; i ++ ) {\n\n\t\t\t// 0.0005 is from glTF-validator\n\t\t\tif ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Creates normalized normal buffer attribute.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {BufferAttribute}\n\t *\n\t */\n\tcreateNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) )\treturn cache.attributesNormalized.get( normal );\n\n\t\tconst attribute = normal.clone();\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tv.fromBufferAttribute( attribute, i );\n\n\t\t\tif ( v.x === 0 && v.y === 0 && v.z === 0 ) {\n\n\t\t\t\t// if values can't be normalized set (1, 0, 0)\n\t\t\t\tv.setX( 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tv.normalize();\n\n\t\t\t}\n\n\t\t\tattribute.setXYZ( i, v.x, v.y, v.z );\n\n\t\t}\n\n\t\tcache.attributesNormalized.set( normal, attribute );\n\n\t\treturn attribute;\n\n\t}\n\n\t/**\n\t * Applies a texture transform, if present, to the map definition. Requires\n\t * the KHR_texture_transform extension.\n\t *\n\t * @param {Object} mapDef\n\t * @param {THREE.Texture} texture\n\t */\n\tapplyTextureTransform( mapDef, texture ) {\n\n\t\tlet didTransform = false;\n\t\tconst transformDef = {};\n\n\t\tif ( texture.offset.x !== 0 || texture.offset.y !== 0 ) {\n\n\t\t\ttransformDef.offset = texture.offset.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.rotation !== 0 ) {\n\n\t\t\ttransformDef.rotation = texture.rotation;\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) {\n\n\t\t\ttransformDef.scale = texture.repeat.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( didTransform ) {\n\n\t\t\tmapDef.extensions = mapDef.extensions || {};\n\t\t\tmapDef.extensions[ 'KHR_texture_transform' ] = transformDef;\n\t\t\tthis.extensionsUsed[ 'KHR_texture_transform' ] = true;\n\n\t\t}\n\n\t}\n\n\tasync buildMetalRoughTextureAsync( metalnessMap, roughnessMap ) {\n\n\t\tif ( metalnessMap === roughnessMap ) return metalnessMap;\n\n\t\tfunction getEncodingConversion( map ) {\n\n\t\t\tif ( map.colorSpace === SRGBColorSpace ) {\n\n\t\t\t\treturn function SRGBToLinear( c ) {\n\n\t\t\t\t\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn function LinearToLinear( c ) {\n\n\t\t\t\treturn c;\n\n\t\t\t};\n\n\t\t}\n\n\t\tif ( metalnessMap instanceof CompressedTexture ) {\n\n\t\t\tmetalnessMap = await this.decompressTextureAsync( metalnessMap );\n\n\t\t}\n\n\t\tif ( roughnessMap instanceof CompressedTexture ) {\n\n\t\t\troughnessMap = await this.decompressTextureAsync( roughnessMap );\n\n\t\t}\n\n\t\tconst metalness = metalnessMap ? metalnessMap.image : null;\n\t\tconst roughness = roughnessMap ? roughnessMap.image : null;\n\n\t\tconst width = Math.max( metalness ? metalness.width : 0, roughness ? roughness.width : 0 );\n\t\tconst height = Math.max( metalness ? metalness.height : 0, roughness ? roughness.height : 0 );\n\n\t\tconst canvas = getCanvas();\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tconst context = canvas.getContext( '2d', {\n\t\t\twillReadFrequently: true,\n\t\t} );\n\t\tcontext.fillStyle = '#00ffff';\n\t\tcontext.fillRect( 0, 0, width, height );\n\n\t\tconst composite = context.getImageData( 0, 0, width, height );\n\n\t\tif ( metalness ) {\n\n\t\t\tcontext.drawImage( metalness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( metalnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 2; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( roughness ) {\n\n\t\t\tcontext.drawImage( roughness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( roughnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 1; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcontext.putImageData( composite, 0, 0 );\n\n\t\t//\n\n\t\tconst reference = metalnessMap || roughnessMap;\n\n\t\tconst texture = reference.clone();\n\n\t\ttexture.source = new Source( canvas );\n\t\ttexture.colorSpace = NoColorSpace;\n\t\ttexture.channel = ( metalnessMap || roughnessMap ).channel;\n\n\t\tif ( metalnessMap && roughnessMap && metalnessMap.channel !== roughnessMap.channel ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match.' );\n\n\t\t}\n\n\t\tconsole.warn( 'THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.' );\n\n\t\treturn texture;\n\n\t}\n\n\n\tasync decompressTextureAsync( texture, maxTextureSize = Infinity ) {\n\n\t\tif ( this.textureUtils === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: setTextureUtils() must be called to process compressed textures.' );\n\n\t\t}\n\n\t\treturn await this.textureUtils.decompress( texture, maxTextureSize );\n\n\t}\n\n\t/**\n\t * Process a buffer to append to the default one.\n\t * @param {ArrayBuffer} buffer\n\t * @return {0}\n\t */\n\tprocessBuffer( buffer ) {\n\n\t\tconst json = this.json;\n\t\tconst buffers = this.buffers;\n\n\t\tif ( ! json.buffers ) json.buffers = [ { byteLength: 0 } ];\n\n\t\t// All buffers are merged before export.\n\t\tbuffers.push( buffer );\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView\n\t * @param {BufferAttribute} attribute\n\t * @param {number} componentType\n\t * @param {number} start\n\t * @param {number} count\n\t * @param {?number} target Target usage of the BufferView\n\t * @return {Object}\n\t */\n\tprocessBufferView( attribute, componentType, start, count, target ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\t// Create a new dataview and dump the attribute's array into it\n\n\t\tlet componentSize;\n\n\t\tswitch ( componentType ) {\n\n\t\t\tcase WEBGL_CONSTANTS.BYTE:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_BYTE:\n\n\t\t\t\tcomponentSize = 1;\n\n\t\t\t\tbreak;\n\n\t\t\tcase WEBGL_CONSTANTS.SHORT:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_SHORT:\n\n\t\t\t\tcomponentSize = 2;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tcomponentSize = 4;\n\n\t\t}\n\n\t\tlet byteStride = attribute.itemSize * componentSize;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Each element of a vertex attribute MUST be aligned to 4-byte boundaries\n\t\t\t// inside a bufferView\n\t\t\tbyteStride = Math.ceil( byteStride / 4 ) * 4;\n\n\t\t}\n\n\t\tconst byteLength = getPaddedBufferSize( count * byteStride );\n\t\tconst dataView = new DataView( new ArrayBuffer( byteLength ) );\n\t\tlet offset = 0;\n\n\t\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\tlet value;\n\n\t\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( componentType === WEBGL_CONSTANTS.FLOAT ) {\n\n\t\t\t\t\tdataView.setFloat32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.INT ) {\n\n\t\t\t\t\tdataView.setInt32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) {\n\n\t\t\t\t\tdataView.setUint32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.SHORT ) {\n\n\t\t\t\t\tdataView.setInt16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {\n\n\t\t\t\t\tdataView.setUint16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.BYTE ) {\n\n\t\t\t\t\tdataView.setInt8( offset, value );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {\n\n\t\t\t\t\tdataView.setUint8( offset, value );\n\n\t\t\t\t}\n\n\t\t\t\toffset += componentSize;\n\n\t\t\t}\n\n\t\t\tif ( ( offset % byteStride ) !== 0 ) {\n\n\t\t\t\toffset += byteStride - ( offset % byteStride );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bufferViewDef = {\n\n\t\t\tbuffer: this.processBuffer( dataView.buffer ),\n\t\t\tbyteOffset: this.byteOffset,\n\t\t\tbyteLength: byteLength\n\n\t\t};\n\n\t\tif ( target !== undefined ) bufferViewDef.target = target;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Only define byteStride for vertex attributes.\n\t\t\tbufferViewDef.byteStride = byteStride;\n\n\t\t}\n\n\t\tthis.byteOffset += byteLength;\n\n\t\tjson.bufferViews.push( bufferViewDef );\n\n\t\t// @TODO Merge bufferViews where possible.\n\t\tconst output = {\n\n\t\t\tid: json.bufferViews.length - 1,\n\t\t\tbyteLength: 0\n\n\t\t};\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView from an image Blob.\n\t * @param {Blob} blob\n\t * @return {Promise} An integer\n\t */\n\tprocessBufferViewImage( blob ) {\n\n\t\tconst writer = this;\n\t\tconst json = writer.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\treturn new Promise( function ( resolve ) {\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\tconst buffer = getPaddedArrayBuffer( reader.result );\n\n\t\t\t\tconst bufferViewDef = {\n\t\t\t\t\tbuffer: writer.processBuffer( buffer ),\n\t\t\t\t\tbyteOffset: writer.byteOffset,\n\t\t\t\t\tbyteLength: buffer.byteLength\n\t\t\t\t};\n\n\t\t\t\twriter.byteOffset += buffer.byteLength;\n\t\t\t\tresolve( json.bufferViews.push( bufferViewDef ) - 1 );\n\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Process attribute to generate an accessor\n\t * @param {BufferAttribute} attribute Attribute to process\n\t * @param {?BufferGeometry} geometry Geometry used for truncated draw range\n\t * @param {number} [start=0]\n\t * @param {number} [count=Infinity]\n\t * @return {?number} Index of the processed accessor on the \"accessors\" array\n\t */\n\tprocessAccessor( attribute, geometry, start, count ) {\n\n\t\tconst json = this.json;\n\n\t\tconst types = {\n\n\t\t\t1: 'SCALAR',\n\t\t\t2: 'VEC2',\n\t\t\t3: 'VEC3',\n\t\t\t4: 'VEC4',\n\t\t\t9: 'MAT3',\n\t\t\t16: 'MAT4'\n\n\t\t};\n\n\t\tlet componentType;\n\n\t\t// Detect the component type of the attribute array\n\t\tif ( attribute.array.constructor === Float32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.FLOAT;\n\n\t\t} else if ( attribute.array.constructor === Int32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.INT;\n\n\t\t} else if ( attribute.array.constructor === Uint32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_INT;\n\n\t\t} else if ( attribute.array.constructor === Int16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.SHORT;\n\n\t\t} else if ( attribute.array.constructor === Uint16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_SHORT;\n\n\t\t} else if ( attribute.array.constructor === Int8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.BYTE;\n\n\t\t} else if ( attribute.array.constructor === Uint8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type: ' + attribute.array.constructor.name );\n\n\t\t}\n\n\t\tif ( start === undefined ) start = 0;\n\t\tif ( count === undefined || count === Infinity ) count = attribute.count;\n\n\t\t// Skip creating an accessor if the attribute doesn't have data to export\n\t\tif ( count === 0 ) return null;\n\n\t\tconst minMax = getMinMax( attribute, start, count );\n\t\tlet bufferViewTarget;\n\n\t\t// If geometry isn't provided, don't infer the target usage of the bufferView. For\n\t\t// animation samplers, target must not be set.\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tbufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;\n\n\t\t}\n\n\t\tconst bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget );\n\n\t\tconst accessorDef = {\n\n\t\t\tbufferView: bufferView.id,\n\t\t\tbyteOffset: bufferView.byteOffset,\n\t\t\tcomponentType: componentType,\n\t\t\tcount: count,\n\t\t\tmax: minMax.max,\n\t\t\tmin: minMax.min,\n\t\t\ttype: types[ attribute.itemSize ]\n\n\t\t};\n\n\t\tif ( attribute.normalized === true ) accessorDef.normalized = true;\n\t\tif ( ! json.accessors ) json.accessors = [];\n\n\t\treturn json.accessors.push( accessorDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process image\n\t * @param {Image} image to process\n\t * @param {number} format Identifier of the format (RGBAFormat)\n\t * @param {boolean} flipY before writing out the image\n\t * @param {string} mimeType export format\n\t * @return {number} Index of the processed texture in the \"images\" array\n\t */\n\tprocessImage( image, format, flipY, mimeType = 'image/png' ) {\n\n\t\tif ( image !== null ) {\n\n\t\t\tconst writer = this;\n\t\t\tconst cache = writer.cache;\n\t\t\tconst json = writer.json;\n\t\t\tconst options = writer.options;\n\t\t\tconst pending = writer.pending;\n\n\t\t\tif ( ! cache.images.has( image ) ) cache.images.set( image, {} );\n\n\t\t\tconst cachedImages = cache.images.get( image );\n\n\t\t\tconst key = mimeType + ':flipY/' + flipY.toString();\n\n\t\t\tif ( cachedImages[ key ] !== undefined ) return cachedImages[ key ];\n\n\t\t\tif ( ! json.images ) json.images = [];\n\n\t\t\tconst imageDef = { mimeType: mimeType };\n\n\t\t\tconst canvas = getCanvas();\n\n\t\t\tcanvas.width = Math.min( image.width, options.maxTextureSize );\n\t\t\tcanvas.height = Math.min( image.height, options.maxTextureSize );\n\n\t\t\tconst ctx = canvas.getContext( '2d', {\n\t\t\t\twillReadFrequently: true,\n\t\t\t} );\n\n\t\t\tif ( flipY === true ) {\n\n\t\t\t\tctx.translate( 0, canvas.height );\n\t\t\t\tctx.scale( 1, - 1 );\n\n\t\t\t}\n\n\t\t\tif ( image.data !== undefined ) { // THREE.DataTexture\n\n\t\t\t\tif ( format !== RGBAFormat ) {\n\n\t\t\t\t\tconsole.error( 'GLTFExporter: Only RGBAFormat is supported.', format );\n\n\t\t\t\t}\n\n\t\t\t\tif ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) {\n\n\t\t\t\t\tconsole.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image );\n\n\t\t\t\t}\n\n\t\t\t\tconst data = new Uint8ClampedArray( image.height * image.width * 4 );\n\n\t\t\t\tfor ( let i = 0; i < data.length; i += 4 ) {\n\n\t\t\t\t\tdata[ i + 0 ] = image.data[ i + 0 ];\n\t\t\t\t\tdata[ i + 1 ] = image.data[ i + 1 ];\n\t\t\t\t\tdata[ i + 2 ] = image.data[ i + 2 ];\n\t\t\t\t\tdata[ i + 3 ] = image.data[ i + 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t\t( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ) {\n\n\t\t\t\t\tctx.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( options.binary === true ) {\n\n\t\t\t\tpending.push(\n\n\t\t\t\t\tgetToBlobPromise( canvas, mimeType )\n\t\t\t\t\t\t.then( blob => writer.processBufferViewImage( blob ) )\n\t\t\t\t\t\t.then( bufferViewIndex => {\n\n\t\t\t\t\t\t\timageDef.bufferView = bufferViewIndex;\n\n\t\t\t\t\t\t} )\n\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tif ( canvas.toDataURL !== undefined ) {\n\n\t\t\t\t\timageDef.uri = canvas.toDataURL( mimeType );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpending.push(\n\n\t\t\t\t\t\tgetToBlobPromise( canvas, mimeType )\n\t\t\t\t\t\t\t.then( blob => new FileReader().readAsDataURL( blob ) )\n\t\t\t\t\t\t\t.then( dataURL => {\n\n\t\t\t\t\t\t\t\timageDef.uri = dataURL;\n\n\t\t\t\t\t\t\t} )\n\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst index = json.images.push( imageDef ) - 1;\n\t\t\tcachedImages[ key ] = index;\n\t\t\treturn index;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: No valid image data found. Unable to process texture.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process sampler\n\t * @param {Texture} map Texture to process\n\t * @return {number} Index of the processed texture in the \"samplers\" array\n\t */\n\tprocessSampler( map ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.samplers ) json.samplers = [];\n\n\t\tconst samplerDef = {\n\t\t\tmagFilter: THREE_TO_WEBGL[ map.magFilter ],\n\t\t\tminFilter: THREE_TO_WEBGL[ map.minFilter ],\n\t\t\twrapS: THREE_TO_WEBGL[ map.wrapS ],\n\t\t\twrapT: THREE_TO_WEBGL[ map.wrapT ]\n\t\t};\n\n\t\treturn json.samplers.push( samplerDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process texture\n\t * @param {Texture} map Map to process\n\t * @return {Promise} Index of the processed texture in the \"textures\" array\n\t */\n\tasync processTextureAsync( map ) {\n\n\t\tconst writer = this;\n\t\tconst options = writer.options;\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.textures.has( map ) ) return cache.textures.get( map );\n\n\t\tif ( ! json.textures ) json.textures = [];\n\n\t\t// make non-readable textures (e.g. CompressedTexture) readable by blitting them into a new texture\n\t\tif ( map instanceof CompressedTexture ) {\n\n\t\t\tmap = await this.decompressTextureAsync( map, options.maxTextureSize );\n\n\t\t}\n\n\t\tlet mimeType = map.userData.mimeType;\n\n\t\tif ( mimeType === 'image/webp' ) mimeType = 'image/png';\n\n\t\tconst textureDef = {\n\t\t\tsampler: this.processSampler( map ),\n\t\t\tsource: this.processImage( map.image, map.format, map.flipY, mimeType )\n\t\t};\n\n\t\tif ( map.name ) textureDef.name = map.name;\n\n\t\tawait this._invokeAllAsync( async function ( ext ) {\n\n\t\t\text.writeTexture && await ext.writeTexture( map, textureDef );\n\n\t\t} );\n\n\t\tconst index = json.textures.push( textureDef ) - 1;\n\t\tcache.textures.set( map, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process material\n\t * @param {THREE.Material} material Material to process\n\t * @return {Promise} Index of the processed material in the \"materials\" array\n\t */\n\tasync processMaterialAsync( material ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.materials.has( material ) ) return cache.materials.get( material );\n\n\t\tif ( material.isShaderMaterial ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( ! json.materials ) json.materials = [];\n\n\t\t// @QUESTION Should we avoid including any attribute that has the default value?\n\t\tconst materialDef = {\tpbrMetallicRoughness: {} };\n\n\t\tif ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorFactor\n\t\tconst color = material.color.toArray().concat( [ material.opacity ] );\n\n\t\tif ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorFactor = color;\n\n\t\t}\n\n\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = material.metalness;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;\n\n\t\t} else {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 1;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.metallicRoughnessTexture\n\t\tif ( material.metalnessMap || material.roughnessMap ) {\n\n\t\t\tconst metalRoughTexture = await this.buildMetalRoughTextureAsync( material.metalnessMap, material.roughnessMap );\n\n\t\t\tconst metalRoughMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( metalRoughTexture ),\n\t\t\t\ttexCoord: metalRoughTexture.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( metalRoughMapDef, metalRoughTexture );\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorTexture\n\t\tif ( material.map ) {\n\n\t\t\tconst baseColorMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( material.map ),\n\t\t\t\ttexCoord: material.map.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( baseColorMapDef, material.map );\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tconst emissive = material.emissive;\n\t\t\tconst maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );\n\n\t\t\tif ( maxEmissiveComponent > 0 ) {\n\n\t\t\t\tmaterialDef.emissiveFactor = material.emissive.toArray();\n\n\t\t\t}\n\n\t\t\t// emissiveTexture\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tconst emissiveMapDef = {\n\t\t\t\t\tindex: await this.processTextureAsync( material.emissiveMap ),\n\t\t\t\t\ttexCoord: material.emissiveMap.channel\n\t\t\t\t};\n\t\t\t\tthis.applyTextureTransform( emissiveMapDef, material.emissiveMap );\n\t\t\t\tmaterialDef.emissiveTexture = emissiveMapDef;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalTexture\n\t\tif ( material.normalMap ) {\n\n\t\t\tconst normalMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( material.normalMap ),\n\t\t\t\ttexCoord: material.normalMap.channel\n\t\t\t};\n\n\t\t\tif ( material.normalScale && material.normalScale.x !== 1 ) {\n\n\t\t\t\t// glTF normal scale is univariate. Ignore `y`, which may be flipped.\n\t\t\t\t// Context: https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\tnormalMapDef.scale = material.normalScale.x;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( normalMapDef, material.normalMap );\n\t\t\tmaterialDef.normalTexture = normalMapDef;\n\n\t\t}\n\n\t\t// occlusionTexture\n\t\tif ( material.aoMap ) {\n\n\t\t\tconst occlusionMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( material.aoMap ),\n\t\t\t\ttexCoord: material.aoMap.channel\n\t\t\t};\n\n\t\t\tif ( material.aoMapIntensity !== 1.0 ) {\n\n\t\t\t\tocclusionMapDef.strength = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( occlusionMapDef, material.aoMap );\n\t\t\tmaterialDef.occlusionTexture = occlusionMapDef;\n\n\t\t}\n\n\t\t// alphaMode\n\t\tif ( material.transparent ) {\n\n\t\t\tmaterialDef.alphaMode = 'BLEND';\n\n\t\t} else {\n\n\t\t\tif ( material.alphaTest > 0.0 ) {\n\n\t\t\t\tmaterialDef.alphaMode = 'MASK';\n\t\t\t\tmaterialDef.alphaCutoff = material.alphaTest;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// doubleSided\n\t\tif ( material.side === DoubleSide ) materialDef.doubleSided = true;\n\t\tif ( material.name !== '' ) materialDef.name = material.name;\n\n\t\tthis.serializeUserData( material, materialDef );\n\n\t\tawait this._invokeAllAsync( async function ( ext ) {\n\n\t\t\text.writeMaterialAsync && await ext.writeMaterialAsync( material, materialDef );\n\n\t\t} );\n\n\t\tconst index = json.materials.push( materialDef ) - 1;\n\t\tcache.materials.set( material, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process mesh\n\t * @param {THREE.Mesh} mesh Mesh to process\n\t * @return {Promise} Index of the processed mesh in the \"meshes\" array\n\t */\n\tasync processMeshAsync( mesh ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tconst meshCacheKeyParts = [ mesh.geometry.uuid ];\n\n\t\tif ( Array.isArray( mesh.material ) ) {\n\n\t\t\tfor ( let i = 0, l = mesh.material.length; i < l; i ++ ) {\n\n\t\t\t\tmeshCacheKeyParts.push( mesh.material[ i ].uuid\t);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmeshCacheKeyParts.push( mesh.material.uuid );\n\n\t\t}\n\n\t\tconst meshCacheKey = meshCacheKeyParts.join( ':' );\n\n\t\tif ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey );\n\n\t\tconst geometry = mesh.geometry;\n\n\t\tlet mode;\n\n\t\t// Use the correct mode\n\t\tif ( mesh.isLineSegments ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINES;\n\n\t\t} else if ( mesh.isLineLoop ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_LOOP;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_STRIP;\n\n\t\t} else if ( mesh.isPoints ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.POINTS;\n\n\t\t} else {\n\n\t\t\tmode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;\n\n\t\t}\n\n\t\tconst meshDef = {};\n\t\tconst attributes = {};\n\t\tconst primitives = [];\n\t\tconst targets = [];\n\n\t\t// Conversion between attributes names in threejs and gltf spec\n\t\tconst nameConversion = {\n\t\t\tuv: 'TEXCOORD_0',\n\t\t\tuv1: 'TEXCOORD_1',\n\t\t\tuv2: 'TEXCOORD_2',\n\t\t\tuv3: 'TEXCOORD_3',\n\t\t\tcolor: 'COLOR_0',\n\t\t\tskinWeight: 'WEIGHTS_0',\n\t\t\tskinIndex: 'JOINTS_0'\n\t\t};\n\n\t\tconst originalNormal = geometry.getAttribute( 'normal' );\n\n\t\tif ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' );\n\n\t\t\tgeometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) );\n\n\t\t}\n\n\t\t// @QUESTION Detect if .vertexColors = true?\n\t\t// For every attribute create an accessor\n\t\tlet modifiedAttribute = null;\n\n\t\tfor ( let attributeName in geometry.attributes ) {\n\n\t\t\t// Ignore morph target attributes, which are exported later.\n\t\t\tif ( attributeName.slice( 0, 5 ) === 'morph' ) continue;\n\n\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\tattributeName = nameConversion[ attributeName ] || attributeName.toUpperCase();\n\n\t\t\t// Prefix all geometry attributes except the ones specifically\n\t\t\t// listed in the spec; non-spec attributes are considered custom.\n\t\t\tconst validVertexAttributes =\n\t\t\t\t\t/^(POSITION|NORMAL|TANGENT|TEXCOORD_\\d+|COLOR_\\d+|JOINTS_\\d+|WEIGHTS_\\d+)$/;\n\n\t\t\tif ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;\n\n\t\t\tif ( cache.attributes.has( this.getUID( attribute ) ) ) {\n\n\t\t\t\tattributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Enforce glTF vertex attribute requirements:\n\t\t\t// - JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT\n\t\t\t// - Only custom attributes may be INT or UNSIGNED_INT\n\t\t\tmodifiedAttribute = null;\n\t\t\tconst array = attribute.array;\n\n\t\t\tif ( attributeName === 'JOINTS_0' &&\n\t\t\t\t! ( array instanceof Uint16Array ) &&\n\t\t\t\t! ( array instanceof Uint8Array ) ) {\n\n\t\t\t\tconsole.warn( 'GLTFExporter: Attribute \"skinIndex\" converted to type UNSIGNED_SHORT.' );\n\t\t\t\tmodifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );\n\n\t\t\t} else if ( ( array instanceof Uint32Array || array instanceof Int32Array ) && ! attributeName.startsWith( '_' ) ) {\n\n\t\t\t\tconsole.warn( `GLTFExporter: Attribute \"${ attributeName }\" converted to type FLOAT.` );\n\t\t\t\tmodifiedAttribute = GLTFExporter.Utils.toFloat32BufferAttribute( attribute );\n\n\t\t\t}\n\n\t\t\tconst accessor = this.processAccessor( modifiedAttribute || attribute, geometry );\n\n\t\t\tif ( accessor !== null ) {\n\n\t\t\t\tif ( ! attributeName.startsWith( '_' ) ) {\n\n\t\t\t\t\tthis.detectMeshQuantization( attributeName, attribute );\n\n\t\t\t\t}\n\n\t\t\t\tattributes[ attributeName ] = accessor;\n\t\t\t\tcache.attributes.set( this.getUID( attribute ), accessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal );\n\n\t\t// Skip if no exportable attributes found\n\t\tif ( Object.keys( attributes ).length === 0 ) return null;\n\n\t\t// Morph targets\n\t\tif ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) {\n\n\t\t\tconst weights = [];\n\t\t\tconst targetNames = [];\n\t\t\tconst reverseDictionary = {};\n\n\t\t\tif ( mesh.morphTargetDictionary !== undefined ) {\n\n\t\t\t\tfor ( const key in mesh.morphTargetDictionary ) {\n\n\t\t\t\t\treverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) {\n\n\t\t\t\tconst target = {};\n\t\t\t\tlet warned = false;\n\n\t\t\t\tfor ( const attributeName in geometry.morphAttributes ) {\n\n\t\t\t\t\t// glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.\n\t\t\t\t\t// Three.js doesn't support TANGENT yet.\n\n\t\t\t\t\tif ( attributeName !== 'position' && attributeName !== 'normal' ) {\n\n\t\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' );\n\t\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst attribute = geometry.morphAttributes[ attributeName ][ i ];\n\t\t\t\t\tconst gltfAttributeName = attributeName.toUpperCase();\n\n\t\t\t\t\t// Three.js morph attribute has absolute values while the one of glTF has relative values.\n\t\t\t\t\t//\n\t\t\t\t\t// glTF 2.0 Specification:\n\t\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets\n\n\t\t\t\t\tconst baseAttribute = geometry.attributes[ attributeName ];\n\n\t\t\t\t\tif ( cache.attributes.has( this.getUID( attribute, true ) ) ) {\n\n\t\t\t\t\t\ttarget[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute, true ) );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clones attribute not to override\n\t\t\t\t\tconst relativeAttribute = attribute.clone();\n\n\t\t\t\t\tif ( ! geometry.morphTargetsRelative ) {\n\n\t\t\t\t\t\tfor ( let j = 0, jl = attribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\t\t\t\t\tif ( a === 0 ) relativeAttribute.setX( j, attribute.getX( j ) - baseAttribute.getX( j ) );\n\t\t\t\t\t\t\t\tif ( a === 1 ) relativeAttribute.setY( j, attribute.getY( j ) - baseAttribute.getY( j ) );\n\t\t\t\t\t\t\t\tif ( a === 2 ) relativeAttribute.setZ( j, attribute.getZ( j ) - baseAttribute.getZ( j ) );\n\t\t\t\t\t\t\t\tif ( a === 3 ) relativeAttribute.setW( j, attribute.getW( j ) - baseAttribute.getW( j ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry );\n\t\t\t\t\tcache.attributes.set( this.getUID( baseAttribute, true ), target[ gltfAttributeName ] );\n\n\t\t\t\t}\n\n\t\t\t\ttargets.push( target );\n\n\t\t\t\tweights.push( mesh.morphTargetInfluences[ i ] );\n\n\t\t\t\tif ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] );\n\n\t\t\t}\n\n\t\t\tmeshDef.weights = weights;\n\n\t\t\tif ( targetNames.length > 0 ) {\n\n\t\t\t\tmeshDef.extras = {};\n\t\t\t\tmeshDef.extras.targetNames = targetNames;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst isMultiMaterial = Array.isArray( mesh.material );\n\n\t\tif ( isMultiMaterial && geometry.groups.length === 0 ) return null;\n\n\t\tlet didForceIndices = false;\n\n\t\tif ( isMultiMaterial && geometry.index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tfor ( let i = 0, il = geometry.attributes.position.count; i < il; i ++ ) {\n\n\t\t\t\tindices[ i ] = i;\n\n\t\t\t}\n\n\t\t\tgeometry.setIndex( indices );\n\n\t\t\tdidForceIndices = true;\n\n\t\t}\n\n\t\tconst materials = isMultiMaterial ? mesh.material : [ mesh.material ];\n\t\tconst groups = isMultiMaterial ? geometry.groups : [ { materialIndex: 0, start: undefined, count: undefined } ];\n\n\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = {\n\t\t\t\tmode: mode,\n\t\t\t\tattributes: attributes,\n\t\t\t};\n\n\t\t\tthis.serializeUserData( geometry, primitive );\n\n\t\t\tif ( targets.length > 0 ) primitive.targets = targets;\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tlet cacheKey = this.getUID( geometry.index );\n\n\t\t\t\tif ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) {\n\n\t\t\t\t\tcacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cache.attributes.has( cacheKey ) ) {\n\n\t\t\t\t\tprimitive.indices = cache.attributes.get( cacheKey );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tprimitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count );\n\t\t\t\t\tcache.attributes.set( cacheKey, primitive.indices );\n\n\t\t\t\t}\n\n\t\t\t\tif ( primitive.indices === null ) delete primitive.indices;\n\n\t\t\t}\n\n\t\t\tconst material = await this.processMaterialAsync( materials[ groups[ i ].materialIndex ] );\n\n\t\t\tif ( material !== null ) primitive.material = material;\n\n\t\t\tprimitives.push( primitive );\n\n\t\t}\n\n\t\tif ( didForceIndices === true ) {\n\n\t\t\tgeometry.setIndex( null );\n\n\t\t}\n\n\t\tmeshDef.primitives = primitives;\n\n\t\tif ( ! json.meshes ) json.meshes = [];\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.writeMesh && ext.writeMesh( mesh, meshDef );\n\n\t\t} );\n\n\t\tconst index = json.meshes.push( meshDef ) - 1;\n\t\tcache.meshes.set( meshCacheKey, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * If a vertex attribute with a\n\t * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview)\n\t * is used, it is checked whether it is a valid data type according to the\n\t * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md)\n\t * extension.\n\t * In this case the extension is automatically added to the list of used extensions.\n\t *\n\t * @param {string} attributeName\n\t * @param {THREE.BufferAttribute} attribute\n\t */\n\tdetectMeshQuantization( attributeName, attribute ) {\n\n\t\tif ( this.extensionsUsed[ KHR_MESH_QUANTIZATION ] ) return;\n\n\t\tlet attrType = undefined;\n\n\t\tswitch ( attribute.array.constructor ) {\n\n\t\t\tcase Int8Array:\n\n\t\t\t\tattrType = 'byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint8Array:\n\n\t\t\t\tattrType = 'unsigned byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Int16Array:\n\n\t\t\t\tattrType = 'short';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint16Array:\n\n\t\t\t\tattrType = 'unsigned short';\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.normalized ) attrType += ' normalized';\n\n\t\tconst attrNamePrefix = attributeName.split( '_', 1 )[ 0 ];\n\n\t\tif ( KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ] && KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ].includes( attrType ) ) {\n\n\t\t\tthis.extensionsUsed[ KHR_MESH_QUANTIZATION ] = true;\n\t\t\tthis.extensionsRequired[ KHR_MESH_QUANTIZATION ] = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process camera\n\t * @param {THREE.Camera} camera Camera to process\n\t * @return {number} Index of the processed mesh in the \"camera\" array\n\t */\n\tprocessCamera( camera ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.cameras ) json.cameras = [];\n\n\t\tconst isOrtho = camera.isOrthographicCamera;\n\n\t\tconst cameraDef = {\n\t\t\ttype: isOrtho ? 'orthographic' : 'perspective'\n\t\t};\n\n\t\tif ( isOrtho ) {\n\n\t\t\tcameraDef.orthographic = {\n\t\t\t\txmag: camera.right * 2,\n\t\t\t\tymag: camera.top * 2,\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tcameraDef.perspective = {\n\t\t\t\taspectRatio: camera.aspect,\n\t\t\t\tyfov: MathUtils.degToRad( camera.fov ),\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t}\n\n\t\t// Question: Is saving \"type\" as name intentional?\n\t\tif ( camera.name !== '' ) cameraDef.name = camera.type;\n\n\t\treturn json.cameras.push( cameraDef ) - 1;\n\n\t}\n\n\t/**\n\t * Creates glTF animation entry from AnimationClip object.\n\t *\n\t * Status:\n\t * - Only properties listed in PATH_PROPERTIES may be animated.\n\t *\n\t * @param {THREE.AnimationClip} clip\n\t * @param {THREE.Object3D} root\n\t * @return {number|null}\n\t */\n\tprocessAnimation( clip, root ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.animations ) json.animations = [];\n\n\t\tclip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root );\n\n\t\tconst tracks = clip.tracks;\n\t\tconst channels = [];\n\t\tconst samplers = [];\n\n\t\tfor ( let i = 0; i < tracks.length; ++ i ) {\n\n\t\t\tconst track = tracks[ i ];\n\t\t\tconst trackBinding = PropertyBinding.parseTrackName( track.name );\n\t\t\tlet trackNode = PropertyBinding.findNode( root, trackBinding.nodeName );\n\t\t\tconst trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ];\n\n\t\t\tif ( trackBinding.objectName === 'bones' ) {\n\n\t\t\t\tif ( trackNode.isSkinnedMesh === true ) {\n\n\t\t\t\t\ttrackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttrackNode = undefined;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! trackNode || ! trackProperty ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Could not export animation track \"%s\".', track.name );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst inputItemSize = 1;\n\t\t\tlet outputItemSize = track.values.length / track.times.length;\n\n\t\t\tif ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) {\n\n\t\t\t\toutputItemSize /= trackNode.morphTargetInfluences.length;\n\n\t\t\t}\n\n\t\t\tlet interpolation;\n\n\t\t\t// @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE\n\n\t\t\t// Detecting glTF cubic spline interpolant by checking factory method's special property\n\t\t\t// GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return\n\t\t\t// valid value from .getInterpolation().\n\t\t\tif ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) {\n\n\t\t\t\tinterpolation = 'CUBICSPLINE';\n\n\t\t\t\t// itemSize of CUBICSPLINE keyframe is 9\n\t\t\t\t// (VEC3 * 3: inTangent, splineVertex, and outTangent)\n\t\t\t\t// but needs to be stored as VEC3 so dividing by 3 here.\n\t\t\t\toutputItemSize /= 3;\n\n\t\t\t} else if ( track.getInterpolation() === InterpolateDiscrete ) {\n\n\t\t\t\tinterpolation = 'STEP';\n\n\t\t\t} else {\n\n\t\t\t\tinterpolation = 'LINEAR';\n\n\t\t\t}\n\n\t\t\tsamplers.push( {\n\t\t\t\tinput: this.processAccessor( new BufferAttribute( track.times, inputItemSize ) ),\n\t\t\t\toutput: this.processAccessor( new BufferAttribute( track.values, outputItemSize ) ),\n\t\t\t\tinterpolation: interpolation\n\t\t\t} );\n\n\t\t\tchannels.push( {\n\t\t\t\tsampler: samplers.length - 1,\n\t\t\t\ttarget: {\n\t\t\t\t\tnode: nodeMap.get( trackNode ),\n\t\t\t\t\tpath: trackProperty\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\tjson.animations.push( {\n\t\t\tname: clip.name || 'clip_' + json.animations.length,\n\t\t\tsamplers: samplers,\n\t\t\tchannels: channels\n\t\t} );\n\n\t\treturn json.animations.length - 1;\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D} object\n\t * @return {number|null}\n\t */\n\t processSkin( object ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tconst node = json.nodes[ nodeMap.get( object ) ];\n\n\t\tconst skeleton = object.skeleton;\n\n\t\tif ( skeleton === undefined ) return null;\n\n\t\tconst rootJoint = object.skeleton.bones[ 0 ];\n\n\t\tif ( rootJoint === undefined ) return null;\n\n\t\tconst joints = [];\n\t\tconst inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 );\n\t\tconst temporaryBoneInverse = new Matrix4();\n\n\t\tfor ( let i = 0; i < skeleton.bones.length; ++ i ) {\n\n\t\t\tjoints.push( nodeMap.get( skeleton.bones[ i ] ) );\n\t\t\ttemporaryBoneInverse.copy( skeleton.boneInverses[ i ] );\n\t\t\ttemporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( json.skins === undefined ) json.skins = [];\n\n\t\tjson.skins.push( {\n\t\t\tinverseBindMatrices: this.processAccessor( new BufferAttribute( inverseBindMatrices, 16 ) ),\n\t\t\tjoints: joints,\n\t\t\tskeleton: nodeMap.get( rootJoint )\n\t\t} );\n\n\t\tconst skinIndex = node.skin = json.skins.length - 1;\n\n\t\treturn skinIndex;\n\n\t}\n\n\t/**\n\t * Process Object3D node\n\t * @param {THREE.Object3D} object Object3D to processNodeAsync\n\t * @return {Promise} Index of the node in the nodes list\n\t */\n\tasync processNodeAsync( object ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.nodes ) json.nodes = [];\n\n\t\tconst nodeDef = {};\n\n\t\tif ( options.trs ) {\n\n\t\t\tconst rotation = object.quaternion.toArray();\n\t\t\tconst position = object.position.toArray();\n\t\t\tconst scale = object.scale.toArray();\n\n\t\t\tif ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {\n\n\t\t\t\tnodeDef.rotation = rotation;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( position, [ 0, 0, 0 ] ) ) {\n\n\t\t\t\tnodeDef.translation = position;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {\n\n\t\t\t\tnodeDef.scale = scale;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( object.matrixAutoUpdate ) {\n\n\t\t\t\tobject.updateMatrix();\n\n\t\t\t}\n\n\t\t\tif ( isIdentityMatrix( object.matrix ) === false ) {\n\n\t\t\t\tnodeDef.matrix = object.matrix.elements;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// We don't export empty strings name because it represents no-name in Three.js.\n\t\tif ( object.name !== '' ) nodeDef.name = String( object.name );\n\n\t\tthis.serializeUserData( object, nodeDef );\n\n\t\tif ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\tconst meshIndex = await this.processMeshAsync( object );\n\n\t\t\tif ( meshIndex !== null ) nodeDef.mesh = meshIndex;\n\n\t\t} else if ( object.isCamera ) {\n\n\t\t\tnodeDef.camera = this.processCamera( object );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) this.skins.push( object );\n\n\t\tif ( object.children.length > 0 ) {\n\n\t\t\tconst children = [];\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = object.children[ i ];\n\n\t\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\t\tconst nodeIndex = await this.processNodeAsync( child );\n\n\t\t\t\t\tif ( nodeIndex !== null ) children.push( nodeIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( children.length > 0 ) nodeDef.children = children;\n\n\t\t}\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.writeNode && ext.writeNode( object, nodeDef );\n\n\t\t} );\n\n\t\tconst nodeIndex = json.nodes.push( nodeDef ) - 1;\n\t\tnodeMap.set( object, nodeIndex );\n\t\treturn nodeIndex;\n\n\t}\n\n\t/**\n\t * Process Scene\n\t * @param {Scene} scene Scene to process\n\t */\n\tasync processSceneAsync( scene ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( ! json.scenes ) {\n\n\t\t\tjson.scenes = [];\n\t\t\tjson.scene = 0;\n\n\t\t}\n\n\t\tconst sceneDef = {};\n\n\t\tif ( scene.name !== '' ) sceneDef.name = scene.name;\n\n\t\tjson.scenes.push( sceneDef );\n\n\t\tconst nodes = [];\n\n\t\tfor ( let i = 0, l = scene.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = scene.children[ i ];\n\n\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\tconst nodeIndex = await this.processNodeAsync( child );\n\n\t\t\t\tif ( nodeIndex !== null ) nodes.push( nodeIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( nodes.length > 0 ) sceneDef.nodes = nodes;\n\n\t\tthis.serializeUserData( scene, sceneDef );\n\n\t}\n\n\t/**\n\t * Creates a Scene to hold a list of objects and parse it\n\t * @param {Array} objects List of objects to process\n\t */\n\tasync processObjectsAsync( objects ) {\n\n\t\tconst scene = new Scene();\n\t\tscene.name = 'AuxScene';\n\n\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\t// We push directly to children instead of calling `add` to prevent\n\t\t\t// modify the .parent and break its original scene and hierarchy\n\t\t\tscene.children.push( objects[ i ] );\n\n\t\t}\n\n\t\tawait this.processSceneAsync( scene );\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D|Array} input\n\t */\n\tasync processInputAsync( input ) {\n\n\t\tconst options = this.options;\n\n\t\tinput = input instanceof Array ? input : [ input ];\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.beforeParse && ext.beforeParse( input );\n\n\t\t} );\n\n\t\tconst objectsWithoutScene = [];\n\n\t\tfor ( let i = 0; i < input.length; i ++ ) {\n\n\t\t\tif ( input[ i ] instanceof Scene ) {\n\n\t\t\t\tawait this.processSceneAsync( input[ i ] );\n\n\t\t\t} else {\n\n\t\t\t\tobjectsWithoutScene.push( input[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( objectsWithoutScene.length > 0 ) {\n\n\t\t\tawait this.processObjectsAsync( objectsWithoutScene );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.skins.length; ++ i ) {\n\n\t\t\tthis.processSkin( this.skins[ i ] );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < options.animations.length; ++ i ) {\n\n\t\t\tthis.processAnimation( options.animations[ i ], input[ 0 ] );\n\n\t\t}\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.afterParse && ext.afterParse( input );\n\n\t\t} );\n\n\t}\n\n\tasync _invokeAllAsync( func ) {\n\n\t\tfor ( let i = 0, il = this.plugins.length; i < il; i ++ ) {\n\n\t\t\tawait func( this.plugins[ i ] );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_lights_punctual';\n\n\t}\n\n\twriteNode( light, nodeDef ) {\n\n\t\tif ( ! light.isLight ) return;\n\n\t\tif ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst writer = this.writer;\n\t\tconst json = writer.json;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst lightDef = {};\n\n\t\tif ( light.name ) lightDef.name = light.name;\n\n\t\tlightDef.color = light.color.toArray();\n\n\t\tlightDef.intensity = light.intensity;\n\n\t\tif ( light.isDirectionalLight ) {\n\n\t\t\tlightDef.type = 'directional';\n\n\t\t} else if ( light.isPointLight ) {\n\n\t\t\tlightDef.type = 'point';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t} else if ( light.isSpotLight ) {\n\n\t\t\tlightDef.type = 'spot';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t\tlightDef.spot = {};\n\t\t\tlightDef.spot.innerConeAngle = ( 1.0 - light.penumbra ) * light.angle;\n\t\t\tlightDef.spot.outerConeAngle = light.angle;\n\n\t\t}\n\n\t\tif ( light.decay !== undefined && light.decay !== 2 ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, '\n\t\t\t\t+ 'and expects light.decay=2.' );\n\n\t\t}\n\n\t\tif ( light.target\n\t\t\t\t&& ( light.target.parent !== light\n\t\t\t\t|| light.target.position.x !== 0\n\t\t\t\t|| light.target.position.y !== 0\n\t\t\t\t|| light.target.position.z !== - 1 ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, '\n\t\t\t\t+ 'make light.target a child of the light with position 0,0,-1.' );\n\n\t\t}\n\n\t\tif ( ! extensionsUsed[ this.name ] ) {\n\n\t\t\tjson.extensions = json.extensions || {};\n\t\t\tjson.extensions[ this.name ] = { lights: [] };\n\t\t\textensionsUsed[ this.name ] = true;\n\n\t\t}\n\n\t\tconst lights = json.extensions[ this.name ].lights;\n\t\tlights.push( lightDef );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { light: lights.length - 1 };\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_unlit';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshBasicMaterial ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = {};\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.0;\n\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.9;\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_clearcoat';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.clearcoat === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.clearcoatFactor = material.clearcoat;\n\n\t\tif ( material.clearcoatMap ) {\n\n\t\t\tconst clearcoatMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.clearcoatMap ),\n\t\t\t\ttexCoord: material.clearcoatMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatMapDef, material.clearcoatMap );\n\t\t\textensionDef.clearcoatTexture = clearcoatMapDef;\n\n\t\t}\n\n\t\textensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness;\n\n\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\tconst clearcoatRoughnessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.clearcoatRoughnessMap ),\n\t\t\t\ttexCoord: material.clearcoatRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatRoughnessMapDef, material.clearcoatRoughnessMap );\n\t\t\textensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\tconst clearcoatNormalMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.clearcoatNormalMap ),\n\t\t\t\ttexCoord: material.clearcoatNormalMap.channel\n\t\t\t};\n\n\t\t\tif ( material.clearcoatNormalScale.x !== 1 ) clearcoatNormalMapDef.scale = material.clearcoatNormalScale.x;\n\n\t\t\twriter.applyTextureTransform( clearcoatNormalMapDef, material.clearcoatNormalMap );\n\t\t\textensionDef.clearcoatNormalTexture = clearcoatNormalMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_dispersion';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.dispersion === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.dispersion = material.dispersion;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_iridescence';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.iridescence === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.iridescenceFactor = material.iridescence;\n\n\t\tif ( material.iridescenceMap ) {\n\n\t\t\tconst iridescenceMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.iridescenceMap ),\n\t\t\t\ttexCoord: material.iridescenceMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceMapDef, material.iridescenceMap );\n\t\t\textensionDef.iridescenceTexture = iridescenceMapDef;\n\n\t\t}\n\n\t\textensionDef.iridescenceIor = material.iridescenceIOR;\n\t\textensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[ 0 ];\n\t\textensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[ 1 ];\n\n\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\tconst iridescenceThicknessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.iridescenceThicknessMap ),\n\t\t\t\ttexCoord: material.iridescenceThicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceThicknessMapDef, material.iridescenceThicknessMap );\n\t\t\textensionDef.iridescenceThicknessTexture = iridescenceThicknessMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_transmission';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.transmissionFactor = material.transmission;\n\n\t\tif ( material.transmissionMap ) {\n\n\t\t\tconst transmissionMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.transmissionMap ),\n\t\t\t\ttexCoord: material.transmissionMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( transmissionMapDef, material.transmissionMap );\n\t\t\textensionDef.transmissionTexture = transmissionMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_volume';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.thicknessFactor = material.thickness;\n\n\t\tif ( material.thicknessMap ) {\n\n\t\t\tconst thicknessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.thicknessMap ),\n\t\t\t\ttexCoord: material.thicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( thicknessMapDef, material.thicknessMap );\n\t\t\textensionDef.thicknessTexture = thicknessMapDef;\n\n\t\t}\n\n\t\tif ( material.attenuationDistance !== Infinity ) {\n\n\t\t\textensionDef.attenuationDistance = material.attenuationDistance;\n\n\t\t}\n\n\t\textensionDef.attenuationColor = material.attenuationColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_ior';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.ior === 1.5 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.ior = material.ior;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_specular';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || ( material.specularIntensity === 1.0 &&\n\t\t material.specularColor.equals( DEFAULT_SPECULAR_COLOR ) &&\n\t\t ! material.specularIntensityMap && ! material.specularColorMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tconst specularIntensityMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.specularIntensityMap ),\n\t\t\t\ttexCoord: material.specularIntensityMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularIntensityMapDef, material.specularIntensityMap );\n\t\t\textensionDef.specularTexture = specularIntensityMapDef;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tconst specularColorMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.specularColorMap ),\n\t\t\t\ttexCoord: material.specularColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularColorMapDef, material.specularColorMap );\n\t\t\textensionDef.specularColorTexture = specularColorMapDef;\n\n\t\t}\n\n\t\textensionDef.specularFactor = material.specularIntensity;\n\t\textensionDef.specularColorFactor = material.specularColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_sheen';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.sheen == 0.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\tconst sheenRoughnessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.sheenRoughnessMap ),\n\t\t\t\ttexCoord: material.sheenRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenRoughnessMapDef, material.sheenRoughnessMap );\n\t\t\textensionDef.sheenRoughnessTexture = sheenRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( material.sheenColorMap ) {\n\n\t\t\tconst sheenColorMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.sheenColorMap ),\n\t\t\t\ttexCoord: material.sheenColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenColorMapDef, material.sheenColorMap );\n\t\t\textensionDef.sheenColorTexture = sheenColorMapDef;\n\n\t\t}\n\n\t\textensionDef.sheenRoughnessFactor = material.sheenRoughness;\n\t\textensionDef.sheenColorFactor = material.sheenColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Anisotropy Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_anisotropy';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.anisotropy == 0.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.anisotropyMap ) {\n\n\t\t\tconst anisotropyMapDef = { index: await writer.processTextureAsync( material.anisotropyMap ) };\n\t\t\twriter.applyTextureTransform( anisotropyMapDef, material.anisotropyMap );\n\t\t\textensionDef.anisotropyTexture = anisotropyMapDef;\n\n\t\t}\n\n\t\textensionDef.anisotropyStrength = material.anisotropy;\n\t\textensionDef.anisotropyRotation = material.anisotropyRotation;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_emissive_strength';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || material.emissiveIntensity === 1.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.emissiveStrength = material.emissiveIntensity;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_materials_bump';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || (\n\t\t material.bumpScale === 1 &&\n\t\t ! material.bumpMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tconst bumpMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.bumpMap ),\n\t\t\t\ttexCoord: material.bumpMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( bumpMapDef, material.bumpMap );\n\t\t\textensionDef.bumpTexture = bumpMapDef;\n\n\t\t}\n\n\t\textensionDef.bumpFactor = material.bumpScale;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_mesh_gpu_instancing';\n\n\t}\n\n\twriteNode( object, nodeDef ) {\n\n\t\tif ( ! object.isInstancedMesh ) return;\n\n\t\tconst writer = this.writer;\n\n\t\tconst mesh = object;\n\n\t\tconst translationAttr = new Float32Array( mesh.count * 3 );\n\t\tconst rotationAttr = new Float32Array( mesh.count * 4 );\n\t\tconst scaleAttr = new Float32Array( mesh.count * 3 );\n\n\t\tconst matrix = new Matrix4();\n\t\tconst position = new Vector3();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3();\n\n\t\tfor ( let i = 0; i < mesh.count; i ++ ) {\n\n\t\t\tmesh.getMatrixAt( i, matrix );\n\t\t\tmatrix.decompose( position, quaternion, scale );\n\n\t\t\tposition.toArray( translationAttr, i * 3 );\n\t\t\tquaternion.toArray( rotationAttr, i * 4 );\n\t\t\tscale.toArray( scaleAttr, i * 3 );\n\n\t\t}\n\n\t\tconst attributes = {\n\t\t\tTRANSLATION: writer.processAccessor( new BufferAttribute( translationAttr, 3 ) ),\n\t\t\tROTATION: writer.processAccessor( new BufferAttribute( rotationAttr, 4 ) ),\n\t\t\tSCALE: writer.processAccessor( new BufferAttribute( scaleAttr, 3 ) ),\n\t\t};\n\n\t\tif ( mesh.instanceColor )\n\t\t\tattributes._COLOR_0 = writer.processAccessor( mesh.instanceColor );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { attributes };\n\n\t\twriter.extensionsUsed[ this.name ] = true;\n\t\twriter.extensionsRequired[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Static utility functions\n */\nGLTFExporter.Utils = {\n\n\tinsertKeyframe: function ( track, time ) {\n\n\t\tconst tolerance = 0.001; // 1ms\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = new track.TimeBufferType( track.times.length + 1 );\n\t\tconst values = new track.ValueBufferType( track.values.length + valueSize );\n\t\tconst interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) );\n\n\t\tlet index;\n\n\t\tif ( track.times.length === 0 ) {\n\n\t\t\ttimes[ 0 ] = time;\n\n\t\t\tfor ( let i = 0; i < valueSize; i ++ ) {\n\n\t\t\t\tvalues[ i ] = 0;\n\n\t\t\t}\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time < track.times[ 0 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0;\n\n\t\t\ttimes[ 0 ] = time;\n\t\t\ttimes.set( track.times, 1 );\n\n\t\t\tvalues.set( interpolant.evaluate( time ), 0 );\n\t\t\tvalues.set( track.values, valueSize );\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time > track.times[ track.times.length - 1 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) {\n\n\t\t\t\treturn track.times.length - 1;\n\n\t\t\t}\n\n\t\t\ttimes[ times.length - 1 ] = time;\n\t\t\ttimes.set( track.times, 0 );\n\n\t\t\tvalues.set( track.values, 0 );\n\t\t\tvalues.set( interpolant.evaluate( time ), track.values.length );\n\n\t\t\tindex = times.length - 1;\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < track.times.length; i ++ ) {\n\n\t\t\t\tif ( Math.abs( track.times[ i ] - time ) < tolerance ) return i;\n\n\t\t\t\tif ( track.times[ i ] < time && track.times[ i + 1 ] > time ) {\n\n\t\t\t\t\ttimes.set( track.times.slice( 0, i + 1 ), 0 );\n\t\t\t\t\ttimes[ i + 1 ] = time;\n\t\t\t\t\ttimes.set( track.times.slice( i + 1 ), i + 2 );\n\n\t\t\t\t\tvalues.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 );\n\t\t\t\t\tvalues.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize );\n\t\t\t\t\tvalues.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize );\n\n\t\t\t\t\tindex = i + 1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttrack.times = times;\n\t\ttrack.values = values;\n\n\t\treturn index;\n\n\t},\n\n\tmergeMorphTargetTracks: function ( clip, root ) {\n\n\t\tconst tracks = [];\n\t\tconst mergedTracks = {};\n\t\tconst sourceTracks = clip.tracks;\n\n\t\tfor ( let i = 0; i < sourceTracks.length; ++ i ) {\n\n\t\t\tlet sourceTrack = sourceTracks[ i ];\n\t\t\tconst sourceTrackBinding = PropertyBinding.parseTrackName( sourceTrack.name );\n\t\t\tconst sourceTrackNode = PropertyBinding.findNode( root, sourceTrackBinding.nodeName );\n\n\t\t\tif ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) {\n\n\t\t\t\t// Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is.\n\t\t\t\ttracks.push( sourceTrack );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete\n\t\t\t\t&& sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) {\n\n\t\t\t\tif ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\t\t// This should never happen, because glTF morph target animations\n\t\t\t\t\t// affect all targets already.\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' );\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' );\n\n\t\t\t\tsourceTrack = sourceTrack.clone();\n\t\t\t\tsourceTrack.setInterpolation( InterpolateLinear );\n\n\t\t\t}\n\n\t\t\tconst targetCount = sourceTrackNode.morphTargetInfluences.length;\n\t\t\tconst targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ];\n\n\t\t\tif ( targetIndex === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex );\n\n\t\t\t}\n\n\t\t\tlet mergedTrack;\n\n\t\t\t// If this is the first time we've seen this object, create a new\n\t\t\t// track to store merged keyframe data for each morph target.\n\t\t\tif ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) {\n\n\t\t\t\tmergedTrack = sourceTrack.clone();\n\n\t\t\t\tconst values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length );\n\n\t\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\t\tvalues[ j * targetCount + targetIndex ] = mergedTrack.values[ j ];\n\n\t\t\t\t}\n\n\t\t\t\t// We need to take into consideration the intended target node\n\t\t\t\t// of our original un-merged morphTarget animation.\n\t\t\t\tmergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences';\n\t\t\t\tmergedTrack.values = values;\n\n\t\t\t\tmergedTracks[ sourceTrackNode.uuid ] = mergedTrack;\n\t\t\t\ttracks.push( mergedTrack );\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) );\n\n\t\t\tmergedTrack = mergedTracks[ sourceTrackNode.uuid ];\n\n\t\t\t// For every existing keyframe of the merged track, write a (possibly\n\t\t\t// interpolated) value from the source track.\n\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\tmergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] );\n\n\t\t\t}\n\n\t\t\t// For every existing keyframe of the source track, write a (possibly\n\t\t\t// new) keyframe to the merged track. Values from the previous loop may\n\t\t\t// be written again, but keyframes are de-duplicated.\n\t\t\tfor ( let j = 0; j < sourceTrack.times.length; j ++ ) {\n\n\t\t\t\tconst keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] );\n\t\t\t\tmergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\treturn clip;\n\n\t},\n\n\ttoFloat32BufferAttribute: function ( srcAttribute ) {\n\n\t\tconst dstAttribute = new BufferAttribute( new Float32Array( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );\n\n\t\tif ( ! srcAttribute.normalized && ! srcAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\tdstAttribute.array.set( srcAttribute.array );\n\n\t\t\treturn dstAttribute;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = srcAttribute.count; i < il; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < srcAttribute.itemSize; j ++ ) {\n\n\t\t\t\tdstAttribute.setComponent( i, j, srcAttribute.getComponent( i, j ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn dstAttribute;\n\n\t}\n\n};\n\nexport { GLTFExporter };\n","/* @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @param object {THREE.Object3D}\n * @return {boolean}\n */\nconst compatibleObject = (object) => {\n // @TODO: Need properer variantMaterials format validation?\n return object.material !==\n undefined && // easier than (!object.isMesh && !object.isLine &&\n // !object.isPoints)\n object.userData && // just in case\n object.userData.variantMaterials &&\n // Is this line costly?\n !!Array\n .from(object.userData.variantMaterials\n .values())\n .filter(m => compatibleMaterial(m.material));\n};\n/**\n * @param material {THREE.Material}\n * @return {boolean}\n */\nconst compatibleMaterial = (material) => {\n // @TODO: support multi materials?\n return material && material.isMaterial && !Array.isArray(material);\n};\nexport default class GLTFExporterMaterialsVariantsExtension {\n constructor(writer) {\n this.writer = writer;\n this.name = 'KHR_materials_variants';\n this.variantNames = [];\n }\n beforeParse(objects) {\n // Find all variant names and store them to the table\n const variantNameSet = new Set();\n const addVariantNames = (o) => {\n if (!compatibleObject(o)) {\n return;\n }\n const variantMaterials = o.userData.variantMaterials;\n const variantDataMap = o.userData.variantData;\n for (const [variantName, variantData] of variantDataMap) {\n const variantMaterial = variantMaterials.get(variantData.index);\n // Ignore unloaded variant materials\n if (variantMaterial && compatibleMaterial(variantMaterial.material)) {\n variantNameSet.add(variantName);\n }\n }\n };\n if (Array.isArray(objects)) {\n for (const object of objects) {\n object.traverse(addVariantNames);\n }\n }\n else {\n objects.traverse(addVariantNames);\n }\n // We may want to sort?\n variantNameSet.forEach(name => this.variantNames.push(name));\n }\n async writeMesh(mesh, meshDef) {\n if (!compatibleObject(mesh)) {\n return;\n }\n const userData = mesh.userData;\n const variantMaterials = userData.variantMaterials;\n const variantDataMap = userData.variantData;\n const mappingTable = new Map();\n // Removes gaps in the variant indices list (caused by deleting variants).\n const reIndexedVariants = new Map();\n const variants = Array.from(variantDataMap.values()).sort((a, b) => {\n return a.index - b.index;\n });\n for (const [i, variantData] of variants.entries()) {\n reIndexedVariants.set(variantData.index, i);\n }\n for (const variantData of variantDataMap.values()) {\n const variantInstance = variantMaterials.get(variantData.index);\n if (!variantInstance || !compatibleMaterial(variantInstance.material)) {\n continue;\n }\n const materialIndex = await this.writer.processMaterialAsync(variantInstance.material);\n if (!mappingTable.has(materialIndex)) {\n mappingTable.set(materialIndex, { material: materialIndex, variants: [] });\n }\n mappingTable.get(materialIndex).variants.push(reIndexedVariants.get(variantData.index));\n }\n const mappingsDef = Array.from(mappingTable.values())\n .map((m => { return m.variants.sort((a, b) => a - b) && m; }))\n .sort((a, b) => a.material - b.material);\n if (mappingsDef.length === 0) {\n return;\n }\n const originalMaterialIndex = compatibleMaterial(userData.originalMaterial) ?\n await this.writer.processMaterialAsync(userData.originalMaterial) :\n -1;\n for (const primitiveDef of meshDef.primitives) {\n // Override primitiveDef.material with original material.\n if (originalMaterialIndex >= 0) {\n primitiveDef.material = originalMaterialIndex;\n }\n primitiveDef.extensions = primitiveDef.extensions || {};\n primitiveDef.extensions[this.name] = { mappings: mappingsDef };\n }\n }\n afterParse() {\n if (this.variantNames.length === 0) {\n return;\n }\n const root = this.writer.json;\n root.extensions = root.extensions || {};\n const variantsDef = this.variantNames.map(n => {\n return { name: n };\n });\n root.extensions[this.name] = { variants: variantsDef };\n this.writer.extensionsUsed[this.name] = true;\n }\n}\n//# sourceMappingURL=VariantMaterialExporterPlugin.js.map","import {\n\tDirectionalLight,\n\tGroup,\n\tLightProbe,\n\tWebGLCubeRenderTarget\n} from 'three';\n\nclass SessionLightProbe {\n\n\tconstructor( xrLight, renderer, lightProbe, environmentEstimation, estimationStartCallback ) {\n\n\t\tthis.xrLight = xrLight;\n\t\tthis.renderer = renderer;\n\t\tthis.lightProbe = lightProbe;\n\t\tthis.xrWebGLBinding = null;\n\t\tthis.estimationStartCallback = estimationStartCallback;\n\t\tthis.frameCallback = this.onXRFrame.bind( this );\n\n\t\tconst session = renderer.xr.getSession();\n\n\t\t// If the XRWebGLBinding class is available then we can also query an\n\t\t// estimated reflection cube map.\n\t\tif ( environmentEstimation && 'XRWebGLBinding' in window ) {\n\n\t\t\t// This is the simplest way I know of to initialize a WebGL cubemap in Three.\n\t\t\tconst cubeRenderTarget = new WebGLCubeRenderTarget( 16 );\n\t\t\txrLight.environment = cubeRenderTarget.texture;\n\n\t\t\tconst gl = renderer.getContext();\n\n\t\t\t// Ensure that we have any extensions needed to use the preferred cube map format.\n\t\t\tswitch ( session.preferredReflectionFormat ) {\n\n\t\t\t\tcase 'srgba8':\n\t\t\t\t\tgl.getExtension( 'EXT_sRGB' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rgba16f':\n\t\t\t\t\tgl.getExtension( 'OES_texture_half_float' );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.xrWebGLBinding = new XRWebGLBinding( session, gl );\n\n\t\t\tthis.lightProbe.addEventListener( 'reflectionchange', () => {\n\n\t\t\t\tthis.updateReflection();\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// Start monitoring the XR animation frame loop to look for lighting\n\t\t// estimation changes.\n\t\tsession.requestAnimationFrame( this.frameCallback );\n\n\t}\n\n\tupdateReflection() {\n\n\t\tconst textureProperties = this.renderer.properties.get( this.xrLight.environment );\n\n\t\tif ( textureProperties ) {\n\n\t\t\tconst cubeMap = this.xrWebGLBinding.getReflectionCubeMap( this.lightProbe );\n\n\t\t\tif ( cubeMap ) {\n\n\t\t\t\ttextureProperties.__webglTexture = cubeMap;\n\n\t\t\t\tthis.xrLight.environment.needsPMREMUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tonXRFrame( time, xrFrame ) {\n\n\t\t// If either this object or the XREstimatedLight has been destroyed, stop\n\t\t// running the frame loop.\n\t\tif ( ! this.xrLight ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst session = xrFrame.session;\n\t\tsession.requestAnimationFrame( this.frameCallback );\n\n\t\tconst lightEstimate = xrFrame.getLightEstimate( this.lightProbe );\n\t\tif ( lightEstimate ) {\n\n\t\t\t// We can copy the estimate's spherical harmonics array directly into the light probe.\n\t\t\tthis.xrLight.lightProbe.sh.fromArray( lightEstimate.sphericalHarmonicsCoefficients );\n\t\t\tthis.xrLight.lightProbe.intensity = 1.0;\n\n\t\t\t// For the directional light we have to normalize the color and set the scalar as the\n\t\t\t// intensity, since WebXR can return color values that exceed 1.0.\n\t\t\tconst intensityScalar = Math.max( 1.0,\n\t\t\t\tMath.max( lightEstimate.primaryLightIntensity.x,\n\t\t\t\t\tMath.max( lightEstimate.primaryLightIntensity.y,\n\t\t\t\t\t\tlightEstimate.primaryLightIntensity.z ) ) );\n\n\t\t\tthis.xrLight.directionalLight.color.setRGB(\n\t\t\t\tlightEstimate.primaryLightIntensity.x / intensityScalar,\n\t\t\t\tlightEstimate.primaryLightIntensity.y / intensityScalar,\n\t\t\t\tlightEstimate.primaryLightIntensity.z / intensityScalar );\n\t\t\tthis.xrLight.directionalLight.intensity = intensityScalar;\n\t\t\tthis.xrLight.directionalLight.position.copy( lightEstimate.primaryLightDirection );\n\n\t\t\tif ( this.estimationStartCallback ) {\n\n\t\t\t\tthis.estimationStartCallback();\n\t\t\t\tthis.estimationStartCallback = null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.xrLight = null;\n\t\tthis.renderer = null;\n\t\tthis.lightProbe = null;\n\t\tthis.xrWebGLBinding = null;\n\n\t}\n\n}\n\nexport class XREstimatedLight extends Group {\n\n\tconstructor( renderer, environmentEstimation = true ) {\n\n\t\tsuper();\n\n\t\tthis.lightProbe = new LightProbe();\n\t\tthis.lightProbe.intensity = 0;\n\t\tthis.add( this.lightProbe );\n\n\t\tthis.directionalLight = new DirectionalLight();\n\t\tthis.directionalLight.intensity = 0;\n\t\tthis.add( this.directionalLight );\n\n\t\t// Will be set to a cube map in the SessionLightProbe if environment estimation is\n\t\t// available and requested.\n\t\tthis.environment = null;\n\n\t\tlet sessionLightProbe = null;\n\t\tlet estimationStarted = false;\n\t\trenderer.xr.addEventListener( 'sessionstart', () => {\n\n\t\t\tconst session = renderer.xr.getSession();\n\n\t\t\tif ( 'requestLightProbe' in session ) {\n\n\t\t\t\tsession.requestLightProbe( {\n\n\t\t\t\t\treflectionFormat: session.preferredReflectionFormat\n\n\t\t\t\t} ).then( ( probe ) => {\n\n\t\t\t\t\tsessionLightProbe = new SessionLightProbe( this, renderer, probe, environmentEstimation, () => {\n\n\t\t\t\t\t\testimationStarted = true;\n\n\t\t\t\t\t\t// Fired to indicate that the estimated lighting values are now being updated.\n\t\t\t\t\t\tthis.dispatchEvent( { type: 'estimationstart' } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderer.xr.addEventListener( 'sessionend', () => {\n\n\t\t\tif ( sessionLightProbe ) {\n\n\t\t\t\tsessionLightProbe.dispose();\n\t\t\t\tsessionLightProbe = null;\n\n\t\t\t}\n\n\t\t\tif ( estimationStarted ) {\n\n\t\t\t\t// Fired to indicate that the estimated lighting values are no longer being updated.\n\t\t\t\tthis.dispatchEvent( { type: 'estimationend' } );\n\n\t\t\t}\n\n\t\t} );\n\n\t\t// Done inline to provide access to sessionLightProbe.\n\t\tthis.dispose = () => {\n\n\t\t\tif ( sessionLightProbe ) {\n\n\t\t\t\tsessionLightProbe.dispose();\n\t\t\t\tsessionLightProbe = null;\n\n\t\t\t}\n\n\t\t\tthis.remove( this.lightProbe );\n\t\t\tthis.lightProbe = null;\n\n\t\t\tthis.remove( this.directionalLight );\n\t\t\tthis.directionalLight = null;\n\n\t\t\tthis.environment = null;\n\n\t\t};\n\n\t}\n\n}\n","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const SETTLING_TIME = 10000; // plenty long enough\nconst MIN_DECAY_MILLISECONDS = 0.001;\nexport const DECAY_MILLISECONDS = 50;\n/**\n * The Damper class is a generic second-order critically damped system that does\n * one linear step of the desired length of time. The only parameter is\n * DECAY_MILLISECONDS. This common parameter makes all states converge at the\n * same rate regardless of scale. xNormalization is a number to provide the\n * rough scale of x, such that NIL_SPEED clamping also happens at roughly the\n * same convergence for all states.\n */\nexport class Damper {\n constructor(decayMilliseconds = DECAY_MILLISECONDS) {\n this.velocity = 0;\n this.naturalFrequency = 0;\n this.setDecayTime(decayMilliseconds);\n }\n setDecayTime(decayMilliseconds) {\n this.naturalFrequency =\n 1 / Math.max(MIN_DECAY_MILLISECONDS, decayMilliseconds);\n }\n update(x, xGoal, timeStepMilliseconds, xNormalization) {\n const nilSpeed = 0.0002 * this.naturalFrequency;\n if (x == null || xNormalization === 0) {\n return xGoal;\n }\n if (x === xGoal && this.velocity === 0) {\n return xGoal;\n }\n if (timeStepMilliseconds < 0) {\n return x;\n }\n // Exact solution to a critically damped second-order system, where:\n // acceleration = this.naturalFrequency * this.naturalFrequency * (xGoal\n // - x) - 2 * this.naturalFrequency * this.velocity;\n const deltaX = (x - xGoal);\n const intermediateVelocity = this.velocity + this.naturalFrequency * deltaX;\n const intermediateX = deltaX + timeStepMilliseconds * intermediateVelocity;\n const decay = Math.exp(-this.naturalFrequency * timeStepMilliseconds);\n const newVelocity = (intermediateVelocity - this.naturalFrequency * intermediateX) * decay;\n const acceleration = -this.naturalFrequency * (newVelocity + intermediateVelocity * decay);\n if (Math.abs(newVelocity) < nilSpeed * Math.abs(xNormalization) &&\n acceleration * deltaX >= 0) {\n // This ensures the controls settle and stop calling this function instead\n // of asymptotically approaching their goal.\n this.velocity = 0;\n return xGoal;\n }\n else {\n this.velocity = newVelocity;\n return xGoal + intermediateX * decay;\n }\n }\n}\n//# sourceMappingURL=Damper.js.map","/* @license\n* Copyright 2020 Google LLC. All Rights Reserved.\n* Licensed under the Apache License, Version 2.0 (the 'License');\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an 'AS IS' BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\nimport { BoxGeometry, BufferGeometry, DoubleSide, Float32BufferAttribute, Mesh, MeshBasicMaterial, PlaneGeometry, Vector2, Vector3, Color, AdditiveBlending, NormalBlending } from 'three';\nimport { Damper } from './Damper.js';\n// Enhanced configuration for dynamic sizing and visual design\nconst CONFIG = {\n // Dynamic sizing - slightly bigger\n MIN_TOUCH_AREA: 0.05, // minimum touch area\n BASE_RADIUS: 0.15, // base radius\n LINE_WIDTH: 0.02, // line width\n SEGMENTS: 16, // segments for smoother curves\n DELTA_PHI: Math.PI / (2 * 16),\n // Enhanced visual design with more vibrant colors\n COLORS: {\n EDGE_FALLOFF: new Color(0.98, 0.98, 0.98), // Brighter light gray\n EDGE_CUTOFF: new Color(0.8, 0.8, 0.8), // Brighter medium gray\n FILL_FALLOFF: new Color(0.4, 0.4, 0.4), // Brighter dark gray\n FILL_CUTOFF: new Color(0.4, 0.4, 0.4), // Brighter dark gray\n ACTIVE_EDGE: new Color(1.0, 1.0, 1.0), // Pure white when active\n ACTIVE_FILL: new Color(0.6, 0.6, 0.6), // Brighter fill when active\n },\n // Opacity settings - now configurable\n MAX_OPACITY: 0.75,\n ACTIVE_OPACITY: 0.9,\n FILL_OPACITY_MULTIPLIER: 0.5, // Fill opacity relative to edge opacity\n INTERACTIVE_OPACITY_MULTIPLIER: 1.2, // Edge opacity multiplier when interactive\n // Distance-based scaling (similar to Footprint)\n MIN_DISTANCE: 0.5,\n MAX_DISTANCE: 10.0,\n BASE_SCALE: 1.0,\n DISTANCE_SCALE_FACTOR: 0.3,\n // Animation timing - optimized for performance\n FADE_IN_DURATION: 0.12,\n FADE_OUT_DURATION: 0.12,\n SIZE_UPDATE_DURATION: 0.05,\n COLOR_LERP_FACTOR: 0.15, // Color transition speed\n // Screen space scaling - now configurable\n SCREEN_SPACE_SCALE: 1.2, // Scale factor for screen space mode\n // Performance optimization thresholds\n SIZE_UPDATE_THRESHOLD: 0.001, // Minimum size change to trigger geometry update\n GEOMETRY_UPDATE_DEBOUNCE: 100, // ms to debounce geometry updates\n};\nconst vector2 = new Vector2();\n/**\n* Adds a quarter-annulus of vertices to the array, centered on cornerX,\n* cornerY.\n*/\nconst addCorner = (vertices, cornerX, cornerY, radius, lineWidth) => {\n let phi = cornerX > 0 ? (cornerY > 0 ? 0 : -Math.PI / 2) :\n (cornerY > 0 ? Math.PI / 2 : Math.PI);\n for (let i = 0; i <= CONFIG.SEGMENTS; ++i) {\n vertices.push(cornerX + (radius - lineWidth) * Math.cos(phi), cornerY + (radius - lineWidth) * Math.sin(phi), 0, cornerX + radius * Math.cos(phi), cornerY + radius * Math.sin(phi), 0);\n phi += CONFIG.DELTA_PHI;\n }\n};\n/**\n* Enhanced PlacementBox that dynamically updates based on model size changes\n* and features improved visual design inspired by Footprint.\n*/\nexport class PlacementBox extends Mesh {\n constructor(scene, side) {\n const geometry = new BufferGeometry();\n super(geometry);\n this.shadowHeight = 0;\n // Visual state\n this.isActive = false;\n this.isHovered = false;\n // Performance optimization\n this.lastGeometryUpdateTime = 0;\n this.needsGeometryUpdate = false;\n this.scene = scene;\n this.side = side;\n this.currentSize = new Vector3();\n this.goalSize = new Vector3();\n this.sizeDamper = new Damper();\n // Initialize with current scene size\n this.updateSizeFromScene();\n // Create enhanced materials with better visual properties\n this.edgeMaterial = new MeshBasicMaterial({\n color: CONFIG.COLORS.EDGE_FALLOFF,\n transparent: true,\n opacity: 0,\n side: DoubleSide,\n depthWrite: false, // Better transparency handling\n blending: AdditiveBlending // Subtle glow effect\n });\n this.fillMaterial = new MeshBasicMaterial({\n color: CONFIG.COLORS.FILL_FALLOFF,\n transparent: true,\n opacity: 0,\n side: DoubleSide,\n depthWrite: false, // Better transparency handling\n blending: NormalBlending\n });\n this.material = this.edgeMaterial;\n this.goalOpacity = 0;\n this.opacityDamper = new Damper();\n // Create hit testing meshes\n this.createHitMeshes();\n // Position based on scene\n this.updatePositionFromScene();\n // Add to scene\n scene.target.add(this);\n scene.target.add(this.hitBox);\n this.offsetHeight = 0;\n }\n updateSizeFromScene() {\n const { size } = this.scene;\n this.goalSize.copy(size);\n // Apply proportional minimum size constraints\n // For small models, use a smaller minimum size\n const modelDiagonal = Math.sqrt(size.x * size.x + size.z * size.z);\n const proportionalMinSize = Math.max(CONFIG.MIN_TOUCH_AREA, modelDiagonal * 0.4); // Increased from 0.3 to 0.4\n // Only apply minimum size if the model is very small\n if (this.goalSize.x < proportionalMinSize) {\n this.goalSize.x = proportionalMinSize;\n }\n if (this.goalSize.z < proportionalMinSize) {\n this.goalSize.z = proportionalMinSize;\n }\n // Update geometry with new size\n this.updateGeometry();\n }\n updateGeometry() {\n const geometry = this.geometry;\n const triangles = [];\n const vertices = [];\n const x = this.goalSize.x / 2;\n const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2;\n // Use dynamic radius based on size - slightly bigger for better visibility\n const modelSize = Math.min(x, y);\n const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2); // Increased multipliers\n const lineWidth = Math.max(CONFIG.LINE_WIDTH * 0.7, modelSize * 0.025); // Increased line width\n addCorner(vertices, x, y, radius, lineWidth);\n addCorner(vertices, -x, y, radius, lineWidth);\n addCorner(vertices, -x, -y, radius, lineWidth);\n addCorner(vertices, x, -y, radius, lineWidth);\n const numVertices = vertices.length / 3;\n for (let i = 0; i < numVertices - 2; i += 2) {\n triangles.push(i, i + 1, i + 3, i, i + 3, i + 2);\n }\n const i = numVertices - 2;\n triangles.push(i, i + 1, 1, i, 1, 0);\n geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n geometry.setIndex(triangles);\n geometry.computeBoundingSphere();\n }\n createHitMeshes() {\n const x = this.goalSize.x / 2;\n const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2;\n const modelSize = Math.min(x, y);\n const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2);\n this.hitPlane = new Mesh(new PlaneGeometry(2 * (x + radius), 2 * (y + radius)));\n this.hitPlane.visible = false;\n this.hitPlane.material.side = DoubleSide;\n this.add(this.hitPlane);\n this.hitBox = new Mesh(new BoxGeometry(this.goalSize.x + 2 * radius, this.goalSize.y + radius, this.goalSize.z + 2 * radius));\n this.hitBox.visible = false;\n this.hitBox.material.side = DoubleSide;\n this.add(this.hitBox);\n }\n updatePositionFromScene() {\n const { boundingBox } = this.scene;\n boundingBox.getCenter(this.position);\n // Reset rotation to ensure proper orientation\n this.rotation.set(0, 0, 0);\n switch (this.side) {\n case 'bottom':\n // Ensure the placement box is horizontal for floor placement\n this.rotateX(-Math.PI / 2);\n this.shadowHeight = boundingBox.min.y;\n this.position.y = this.shadowHeight;\n break;\n case 'back':\n // For wall placement, keep it vertical but ensure proper orientation\n this.shadowHeight = boundingBox.min.z;\n this.position.z = this.shadowHeight;\n break;\n case 'top':\n // move placement box to the top of the model\n this.rotateX(-Math.PI / 2);\n this.shadowHeight = boundingBox.max.y;\n this.position.y = this.shadowHeight;\n break;\n }\n // Update hit box position with proper offset\n if (this.hitBox) {\n const offset = this.side === 'back' ?\n (this.goalSize.y + CONFIG.BASE_RADIUS) / 2 :\n (this.goalSize.y + CONFIG.BASE_RADIUS) / 2;\n this.hitBox.position.y = offset + boundingBox.min.y;\n }\n }\n /**\n * Update the placement box when model size changes\n * Optimized to batch updates and reduce performance impact\n */\n updateFromModelChanges() {\n this.updateSizeFromScene();\n this.updatePositionFromScene();\n // Force immediate geometry update for model changes\n this.updateGeometry();\n this.updateHitMeshes();\n this.ensureProperOrientation();\n // Reset performance tracking\n this.needsGeometryUpdate = false;\n this.lastGeometryUpdateTime = performance.now();\n }\n /**\n * Ensure the placement box is properly oriented for the current mode\n */\n ensureProperOrientation() {\n // Force proper orientation based on side\n if (this.side === 'bottom') {\n // For floor placement, ensure it's horizontal\n this.rotation.x = -Math.PI / 2;\n this.rotation.y = 0;\n this.rotation.z = 0;\n }\n else if (this.side === 'back') {\n // For wall placement, ensure it's vertical\n this.rotation.x = 0;\n this.rotation.y = 0;\n this.rotation.z = 0;\n }\n }\n /**\n * Set screen space mode to adjust positioning for mobile AR\n */\n setScreenSpaceMode(isScreenSpace) {\n if (isScreenSpace) {\n // In screen space mode, ensure the placement box is more visible\n // and properly positioned for touch interaction\n this.scale.set(CONFIG.SCREEN_SPACE_SCALE, CONFIG.SCREEN_SPACE_SCALE, CONFIG.SCREEN_SPACE_SCALE);\n }\n else {\n // Reset scale for world space mode\n this.scale.set(1.0, 1.0, 1.0);\n }\n }\n updateHitMeshes() {\n if (this.hitPlane && this.hitBox) {\n const x = this.goalSize.x / 2;\n const y = (this.side === 'back' ? this.goalSize.y : this.goalSize.z) / 2;\n const modelSize = Math.min(x, y);\n const radius = Math.max(CONFIG.BASE_RADIUS * 0.7, modelSize * 0.2);\n // Update hit plane geometry\n const hitPlaneGeometry = new PlaneGeometry(2 * (x + radius), 2 * (y + radius));\n this.hitPlane.geometry.dispose();\n this.hitPlane.geometry = hitPlaneGeometry;\n // Update hit box geometry\n const hitBoxGeometry = new BoxGeometry(this.goalSize.x + 2 * radius, this.goalSize.y + radius, this.goalSize.z + 2 * radius);\n this.hitBox.geometry.dispose();\n this.hitBox.geometry = hitBoxGeometry;\n }\n }\n /**\n * Set interaction state for visual feedback\n */\n setInteractionState(isActive, isHovered = false) {\n this.isActive = isActive;\n this.isHovered = isHovered;\n this.updateVisualState();\n }\n updateVisualState() {\n let targetColor;\n let targetFillColor;\n if (this.isActive) {\n targetColor = CONFIG.COLORS.ACTIVE_EDGE;\n targetFillColor = CONFIG.COLORS.ACTIVE_FILL;\n }\n else if (this.isHovered) {\n targetColor = CONFIG.COLORS.EDGE_FALLOFF;\n targetFillColor = CONFIG.COLORS.FILL_FALLOFF;\n }\n else {\n targetColor = CONFIG.COLORS.EDGE_CUTOFF;\n targetFillColor = CONFIG.COLORS.FILL_CUTOFF;\n }\n // Smoothly transition colors with configurable response speed\n this.edgeMaterial.color.lerp(targetColor, CONFIG.COLOR_LERP_FACTOR);\n this.fillMaterial.color.lerp(targetFillColor, CONFIG.COLOR_LERP_FACTOR);\n }\n /**\n * Apply distance-based scaling\n */\n applyDistanceScaling(cameraPosition) {\n const distanceToCamera = cameraPosition.distanceTo(this.position);\n const clampedDistance = Math.max(CONFIG.MIN_DISTANCE, Math.min(CONFIG.MAX_DISTANCE, distanceToCamera));\n const scaleFactor = CONFIG.BASE_SCALE +\n (clampedDistance - CONFIG.MIN_DISTANCE) * CONFIG.DISTANCE_SCALE_FACTOR;\n this.scale.set(scaleFactor, scaleFactor, scaleFactor);\n }\n /**\n * Get the world hit position if the touch coordinates hit the box, and null\n * otherwise. Pass the scene in to get access to its raycaster.\n */\n getHit(scene, screenX, screenY) {\n vector2.set(screenX, -screenY);\n this.hitPlane.visible = true;\n const hitResult = scene.positionAndNormalFromPoint(vector2, this.hitPlane);\n this.hitPlane.visible = false;\n return hitResult == null ? null : hitResult.position;\n }\n getExpandedHit(scene, screenX, screenY) {\n this.hitPlane.scale.set(1000, 1000, 1000);\n this.hitPlane.updateMatrixWorld();\n const hitResult = this.getHit(scene, screenX, screenY);\n this.hitPlane.scale.set(1, 1, 1);\n return hitResult;\n }\n controllerIntersection(scene, controller) {\n this.hitBox.visible = true;\n const hitResult = scene.hitFromController(controller, this.hitBox);\n this.hitBox.visible = false;\n return hitResult;\n }\n /**\n * Offset the height of the box relative to the bottom of the scene. Positive\n * is up, so generally only negative values are used.\n */\n set offsetHeight(offset) {\n offset -= 0.001; // push 1 mm below shadow to avoid z-fighting\n if (this.side === 'back') {\n this.position.z = this.shadowHeight + offset;\n }\n else {\n this.position.y = this.shadowHeight + offset;\n }\n }\n get offsetHeight() {\n if (this.side === 'back') {\n return this.position.z - this.shadowHeight;\n }\n else {\n return this.position.y - this.shadowHeight;\n }\n }\n /**\n * Set the box's visibility; it will fade in and out.\n */\n set show(visible) {\n this.goalOpacity = visible ? CONFIG.MAX_OPACITY : 0;\n }\n /**\n * Call on each frame with the frame delta to fade the box.\n */\n updateOpacity(delta) {\n const material = this.material;\n const newOpacity = this.opacityDamper.update(material.opacity, this.goalOpacity, delta, 1);\n // Update both edge and fill materials with configurable visibility\n this.edgeMaterial.opacity = newOpacity;\n this.fillMaterial.opacity = newOpacity * CONFIG.FILL_OPACITY_MULTIPLIER;\n // Add subtle glow effect when active or hovered\n if (this.isActive || this.isHovered) {\n this.edgeMaterial.opacity = newOpacity * CONFIG.INTERACTIVE_OPACITY_MULTIPLIER;\n }\n this.visible = newOpacity > 0;\n }\n /**\n * Update method to be called each frame for smooth transitions\n * Optimized to reduce frequent geometry updates for better performance\n */\n update(delta, cameraPosition) {\n // Update opacity\n this.updateOpacity(delta);\n // Update size transitions with performance optimization\n if (!this.currentSize.equals(this.goalSize)) {\n const newSize = new Vector3();\n newSize.x = this.sizeDamper.update(this.currentSize.x, this.goalSize.x, delta, 1);\n newSize.y = this.sizeDamper.update(this.currentSize.y, this.goalSize.y, delta, 1);\n newSize.z = this.sizeDamper.update(this.currentSize.z, this.goalSize.z, delta, 1);\n // Check if size change is significant enough to warrant geometry update\n const sizeChange = newSize.distanceTo(this.currentSize);\n if (sizeChange > CONFIG.SIZE_UPDATE_THRESHOLD) {\n this.currentSize.copy(newSize);\n this.needsGeometryUpdate = true;\n }\n }\n // Debounce geometry updates to prevent excessive updates\n const now = performance.now();\n if (this.needsGeometryUpdate &&\n (now - this.lastGeometryUpdateTime) > CONFIG.GEOMETRY_UPDATE_DEBOUNCE) {\n this.updateGeometry();\n this.updateHitMeshes();\n this.needsGeometryUpdate = false;\n this.lastGeometryUpdateTime = now;\n }\n // Apply distance scaling if camera position is provided\n if (cameraPosition) {\n this.applyDistanceScaling(cameraPosition);\n }\n // Update visual state\n this.updateVisualState();\n }\n /**\n * Get the current size of the placement box\n */\n getSize() {\n return this.goalSize.clone();\n }\n /**\n * Call this to clean up Three's cache when you remove the box.\n */\n dispose() {\n const { geometry, material } = this.hitPlane;\n geometry.dispose();\n material.dispose();\n this.hitBox.geometry.dispose();\n this.hitBox.material.dispose();\n this.geometry.dispose();\n this.edgeMaterial.dispose();\n this.fillMaterial.dispose();\n this.hitBox.removeFromParent();\n this.removeFromParent();\n }\n}\n//# sourceMappingURL=PlacementBox.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const numberNode = (value, unit) => ({ type: 'number', number: value, unit });\n/**\n * Given a string representing a comma-separated set of CSS-like expressions,\n * parses and returns an array of ASTs that correspond to those expressions.\n *\n * Currently supported syntax includes:\n *\n * - functions (top-level and nested)\n * - calc() arithmetic operators\n * - numbers with units\n * - hexadecimal-encoded colors in 3, 6 or 8 digit form\n * - idents\n *\n * All syntax is intended to match the parsing rules and semantics of the actual\n * CSS spec as closely as possible.\n *\n * @see https://www.w3.org/TR/CSS2/\n * @see https://www.w3.org/TR/css-values-3/\n */\nexport const parseExpressions = (() => {\n const cache = {};\n const MAX_PARSE_ITERATIONS = 1000; // Arbitrarily large\n return (inputString) => {\n const cacheKey = inputString;\n if (cacheKey in cache) {\n return cache[cacheKey];\n }\n const expressions = [];\n let parseIterations = 0;\n while (inputString) {\n if (++parseIterations > MAX_PARSE_ITERATIONS) {\n // Avoid a potentially infinite loop due to typos:\n inputString = '';\n break;\n }\n const expressionParseResult = parseExpression(inputString);\n const expression = expressionParseResult.nodes[0];\n if (expression == null || expression.terms.length === 0) {\n break;\n }\n expressions.push(expression);\n inputString = expressionParseResult.remainingInput;\n }\n return cache[cacheKey] = expressions;\n };\n})();\n/**\n * Parse a single expression. For the purposes of our supported syntax, an\n * expression is the set of semantically meaningful terms that appear before the\n * next comma, or between the parens of a function invocation.\n */\nconst parseExpression = (() => {\n const IS_IDENT_RE = /^(\\-\\-|[a-z\\u0240-\\uffff])/i;\n const IS_OPERATOR_RE = /^([\\*\\+\\/]|[\\-]\\s)/i;\n const IS_EXPRESSION_END_RE = /^[\\),]/;\n const FUNCTION_ARGUMENTS_FIRST_TOKEN = '(';\n const HEX_FIRST_TOKEN = '#';\n return (inputString) => {\n const terms = [];\n while (inputString.length) {\n inputString = inputString.trim();\n if (IS_EXPRESSION_END_RE.test(inputString)) {\n break;\n }\n else if (inputString[0] === FUNCTION_ARGUMENTS_FIRST_TOKEN) {\n const { nodes, remainingInput } = parseFunctionArguments(inputString);\n inputString = remainingInput;\n terms.push({\n type: 'function',\n name: { type: 'ident', value: 'calc' },\n arguments: nodes\n });\n }\n else if (IS_IDENT_RE.test(inputString)) {\n const identParseResult = parseIdent(inputString);\n const identNode = identParseResult.nodes[0];\n inputString = identParseResult.remainingInput;\n if (inputString[0] === FUNCTION_ARGUMENTS_FIRST_TOKEN) {\n const { nodes, remainingInput } = parseFunctionArguments(inputString);\n terms.push({ type: 'function', name: identNode, arguments: nodes });\n inputString = remainingInput;\n }\n else {\n terms.push(identNode);\n }\n }\n else if (IS_OPERATOR_RE.test(inputString)) {\n // Operators are always a single character, so just pluck them out:\n terms.push({ type: 'operator', value: inputString[0] });\n inputString = inputString.slice(1);\n }\n else {\n const { nodes, remainingInput } = inputString[0] === HEX_FIRST_TOKEN ?\n parseHex(inputString) :\n parseNumber(inputString);\n // The remaining string may not have had any meaningful content. Exit\n // early if this is the case:\n if (nodes.length === 0) {\n break;\n }\n terms.push(nodes[0]);\n inputString = remainingInput;\n }\n }\n return { nodes: [{ type: 'expression', terms }], remainingInput: inputString };\n };\n})();\n/**\n * An ident is something like a function name or the keyword \"auto\".\n */\nconst parseIdent = (() => {\n const NOT_IDENT_RE = /[^a-z0-9_\\-\\u0240-\\uffff]/i;\n return (inputString) => {\n const match = inputString.match(NOT_IDENT_RE);\n const ident = match == null ? inputString : inputString.substr(0, match.index);\n const remainingInput = match == null ? '' : inputString.substr(match.index);\n return { nodes: [{ type: 'ident', value: ident }], remainingInput };\n };\n})();\n/**\n * Parses a number. A number value can be expressed with an integer or\n * non-integer syntax, and usually includes a unit (but does not strictly\n * require one for our purposes).\n */\nconst parseNumber = (() => {\n // @see https://www.w3.org/TR/css-syntax/#number-token-diagram\n const VALUE_RE = /[\\+\\-]?(\\d+[\\.]\\d+|\\d+|[\\.]\\d+)([eE][\\+\\-]?\\d+)?/;\n const UNIT_RE = /^[a-z%]+/i;\n const ALLOWED_UNITS = /^(m|mm|cm|rad|deg|[%])$/;\n return (inputString) => {\n const valueMatch = inputString.match(VALUE_RE);\n const value = valueMatch == null ? '0' : valueMatch[0];\n inputString = value == null ? inputString : inputString.slice(value.length);\n const unitMatch = inputString.match(UNIT_RE);\n let unit = unitMatch != null && unitMatch[0] !== '' ? unitMatch[0] : null;\n const remainingInput = unitMatch == null ? inputString : inputString.slice(unit.length);\n if (unit != null && !ALLOWED_UNITS.test(unit)) {\n unit = null;\n }\n return {\n nodes: [{\n type: 'number',\n number: parseFloat(value) || 0,\n unit: unit\n }],\n remainingInput\n };\n };\n})();\n/**\n * Parses a hexadecimal-encoded color in 3, 6 or 8 digit form.\n */\nconst parseHex = (() => {\n // TODO(cdata): right now we don't actually enforce the number of digits\n const HEX_RE = /^[a-f0-9]*/i;\n return (inputString) => {\n inputString = inputString.slice(1).trim();\n const hexMatch = inputString.match(HEX_RE);\n const nodes = hexMatch == null ? [] : [{ type: 'hex', value: hexMatch[0] }];\n return {\n nodes,\n remainingInput: hexMatch == null ? inputString :\n inputString.slice(hexMatch[0].length)\n };\n };\n})();\n/**\n * Parses arguments passed to a function invocation (e.g., the expressions\n * within a matched set of parens).\n */\nconst parseFunctionArguments = (inputString) => {\n const expressionNodes = [];\n // Consume the opening paren\n inputString = inputString.slice(1).trim();\n while (inputString.length) {\n const expressionParseResult = parseExpression(inputString);\n expressionNodes.push(expressionParseResult.nodes[0]);\n inputString = expressionParseResult.remainingInput.trim();\n if (inputString[0] === ',') {\n inputString = inputString.slice(1).trim();\n }\n else if (inputString[0] === ')') {\n // Consume the closing paren and stop parsing\n inputString = inputString.slice(1);\n break;\n }\n }\n return { nodes: expressionNodes, remainingInput: inputString };\n};\nconst $visitedTypes = Symbol('visitedTypes');\n/**\n * An ASTWalker walks an array of ASTs such as the type produced by\n * parseExpressions and invokes a callback for a configured set of nodes that\n * the user wishes to \"visit\" during the walk.\n */\nexport class ASTWalker {\n constructor(visitedTypes) {\n this[$visitedTypes] = visitedTypes;\n }\n /**\n * Walk the given set of ASTs, and invoke the provided callback for nodes that\n * match the filtered set that the ASTWalker was constructed with.\n */\n walk(ast, callback) {\n const remaining = ast.slice();\n while (remaining.length) {\n const next = remaining.shift();\n if (this[$visitedTypes].indexOf(next.type) > -1) {\n callback(next);\n }\n switch (next.type) {\n case 'expression':\n remaining.unshift(...next.terms);\n break;\n case 'function':\n remaining.unshift(next.name, ...next.arguments);\n break;\n }\n }\n }\n}\nexport const ZERO = Object.freeze({ type: 'number', number: 0, unit: null });\n//# sourceMappingURL=parsers.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ZERO } from './parsers.js';\n/**\n * Ensures that a given number is expressed in radians. If the number is already\n * in radians, does nothing. If the value is in degrees, converts it to radians.\n * If the value has no specified unit, the unit is assumed to be radians. If the\n * value is not in radians or degrees, the value is resolved as 0 radians.\n *\n * Also accepts a second argument that is a default value to use if the input\n * numberNode number is NaN or Infinity.\n */\nexport const degreesToRadians = (numberNode, fallbackRadianValue = 0) => {\n let { number, unit } = numberNode;\n if (!isFinite(number)) {\n number = fallbackRadianValue;\n unit = 'rad';\n }\n else if (numberNode.unit === 'rad' || numberNode.unit == null) {\n return numberNode;\n }\n const valueIsDegrees = unit === 'deg' && number != null;\n const value = valueIsDegrees ? number : 0;\n const radians = value * Math.PI / 180;\n return { type: 'number', number: radians, unit: 'rad' };\n};\n/**\n * Ensures that a given number is expressed in degrees. If the number is already\n * in degrees, does nothing. If the value is in radians or has no specified\n * unit, converts it to degrees. If the value is not in radians or degrees, the\n * value is resolved as 0 degrees.\n *\n * Also accepts a second argument that is a default value to use if the input\n * numberNode number is NaN or Infinity.\n */\nexport const radiansToDegrees = (numberNode, fallbackDegreeValue = 0) => {\n let { number, unit } = numberNode;\n if (!isFinite(number)) {\n number = fallbackDegreeValue;\n unit = 'deg';\n }\n else if (numberNode.unit === 'deg') {\n return numberNode;\n }\n const valueIsRadians = (unit === null || unit === 'rad') && number != null;\n const value = valueIsRadians ? number : 0;\n const degrees = value * 180 / Math.PI;\n return { type: 'number', number: degrees, unit: 'deg' };\n};\n/**\n * Converts a given length to meters. Currently supported input units are\n * meters, centimeters and millimeters.\n *\n * Also accepts a second argument that is a default value to use if the input\n * numberNode number is NaN or Infinity.\n */\nexport const lengthToBaseMeters = (numberNode, fallbackMeterValue = 0) => {\n let { number, unit } = numberNode;\n if (!isFinite(number)) {\n number = fallbackMeterValue;\n unit = 'm';\n }\n else if (numberNode.unit === 'm') {\n return numberNode;\n }\n let scale;\n switch (unit) {\n default:\n scale = 1;\n break;\n case 'cm':\n scale = 1 / 100;\n break;\n case 'mm':\n scale = 1 / 1000;\n break;\n }\n const value = scale * number;\n return { type: 'number', number: value, unit: 'm' };\n};\n/**\n * Normalizes the unit of a given input number so that it is expressed in a\n * preferred unit. For length nodes, the return value will be expressed in\n * meters. For angle nodes, the return value will be expressed in radians.\n *\n * Also takes a fallback number that is used when the number value is not a\n * valid number or when the unit of the given number cannot be normalized.\n */\nexport const normalizeUnit = (() => {\n const identity = (node) => node;\n const unitNormalizers = {\n 'rad': identity,\n 'deg': degreesToRadians,\n 'm': identity,\n 'mm': lengthToBaseMeters,\n 'cm': lengthToBaseMeters\n };\n return (node, fallback = ZERO) => {\n if (!isFinite(node.number)) {\n node.number = fallback.number;\n node.unit = fallback.unit;\n }\n const { unit } = node;\n if (unit == null) {\n return node;\n }\n const normalize = unitNormalizers[unit];\n if (normalize == null) {\n return fallback;\n }\n return normalize(node);\n };\n})();\n//# sourceMappingURL=conversions.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b, _c;\nimport { normalizeUnit } from './conversions.js';\nimport { numberNode, ZERO } from './parsers.js';\nconst $evaluate = Symbol('evaluate');\nconst $lastValue = Symbol('lastValue');\n/**\n * An Evaluator is used to derive a computed style from part (or all) of a CSS\n * expression AST. This construct is particularly useful for complex ASTs\n * containing function calls such as calc, var and env. Such styles could be\n * costly to re-evaluate on every frame (and in some cases we may try to do\n * that). The Evaluator construct allows us to mark sub-trees of the AST as\n * constant, so that only the dynamic parts are re-evaluated. It also separates\n * one-time AST preparation work from work that necessarily has to happen upon\n * each evaluation.\n */\nexport class Evaluator {\n constructor() {\n this[_a] = null;\n }\n /**\n * An Evaluatable is a NumberNode or an Evaluator that evaluates a NumberNode\n * as the result of invoking its evaluate method. This is mainly used to\n * ensure that CSS function nodes are cast to the corresponding Evaluators\n * that will resolve the result of the function, but is also used to ensure\n * that a percentage nested at arbitrary depth in the expression will always\n * be evaluated against the correct basis.\n */\n static evaluatableFor(node, basis = ZERO) {\n if (node instanceof Evaluator) {\n return node;\n }\n if (node.type === 'number') {\n if (node.unit === '%') {\n return new PercentageEvaluator(node, basis);\n }\n return node;\n }\n switch (node.name.value) {\n case 'calc':\n return new CalcEvaluator(node, basis);\n case 'env':\n return new EnvEvaluator(node);\n }\n return ZERO;\n }\n /**\n * If the input is an Evaluator, returns the result of evaluating it.\n * Otherwise, returns the input.\n *\n * This is a helper to aide in resolving a NumberNode without conditionally\n * checking if the Evaluatable is an Evaluator everywhere.\n */\n static evaluate(evaluatable) {\n if (evaluatable instanceof Evaluator) {\n return evaluatable.evaluate();\n }\n return evaluatable;\n }\n /**\n * If the input is an Evaluator, returns the value of its isConstant property.\n * Returns true for all other input values.\n */\n static isConstant(evaluatable) {\n if (evaluatable instanceof Evaluator) {\n return evaluatable.isConstant;\n }\n return true;\n }\n /**\n * This method applies a set of structured intrinsic metadata to an evaluated\n * result from a parsed CSS-like string of expressions. Intrinsics provide\n * sufficient metadata (e.g., basis values, analogs for keywords) such that\n * omitted values in the input string can be backfilled, and keywords can be\n * converted to concrete numbers.\n *\n * The result of applying intrinsics is a tuple of NumberNode values whose\n * units match the units used by the basis of the intrinsics.\n *\n * The following is a high-level description of how intrinsics are applied:\n *\n * 1. Determine the value of 'auto' for the current term\n * 2. If there is no corresponding input value for this term, substitute the\n * 'auto' value.\n * 3. If the term is an IdentNode, treat it as a keyword and perform the\n * appropriate substitution.\n * 4. If the term is still null, fallback to the 'auto' value\n * 5. If the term is a percentage, apply it to the basis and return that\n * value\n * 6. Normalize the unit of the term\n * 7. If the term's unit does not match the basis unit, return the basis\n * value\n * 8. Return the term as is\n */\n static applyIntrinsics(evaluated, intrinsics) {\n const { basis, keywords } = intrinsics;\n const { auto } = keywords;\n return basis.map((basisNode, index) => {\n // Use an auto value if we have it, otherwise the auto value is the basis:\n const autoSubstituteNode = auto[index] == null ? basisNode : auto[index];\n // If the evaluated nodes do not have a node at the current\n // index, fallback to the \"auto\" substitute right away:\n let evaluatedNode = evaluated[index] ? evaluated[index] : autoSubstituteNode;\n // Any ident node is considered a keyword:\n if (evaluatedNode.type === 'ident') {\n const keyword = evaluatedNode.value;\n // Substitute any keywords for concrete values first:\n if (keyword in keywords) {\n evaluatedNode = keywords[keyword][index];\n }\n }\n // If we don't have a NumberNode at this point, fall back to whatever\n // is specified for auto:\n if (evaluatedNode == null || evaluatedNode.type === 'ident') {\n evaluatedNode = autoSubstituteNode;\n }\n // For percentages, we always apply the percentage to the basis value:\n if (evaluatedNode.unit === '%') {\n return numberNode(evaluatedNode.number / 100 * basisNode.number, basisNode.unit);\n }\n // Otherwise, normalize whatever we have:\n evaluatedNode = normalizeUnit(evaluatedNode, basisNode);\n // If the normalized units do not match, return the basis as a fallback:\n if (evaluatedNode.unit !== basisNode.unit) {\n return basisNode;\n }\n // Finally, return the evaluated node with intrinsics applied:\n return evaluatedNode;\n });\n }\n /**\n * If true, the Evaluator will only evaluate its AST one time. If false, the\n * Evaluator will re-evaluate the AST each time that the public evaluate\n * method is invoked.\n */\n get isConstant() {\n return false;\n }\n /**\n * Evaluate the Evaluator and return the result. If the Evaluator is constant,\n * the corresponding AST will only be evaluated once, and the result of\n * evaluating it the first time will be returned on all subsequent\n * evaluations.\n */\n evaluate() {\n if (!this.isConstant || this[$lastValue] == null) {\n this[$lastValue] = this[$evaluate]();\n }\n return this[$lastValue];\n }\n}\n_a = $lastValue;\nconst $percentage = Symbol('percentage');\nconst $basis = Symbol('basis');\n/**\n * A PercentageEvaluator scales a given basis value by a given percentage value.\n * The evaluated result is always considered to be constant.\n */\nexport class PercentageEvaluator extends Evaluator {\n constructor(percentage, basis) {\n super();\n this[$percentage] = percentage;\n this[$basis] = basis;\n }\n get isConstant() {\n return true;\n }\n [$evaluate]() {\n return numberNode(this[$percentage].number / 100 * this[$basis].number, this[$basis].unit);\n }\n}\nconst $identNode = Symbol('identNode');\n/**\n * Evaluator for CSS-like env() functions. Currently, only one environment\n * variable is accepted as an argument for such functions: window-scroll-y.\n *\n * The env() Evaluator is explicitly dynamic because it always refers to\n * external state that changes as the user scrolls, so it should always be\n * re-evaluated to ensure we get the most recent value.\n *\n * Some important notes about this feature include:\n *\n * - There is no such thing as a \"window-scroll-y\" CSS environment variable in\n * any stable browser at the time that this comment is being written.\n * - The actual CSS env() function accepts a second argument as a fallback for\n * the case that the specified first argument isn't set; our syntax does not\n * support this second argument.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/env\n */\nexport class EnvEvaluator extends Evaluator {\n constructor(envFunction) {\n super();\n this[_b] = null;\n const identNode = envFunction.arguments.length ? envFunction.arguments[0].terms[0] : null;\n if (identNode != null && identNode.type === 'ident') {\n this[$identNode] = identNode;\n }\n }\n get isConstant() {\n return false;\n }\n ;\n [(_b = $identNode, $evaluate)]() {\n if (this[$identNode] != null) {\n switch (this[$identNode].value) {\n case 'window-scroll-y':\n const verticalScrollPosition = window.pageYOffset;\n const verticalScrollMax = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);\n const scrollY = verticalScrollPosition /\n (verticalScrollMax - window.innerHeight) ||\n 0;\n return { type: 'number', number: scrollY, unit: null };\n }\n }\n return ZERO;\n }\n}\nconst IS_MULTIPLICATION_RE = /[\\*\\/]/;\nconst $evaluator = Symbol('evaluator');\n/**\n * Evaluator for CSS-like calc() functions. Our implementation of calc()\n * evaluation currently support nested function calls, an unlimited number of\n * terms, and all four algebraic operators (+, -, * and /).\n *\n * The Evaluator is marked as constant unless the calc expression contains an\n * internal env expression at any depth, in which case it will be marked as\n * dynamic.\n *\n * @see https://www.w3.org/TR/css-values-3/#calc-syntax\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/calc\n */\nexport class CalcEvaluator extends Evaluator {\n constructor(calcFunction, basis = ZERO) {\n super();\n this[_c] = null;\n if (calcFunction.arguments.length !== 1) {\n return;\n }\n const terms = calcFunction.arguments[0].terms.slice();\n const secondOrderTerms = [];\n while (terms.length) {\n const term = terms.shift();\n if (secondOrderTerms.length > 0) {\n const previousTerm = secondOrderTerms[secondOrderTerms.length - 1];\n if (previousTerm.type === 'operator' &&\n IS_MULTIPLICATION_RE.test(previousTerm.value)) {\n const operator = secondOrderTerms.pop();\n const leftValue = secondOrderTerms.pop();\n if (leftValue == null) {\n return;\n }\n secondOrderTerms.push(new OperatorEvaluator(operator, Evaluator.evaluatableFor(leftValue, basis), Evaluator.evaluatableFor(term, basis)));\n continue;\n }\n }\n secondOrderTerms.push(term.type === 'operator' ? term :\n Evaluator.evaluatableFor(term, basis));\n }\n while (secondOrderTerms.length > 2) {\n const [left, operator, right] = secondOrderTerms.splice(0, 3);\n if (operator.type !== 'operator') {\n return;\n }\n secondOrderTerms.unshift(new OperatorEvaluator(operator, Evaluator.evaluatableFor(left, basis), Evaluator.evaluatableFor(right, basis)));\n }\n // There should only be one combined evaluator at this point:\n if (secondOrderTerms.length === 1) {\n this[$evaluator] = secondOrderTerms[0];\n }\n }\n get isConstant() {\n return this[$evaluator] == null || Evaluator.isConstant(this[$evaluator]);\n }\n [(_c = $evaluator, $evaluate)]() {\n return this[$evaluator] != null ? Evaluator.evaluate(this[$evaluator]) :\n ZERO;\n }\n}\nconst $operator = Symbol('operator');\nconst $left = Symbol('left');\nconst $right = Symbol('right');\n/**\n * An Evaluator for the operators found inside CSS calc() functions.\n * The evaluator accepts an operator and left/right operands. The operands can\n * be any valid expression term typically allowed inside a CSS calc function.\n *\n * As detail of this implementation, the only supported unit types are angles\n * expressed as radians or degrees, and lengths expressed as meters, centimeters\n * or millimeters.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/calc\n */\nexport class OperatorEvaluator extends Evaluator {\n constructor(operator, left, right) {\n super();\n this[$operator] = operator;\n this[$left] = left;\n this[$right] = right;\n }\n get isConstant() {\n return Evaluator.isConstant(this[$left]) &&\n Evaluator.isConstant(this[$right]);\n }\n [$evaluate]() {\n const leftNode = normalizeUnit(Evaluator.evaluate(this[$left]));\n const rightNode = normalizeUnit(Evaluator.evaluate(this[$right]));\n const { number: leftValue, unit: leftUnit } = leftNode;\n const { number: rightValue, unit: rightUnit } = rightNode;\n // Disallow operations for mismatched normalized units e.g., m and rad:\n if (rightUnit != null && leftUnit != null && rightUnit != leftUnit) {\n return ZERO;\n }\n // NOTE(cdata): rules for calc type checking are defined here\n // https://drafts.csswg.org/css-values-3/#calc-type-checking\n // This is a simplification and may not hold up once we begin to support\n // additional unit types:\n const unit = leftUnit || rightUnit;\n let value;\n switch (this[$operator].value) {\n case '+':\n value = leftValue + rightValue;\n break;\n case '-':\n value = leftValue - rightValue;\n break;\n case '/':\n value = leftValue / rightValue;\n break;\n case '*':\n value = leftValue * rightValue;\n break;\n default:\n return ZERO;\n }\n return { type: 'number', number: value, unit };\n }\n}\nconst $evaluatables = Symbol('evaluatables');\nconst $intrinsics = Symbol('intrinsics');\n/**\n * A VectorEvaluator evaluates a series of numeric terms that usually represent\n * a data structure such as a multi-dimensional vector or a spherical\n *\n * The form of the evaluator's result is determined by the Intrinsics that are\n * given to it when it is constructed. For example, spherical intrinsics would\n * establish two angle terms and a length term, so the result of evaluating the\n * evaluator that is configured with spherical intrinsics is a three element\n * array where the first two elements represent angles in radians and the third\n * element representing a length in meters.\n */\nexport class StyleEvaluator extends Evaluator {\n constructor(expressions, intrinsics) {\n super();\n this[$intrinsics] = intrinsics;\n const firstExpression = expressions[0];\n const terms = firstExpression != null ? firstExpression.terms : [];\n this[$evaluatables] =\n intrinsics.basis.map((basisNode, index) => {\n const term = terms[index];\n if (term == null) {\n return { type: 'ident', value: 'auto' };\n }\n if (term.type === 'ident') {\n return term;\n }\n return Evaluator.evaluatableFor(term, basisNode);\n });\n }\n get isConstant() {\n for (const evaluatable of this[$evaluatables]) {\n if (!Evaluator.isConstant(evaluatable)) {\n return false;\n }\n }\n return true;\n }\n [$evaluate]() {\n const evaluated = this[$evaluatables].map(evaluatable => Evaluator.evaluate(evaluatable));\n return Evaluator.applyIntrinsics(evaluated, this[$intrinsics])\n .map(numberNode => numberNode.number);\n }\n}\n//# sourceMappingURL=evaluators.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b, _c, _d;\nimport { ASTWalker } from './parsers.js';\nconst $instances = Symbol('instances');\nconst $activateListener = Symbol('activateListener');\nconst $deactivateListener = Symbol('deactivateListener');\nconst $notifyInstances = Symbol('notifyInstances');\nconst $notify = Symbol('notify');\nconst $scrollCallback = Symbol('callback');\n/**\n * This internal helper is intended to work as a reference-counting manager of\n * scroll event listeners. Only one scroll listener is ever registered for all\n * instances of the class, and when the last ScrollObserver \"disconnects\", that\n * event listener is removed. This spares us from thrashing\n * the {add,remove}EventListener API (the binding cost of these methods has been\n * known to show up in performance analyses) as well as potential memory leaks.\n */\nclass ScrollObserver {\n static [$notifyInstances]() {\n for (const instance of ScrollObserver[$instances]) {\n instance[$notify]();\n }\n }\n static [(_a = $instances, $activateListener)]() {\n window.addEventListener('scroll', this[$notifyInstances], { passive: true });\n }\n static [$deactivateListener]() {\n window.removeEventListener('scroll', this[$notifyInstances]);\n }\n constructor(callback) {\n this[$scrollCallback] = callback;\n }\n /**\n * Listen for scroll events. The configured callback (passed to the\n * constructor) will be invoked for subsequent global scroll events.\n */\n observe() {\n if (ScrollObserver[$instances].size === 0) {\n ScrollObserver[$activateListener]();\n }\n ScrollObserver[$instances].add(this);\n }\n /**\n * Stop listening for scroll events.\n */\n disconnect() {\n ScrollObserver[$instances].delete(this);\n if (ScrollObserver[$instances].size === 0) {\n ScrollObserver[$deactivateListener]();\n }\n }\n [$notify]() {\n this[$scrollCallback]();\n }\n ;\n}\nScrollObserver[_a] = new Set();\nconst $computeStyleCallback = Symbol('computeStyleCallback');\nconst $astWalker = Symbol('astWalker');\nconst $dependencies = Symbol('dependencies');\nconst $onScroll = Symbol('onScroll');\n/**\n * The StyleEffector is configured with a callback that will be invoked at the\n * optimal time that some array of CSS expression ASTs ought to be evaluated.\n *\n * For example, our CSS-like expression syntax supports usage of the env()\n * function to incorporate the current top-level scroll position into a CSS\n * expression: env(window-scroll-y).\n *\n * This \"environment variable\" will change dynamically as the user scrolls the\n * page. If an AST contains such a usage of env(), we would have to evaluate the\n * AST on every frame in order to be sure that the computed style stays up to\n * date.\n *\n * The StyleEffector spares us from evaluating the expressions on every frame by\n * correlating specific parts of an AST with observers of the external effects\n * that they refer to (if any). So, if the AST contains env(window-scroll-y),\n * the StyleEffector manages the lifetime of a global scroll event listener and\n * notifies the user at the optimal time to evaluate the computed style.\n */\nexport class StyleEffector {\n constructor(callback) {\n this[_b] = {};\n this[_c] = new ASTWalker(['function']);\n this[_d] = () => {\n this[$computeStyleCallback]({ relatedState: 'window-scroll' });\n };\n this[$computeStyleCallback] = callback;\n }\n /**\n * Sets the expressions that govern when the StyleEffector callback will be\n * invoked.\n */\n observeEffectsFor(ast) {\n const newDependencies = {};\n const oldDependencies = this[$dependencies];\n this[$astWalker].walk(ast, functionNode => {\n const { name } = functionNode;\n const firstArgument = functionNode.arguments[0];\n const firstTerm = firstArgument.terms[0];\n if (name.value !== 'env' || firstTerm == null ||\n firstTerm.type !== 'ident') {\n return;\n }\n switch (firstTerm.value) {\n case 'window-scroll-y':\n if (newDependencies['window-scroll'] == null) {\n const observer = 'window-scroll' in oldDependencies ?\n oldDependencies['window-scroll'] :\n new ScrollObserver(this[$onScroll]);\n observer.observe();\n delete oldDependencies['window-scroll'];\n newDependencies['window-scroll'] = observer;\n }\n break;\n }\n });\n for (const environmentState in oldDependencies) {\n const observer = oldDependencies[environmentState];\n observer.disconnect();\n }\n this[$dependencies] = newDependencies;\n }\n /**\n * Disposes of the StyleEffector by disconnecting all observers of external\n * effects.\n */\n dispose() {\n for (const environmentState in this[$dependencies]) {\n const observer = this[$dependencies][environmentState];\n observer.disconnect();\n }\n }\n}\n_b = $dependencies, _c = $astWalker, _d = $onScroll;\n//# sourceMappingURL=style-effector.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { StyleEvaluator } from './styles/evaluators.js';\nimport { parseExpressions } from './styles/parsers.js';\nimport { StyleEffector } from './styles/style-effector.js';\n/**\n * The @style decorator is responsible for coordinating the conversion of a\n * CSS-like string property value into numbers that can be applied to\n * lower-level constructs. It also can optionally manage the lifecycle of a\n * StyleEffector which allows automatic updates for styles that use env() or\n * var() functions.\n *\n * The decorator is configured with Intrinsics and the property key for a\n * method that handles updates. The named update handler is invoked with the\n * result of parsing and evaluating the raw property string value. The format of\n * the evaluated result is derived from the basis of the configured Intrinsics,\n * and is always an array of numbers of fixed length.\n *\n * NOTE: This decorator depends on the property updating mechanism defined by\n * UpdatingElement as exported by the lit-element module. That means it *must*\n * be used in conjunction with the @property decorator, or equivalent\n * JavaScript.\n *\n * Supported configurations are:\n *\n * - `intrinsics`: An Intrinsics struct that describes how to interpret a\n * serialized style attribute. For more detail on intrinsics see\n * ./styles/evaluators.ts\n * - `updateHandler`: A string or Symbol that is the key of a method to be\n * invoked with the result of parsing and evaluating a serialized style string.\n * - `observeEffects`: Optional, if set to true then styles that use env() will\n * cause their update handlers to be invoked every time the corresponding\n * environment variable changes (even if the style attribute itself remains\n * static).\n */\nexport const style = (config) => {\n const observeEffects = config.observeEffects || false;\n const getIntrinsics = config.intrinsics instanceof Function ?\n config.intrinsics :\n (() => config.intrinsics);\n return (proto, propertyName) => {\n const originalUpdated = proto.updated;\n const originalConnectedCallback = proto.connectedCallback;\n const originalDisconnectedCallback = proto.disconnectedCallback;\n const $styleEffector = Symbol(`${propertyName}StyleEffector`);\n const $styleEvaluator = Symbol(`${propertyName}StyleEvaluator`);\n const $updateEvaluator = Symbol(`${propertyName}UpdateEvaluator`);\n const $evaluateAndSync = Symbol(`${propertyName}EvaluateAndSync`);\n Object.defineProperties(proto, {\n [$styleEffector]: { value: null, writable: true },\n [$styleEvaluator]: { value: null, writable: true },\n [$updateEvaluator]: {\n value: function () {\n const ast = parseExpressions(this[propertyName]);\n this[$styleEvaluator] =\n new StyleEvaluator(ast, getIntrinsics(this));\n if (this[$styleEffector] == null && observeEffects) {\n this[$styleEffector] =\n new StyleEffector(() => this[$evaluateAndSync]());\n }\n if (this[$styleEffector] != null) {\n this[$styleEffector].observeEffectsFor(ast);\n }\n }\n },\n [$evaluateAndSync]: {\n value: function () {\n if (this[$styleEvaluator] == null) {\n return;\n }\n const result = this[$styleEvaluator].evaluate();\n // @see https://github.com/microsoft/TypeScript/pull/30769\n // @see https://github.com/Microsoft/TypeScript/issues/1863\n this[config.updateHandler](result);\n }\n },\n updated: {\n value: function (changedProperties) {\n // Always invoke updates to styles first. This gives a class that\n // uses this decorator the opportunity to override the effect, or\n // respond to it, in its own implementation of `updated`.\n if (changedProperties.has(propertyName)) {\n this[$updateEvaluator]();\n this[$evaluateAndSync]();\n }\n originalUpdated.call(this, changedProperties);\n }\n },\n connectedCallback: {\n value: function () {\n originalConnectedCallback.call(this);\n this.requestUpdate(propertyName, this[propertyName]);\n }\n },\n disconnectedCallback: {\n value: function () {\n originalDisconnectedCallback.call(this);\n if (this[$styleEffector] != null) {\n this[$styleEffector].dispose();\n this[$styleEffector] = null;\n }\n }\n }\n });\n };\n};\n//# sourceMappingURL=decorators.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { clamp } from '../utilities.js';\n// Adapted from https://gist.github.com/gre/1650294\nexport const easeInOutQuad = (t) => t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n/**\n * Creates a TimingFunction that uses a given ease to interpolate between\n * two configured number values.\n */\nexport const interpolate = (start, end, ease = easeInOutQuad) => (time) => start + (end - start) * ease(time);\n/**\n * Creates a TimingFunction that interpolates through a weighted list\n * of other TimingFunctions (\"tracks\"). Tracks are interpolated in order, and\n * allocated a percentage of the total time based on their relative weight.\n */\nexport const sequence = (tracks, weights) => {\n const cumulativeSum = ((sum) => (value) => sum += value);\n const times = weights.map(cumulativeSum(0));\n return (time) => {\n time = clamp(time, 0, 1);\n time *= times[times.length - 1];\n const i = times.findIndex((val) => val >= time);\n const start = i < 1 ? 0 : times[i - 1];\n const end = times[i];\n return tracks[i]((time - start) / (end - start));\n };\n};\n/**\n * Creates a \"timeline\" TimingFunction out of an initial value and a series of\n * Keyframes. The timeline function accepts value from 0-1 and returns the\n * current value based on keyframe interpolation across the total number of\n * frames. Frames are only used to indicate the relative length of each keyframe\n * transition, so interpolated values will be computed for fractional frames.\n */\nexport const timeline = (path) => {\n const tracks = [];\n const weights = [];\n let lastValue = path.initialValue;\n for (let i = 0; i < path.keyframes.length; ++i) {\n const keyframe = path.keyframes[i];\n const { value, frames } = keyframe;\n const ease = keyframe.ease || easeInOutQuad;\n const track = interpolate(lastValue, value, ease);\n tracks.push(track);\n weights.push(frames);\n lastValue = value;\n }\n return sequence(tracks, weights);\n};\n//# sourceMappingURL=animation.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { Spherical, Vector3 } from 'three';\nimport { style } from '../decorators.js';\nimport { $ariaLabel, $container, $getModelIsVisible, $loadedTime, $needsRender, $onModelLoad, $onResize, $renderer, $scene, $tick, $updateStatus, $userInputElement, toVector3D } from '../model-viewer-base.js';\nimport { degreesToRadians, normalizeUnit } from '../styles/conversions.js';\nimport { StyleEvaluator } from '../styles/evaluators.js';\nimport { numberNode, parseExpressions } from '../styles/parsers.js';\nimport { DECAY_MILLISECONDS } from '../three-components/Damper.js';\nimport { ChangeSource, SmoothControls } from '../three-components/SmoothControls.js';\nimport { timeline } from '../utilities/animation.js';\n// NOTE(cdata): The following \"animation\" timing functions are deliberately\n// being used in favor of CSS animations. In Safari 12.1 and 13, CSS animations\n// would cause the interaction prompt to glitch unexpectedly\n// @see https://github.com/google/model-viewer/issues/839\nconst PROMPT_ANIMATION_TIME = 5000;\n// For timing purposes, a \"frame\" is a timing agnostic relative unit of time\n// and a \"value\" is a target value for the Frame.\nconst wiggle = timeline({\n initialValue: 0,\n keyframes: [\n { frames: 5, value: -1 },\n { frames: 1, value: -1 },\n { frames: 8, value: 1 },\n { frames: 1, value: 1 },\n { frames: 5, value: 0 },\n { frames: 18, value: 0 }\n ]\n});\nconst fade = timeline({\n initialValue: 0,\n keyframes: [\n { frames: 1, value: 1 },\n { frames: 5, value: 1 },\n { frames: 1, value: 0 },\n { frames: 6, value: 0 }\n ]\n});\nexport const DEFAULT_FOV_DEG = 30;\nexport const DEFAULT_MIN_FOV_DEG = 12;\nexport const DEFAULT_CAMERA_ORBIT = '0deg 75deg 105%';\nconst DEFAULT_CAMERA_TARGET = 'auto auto auto';\nconst DEFAULT_FIELD_OF_VIEW = 'auto';\nconst MINIMUM_RADIUS_RATIO = 2.2;\nconst AZIMUTHAL_QUADRANT_LABELS = ['front', 'right', 'back', 'left'];\nconst POLAR_TRIENT_LABELS = ['upper-', '', 'lower-'];\nexport const DEFAULT_INTERACTION_PROMPT_THRESHOLD = 3000;\nexport const INTERACTION_PROMPT = '. Use mouse, touch or arrow keys to move.';\nexport const InteractionPromptStrategy = {\n AUTO: 'auto',\n NONE: 'none'\n};\nexport const InteractionPromptStyle = {\n BASIC: 'basic',\n WIGGLE: 'wiggle'\n};\nexport const TouchAction = {\n PAN_Y: 'pan-y',\n PAN_X: 'pan-x',\n NONE: 'none'\n};\nexport const fieldOfViewIntrinsics = () => {\n return {\n basis: [degreesToRadians(numberNode(DEFAULT_FOV_DEG, 'deg'))],\n keywords: { auto: [null] }\n };\n};\nconst minFieldOfViewIntrinsics = () => {\n return {\n basis: [degreesToRadians(numberNode(DEFAULT_MIN_FOV_DEG, 'deg'))],\n keywords: { auto: [null] }\n };\n};\nexport const cameraOrbitIntrinsics = (() => {\n const defaultTerms = parseExpressions(DEFAULT_CAMERA_ORBIT)[0]\n .terms;\n const theta = normalizeUnit(defaultTerms[0]);\n const phi = normalizeUnit(defaultTerms[1]);\n return (element) => {\n const radius = element[$scene].idealCameraDistance();\n return {\n basis: [theta, phi, numberNode(radius, 'm')],\n keywords: { auto: [null, null, numberNode(105, '%')] }\n };\n };\n})();\nconst minCameraOrbitIntrinsics = (element) => {\n const radius = MINIMUM_RADIUS_RATIO * element[$scene].boundingSphere.radius;\n return {\n basis: [\n numberNode(-Infinity, 'rad'),\n numberNode(0, 'rad'),\n numberNode(radius, 'm')\n ],\n keywords: { auto: [null, null, null] }\n };\n};\nconst maxCameraOrbitIntrinsics = (element) => {\n const orbitIntrinsics = cameraOrbitIntrinsics(element);\n const evaluator = new StyleEvaluator([], orbitIntrinsics);\n const defaultRadius = evaluator.evaluate()[2];\n return {\n basis: [\n numberNode(Infinity, 'rad'),\n numberNode(Math.PI, 'rad'),\n numberNode(defaultRadius, 'm')\n ],\n keywords: { auto: [null, null, null] }\n };\n};\nexport const cameraTargetIntrinsics = (element) => {\n const center = element[$scene].boundingBox.getCenter(new Vector3());\n return {\n basis: [\n numberNode(center.x, 'm'),\n numberNode(center.y, 'm'),\n numberNode(center.z, 'm')\n ],\n keywords: { auto: [null, null, null] }\n };\n};\nconst HALF_PI = Math.PI / 2.0;\nconst THIRD_PI = Math.PI / 3.0;\nconst QUARTER_PI = HALF_PI / 2.0;\nconst TAU = 2.0 * Math.PI;\nexport const $controls = Symbol('controls');\nexport const $panElement = Symbol('panElement');\nexport const $promptElement = Symbol('promptElement');\nexport const $promptAnimatedContainer = Symbol('promptAnimatedContainer');\nexport const $fingerAnimatedContainers = Symbol('fingerAnimatedContainers');\nconst $deferInteractionPrompt = Symbol('deferInteractionPrompt');\nconst $updateAria = Symbol('updateAria');\nconst $a11y = Symbol('a11y');\nconst $updateA11y = Symbol('updateA11y');\nconst $updateCameraForRadius = Symbol('updateCameraForRadius');\nconst $cancelPrompts = Symbol('cancelPrompts');\nconst $onChange = Symbol('onChange');\nconst $onPointerChange = Symbol('onPointerChange');\nconst $waitingToPromptUser = Symbol('waitingToPromptUser');\nconst $userHasInteracted = Symbol('userHasInteracted');\nconst $promptElementVisibleTime = Symbol('promptElementVisibleTime');\nconst $lastPromptOffset = Symbol('lastPromptOffset');\nconst $cancellationSource = Symbol('cancellationSource');\nconst $lastSpherical = Symbol('lastSpherical');\nconst $jumpCamera = Symbol('jumpCamera');\nconst $initialized = Symbol('initialized');\nconst $maintainThetaPhi = Symbol('maintainThetaPhi');\nconst $syncCameraOrbit = Symbol('syncCameraOrbit');\nconst $syncFieldOfView = Symbol('syncFieldOfView');\nconst $syncCameraTarget = Symbol('syncCameraTarget');\nconst $syncMinCameraOrbit = Symbol('syncMinCameraOrbit');\nconst $syncMaxCameraOrbit = Symbol('syncMaxCameraOrbit');\nconst $syncMinFieldOfView = Symbol('syncMinFieldOfView');\nconst $syncMaxFieldOfView = Symbol('syncMaxFieldOfView');\nexport const ControlsMixin = (ModelViewerElement) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;\n class ControlsModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this.cameraControls = false;\n this.cameraOrbit = DEFAULT_CAMERA_ORBIT;\n this.cameraTarget = DEFAULT_CAMERA_TARGET;\n this.fieldOfView = DEFAULT_FIELD_OF_VIEW;\n this.minCameraOrbit = 'auto';\n this.maxCameraOrbit = 'auto';\n this.minFieldOfView = 'auto';\n this.maxFieldOfView = 'auto';\n this.interactionPromptThreshold = DEFAULT_INTERACTION_PROMPT_THRESHOLD;\n this.interactionPrompt = InteractionPromptStrategy.AUTO;\n this.interactionPromptStyle = InteractionPromptStyle.WIGGLE;\n this.orbitSensitivity = 1;\n this.zoomSensitivity = 1;\n this.panSensitivity = 1;\n this.touchAction = TouchAction.NONE;\n this.disableZoom = false;\n this.disablePan = false;\n this.disableTap = false;\n this.interpolationDecay = DECAY_MILLISECONDS;\n this.a11y = null;\n this[_a] = this.shadowRoot.querySelector('.interaction-prompt');\n this[_b] = this.shadowRoot.querySelector('#prompt');\n this[_c] = [\n this.shadowRoot.querySelector('#finger0'),\n this.shadowRoot.querySelector('#finger1')\n ];\n this[_d] = this.shadowRoot.querySelector('.pan-target');\n this[_e] = 0;\n this[_f] = Infinity;\n this[_g] = false;\n this[_h] = false;\n this[_j] = ChangeSource.AUTOMATIC;\n this[_k] = new SmoothControls(this[$scene].camera, this[$userInputElement], this[$scene]);\n this[_l] = new Spherical();\n this[_m] = false;\n this[_o] = false;\n this[_p] = false;\n this[_q] = {};\n this[_r] = () => {\n const source = this[$controls].changeSource;\n this[$cancellationSource] = source;\n if (source === ChangeSource.USER_INTERACTION) {\n this[$userHasInteracted] = true;\n this[$deferInteractionPrompt]();\n }\n };\n this[_s] = () => {\n this[$updateAria]();\n this[$needsRender]();\n const source = this[$controls].changeSource;\n this.dispatchEvent(new CustomEvent('camera-change', { detail: { source } }));\n };\n this[_t] = (event) => {\n this[$container].classList.toggle('pointer-tumbling', event.type === 'pointer-change-start');\n };\n }\n get inputSensitivity() {\n return this[$controls].inputSensitivity;\n }\n set inputSensitivity(value) {\n this[$controls].inputSensitivity = value;\n }\n getCameraOrbit() {\n const { theta, phi, radius } = this[$lastSpherical];\n return {\n theta,\n phi,\n radius,\n toString() {\n return `${this.theta}rad ${this.phi}rad ${this.radius}m`;\n }\n };\n }\n getCameraTarget() {\n return toVector3D(this[$renderer].isPresenting ? this[$renderer].arRenderer.target :\n this[$scene].getDynamicTarget());\n }\n getFieldOfView() {\n return this[$controls].getFieldOfView();\n }\n // Provided so user code does not have to parse these from attributes.\n getMinimumFieldOfView() {\n return this[$controls].options.minimumFieldOfView;\n }\n getMaximumFieldOfView() {\n return this[$controls].options.maximumFieldOfView;\n }\n getIdealAspect() {\n return this[$scene].idealAspect;\n }\n jumpCameraToGoal() {\n this[$jumpCamera] = true;\n this.requestUpdate($jumpCamera, false);\n }\n resetInteractionPrompt() {\n this[$lastPromptOffset] = 0;\n this[$promptElementVisibleTime] = Infinity;\n this[$userHasInteracted] = false;\n this[$waitingToPromptUser] =\n this.interactionPrompt === InteractionPromptStrategy.AUTO &&\n this.cameraControls;\n }\n zoom(keyPresses) {\n const event = new WheelEvent('wheel', { deltaY: -30 * keyPresses });\n this[$userInputElement].dispatchEvent(event);\n }\n connectedCallback() {\n super.connectedCallback();\n this[$controls].addEventListener('user-interaction', this[$cancelPrompts]);\n this[$controls].addEventListener('pointer-change-start', this[$onPointerChange]);\n this[$controls].addEventListener('pointer-change-end', this[$onPointerChange]);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this[$controls].removeEventListener('user-interaction', this[$cancelPrompts]);\n this[$controls].removeEventListener('pointer-change-start', this[$onPointerChange]);\n this[$controls].removeEventListener('pointer-change-end', this[$onPointerChange]);\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n const controls = this[$controls];\n const scene = this[$scene];\n if (changedProperties.has('cameraControls')) {\n if (this.cameraControls) {\n controls.enableInteraction();\n if (this.interactionPrompt === InteractionPromptStrategy.AUTO) {\n this[$waitingToPromptUser] = true;\n }\n }\n else {\n controls.disableInteraction();\n this[$deferInteractionPrompt]();\n }\n this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]);\n }\n if (changedProperties.has('disableZoom')) {\n controls.disableZoom = this.disableZoom;\n }\n if (changedProperties.has('disablePan')) {\n controls.enablePan = !this.disablePan;\n }\n if (changedProperties.has('disableTap')) {\n controls.enableTap = !this.disableTap;\n }\n if (changedProperties.has('interactionPrompt') ||\n changedProperties.has('cameraControls') ||\n changedProperties.has('src')) {\n if (this.interactionPrompt === InteractionPromptStrategy.AUTO &&\n this.cameraControls && !this[$userHasInteracted]) {\n this[$waitingToPromptUser] = true;\n }\n else {\n this[$deferInteractionPrompt]();\n }\n }\n if (changedProperties.has('interactionPromptStyle')) {\n this[$promptAnimatedContainer].style.opacity =\n this.interactionPromptStyle == InteractionPromptStyle.BASIC ? '1' :\n '0';\n }\n if (changedProperties.has('touchAction')) {\n const touchAction = this.touchAction;\n controls.applyOptions({ touchAction });\n controls.updateTouchActionStyle();\n }\n if (changedProperties.has('orbitSensitivity')) {\n controls.orbitSensitivity = this.orbitSensitivity;\n }\n if (changedProperties.has('zoomSensitivity')) {\n controls.zoomSensitivity = this.zoomSensitivity;\n }\n if (changedProperties.has('panSensitivity')) {\n controls.panSensitivity = this.panSensitivity;\n }\n if (changedProperties.has('interpolationDecay')) {\n controls.setDamperDecayTime(this.interpolationDecay);\n scene.setTargetDamperDecayTime(this.interpolationDecay);\n }\n if (changedProperties.has('a11y')) {\n this[$updateA11y]();\n }\n if (this[$jumpCamera] === true) {\n Promise.resolve().then(() => {\n controls.jumpToGoal();\n scene.jumpToGoal();\n this[$onChange]();\n this[$jumpCamera] = false;\n });\n }\n }\n async updateFraming() {\n const scene = this[$scene];\n const oldFramedFoV = scene.adjustedFoV(scene.framedFoVDeg);\n await scene.updateFraming();\n const newFramedFoV = scene.adjustedFoV(scene.framedFoVDeg);\n const zoom = this[$controls].getFieldOfView() / oldFramedFoV;\n this[$controls].setFieldOfView(newFramedFoV * zoom);\n this[$maintainThetaPhi] = true;\n this.requestUpdate('maxFieldOfView');\n this.requestUpdate('fieldOfView');\n this.requestUpdate('minCameraOrbit');\n this.requestUpdate('maxCameraOrbit');\n this.requestUpdate('cameraOrbit');\n await this.updateComplete;\n }\n interact(duration, finger0, finger1) {\n const inputElement = this[$userInputElement];\n const fingerElements = this[$fingerAnimatedContainers];\n if (fingerElements[0].style.opacity === '1') {\n console.warn('interact() failed because an existing interaction is running.');\n return;\n }\n const xy = new Array();\n xy.push({ x: timeline(finger0.x), y: timeline(finger0.y) });\n const positions = [{ x: xy[0].x(0), y: xy[0].y(0) }];\n if (finger1 != null) {\n xy.push({ x: timeline(finger1.x), y: timeline(finger1.y) });\n positions.push({ x: xy[1].x(0), y: xy[1].y(0) });\n }\n let startTime = performance.now();\n const { width, height } = this[$scene];\n const rect = this.getBoundingClientRect();\n const dispatchTouches = (type) => {\n for (const [i, position] of positions.entries()) {\n const { style } = fingerElements[i];\n style.transform = `translateX(${width * position.x}px) translateY(${height * position.y}px)`;\n if (type === 'pointerdown') {\n style.opacity = '1';\n }\n else if (type === 'pointerup') {\n style.opacity = '0';\n }\n const init = {\n pointerId: i - 5678, // help ensure uniqueness\n pointerType: 'touch',\n target: inputElement,\n clientX: width * position.x + rect.x,\n clientY: height * position.y + rect.y,\n altKey: true // flag that this is not a user interaction\n };\n inputElement.dispatchEvent(new PointerEvent(type, init));\n }\n };\n const moveTouches = () => {\n // Cancel interaction if something else moves the camera or input is\n // removed from the DOM.\n const changeSource = this[$cancellationSource];\n if (changeSource !== ChangeSource.AUTOMATIC ||\n !inputElement.isConnected) {\n for (const fingerElement of this[$fingerAnimatedContainers]) {\n fingerElement.style.opacity = '0';\n }\n dispatchTouches('pointercancel');\n this.dispatchEvent(new CustomEvent('interact-stopped', { detail: { source: changeSource } }));\n document.removeEventListener('visibilitychange', onVisibilityChange);\n return;\n }\n const time = Math.min(1, (performance.now() - startTime) / duration);\n for (const [i, position] of positions.entries()) {\n position.x = xy[i].x(time);\n position.y = xy[i].y(time);\n }\n dispatchTouches('pointermove');\n if (time < 1) {\n requestAnimationFrame(moveTouches);\n }\n else {\n dispatchTouches('pointerup');\n this.dispatchEvent(new CustomEvent('interact-stopped', { detail: { source: ChangeSource.AUTOMATIC } }));\n document.removeEventListener('visibilitychange', onVisibilityChange);\n }\n };\n const onVisibilityChange = () => {\n let elapsed = 0;\n if (document.visibilityState === 'hidden') {\n elapsed = performance.now() - startTime;\n }\n else {\n startTime = performance.now() - elapsed;\n }\n };\n document.addEventListener('visibilitychange', onVisibilityChange);\n dispatchTouches('pointerdown');\n this[$cancellationSource] = ChangeSource.AUTOMATIC;\n requestAnimationFrame(moveTouches);\n }\n [(_a = $promptElement, _b = $promptAnimatedContainer, _c = $fingerAnimatedContainers, _d = $panElement, _e = $lastPromptOffset, _f = $promptElementVisibleTime, _g = $userHasInteracted, _h = $waitingToPromptUser, _j = $cancellationSource, _k = $controls, _l = $lastSpherical, _m = $jumpCamera, _o = $initialized, _p = $maintainThetaPhi, _q = $a11y, $syncFieldOfView)](style) {\n const controls = this[$controls];\n const scene = this[$scene];\n scene.framedFoVDeg = style[0] * 180 / Math.PI;\n controls.changeSource = ChangeSource.NONE;\n controls.setFieldOfView(scene.adjustedFoV(scene.framedFoVDeg));\n this[$cancelPrompts]();\n }\n [$syncCameraOrbit](style) {\n const controls = this[$controls];\n if (this[$maintainThetaPhi]) {\n const { theta, phi } = this.getCameraOrbit();\n style[0] = theta;\n style[1] = phi;\n this[$maintainThetaPhi] = false;\n }\n controls.changeSource = ChangeSource.NONE;\n controls.setOrbit(style[0], style[1], style[2]);\n this[$cancelPrompts]();\n }\n [$syncMinCameraOrbit](style) {\n this[$controls].applyOptions({\n minimumAzimuthalAngle: style[0],\n minimumPolarAngle: style[1],\n minimumRadius: style[2]\n });\n this.jumpCameraToGoal();\n }\n [$syncMaxCameraOrbit](style) {\n this[$controls].applyOptions({\n maximumAzimuthalAngle: style[0],\n maximumPolarAngle: style[1],\n maximumRadius: style[2]\n });\n this[$updateCameraForRadius](style[2]);\n this.jumpCameraToGoal();\n }\n [$syncMinFieldOfView](style) {\n this[$controls].applyOptions({ minimumFieldOfView: style[0] * 180 / Math.PI });\n this.jumpCameraToGoal();\n }\n [$syncMaxFieldOfView](style) {\n const fov = this[$scene].adjustedFoV(style[0] * 180 / Math.PI);\n this[$controls].applyOptions({ maximumFieldOfView: fov });\n this.jumpCameraToGoal();\n }\n [$syncCameraTarget](style) {\n const [x, y, z] = style;\n if (!this[$renderer].arRenderer.isPresenting) {\n this[$scene].setTarget(x, y, z);\n }\n this[$controls].changeSource = ChangeSource.NONE;\n this[$renderer].arRenderer.updateTarget();\n this[$cancelPrompts]();\n }\n [$tick](time, delta) {\n super[$tick](time, delta);\n if (this[$renderer].isPresenting || !this[$getModelIsVisible]()) {\n return;\n }\n const controls = this[$controls];\n const scene = this[$scene];\n const now = performance.now();\n if (this[$waitingToPromptUser]) {\n if (this.loaded &&\n now > this[$loadedTime] + this.interactionPromptThreshold) {\n this[$waitingToPromptUser] = false;\n this[$promptElementVisibleTime] = now;\n this[$promptElement].classList.add('visible');\n }\n }\n if (isFinite(this[$promptElementVisibleTime]) &&\n this.interactionPromptStyle === InteractionPromptStyle.WIGGLE) {\n const animationTime = ((now - this[$promptElementVisibleTime]) / PROMPT_ANIMATION_TIME) %\n 1;\n const offset = wiggle(animationTime);\n const opacity = fade(animationTime);\n this[$promptAnimatedContainer].style.opacity = `${opacity}`;\n if (offset !== this[$lastPromptOffset]) {\n const xOffset = offset * scene.width * 0.05;\n const deltaTheta = (offset - this[$lastPromptOffset]) * Math.PI / 16;\n this[$promptAnimatedContainer].style.transform =\n `translateX(${xOffset}px)`;\n controls.changeSource = ChangeSource.AUTOMATIC;\n controls.adjustOrbit(deltaTheta, 0, 0);\n this[$lastPromptOffset] = offset;\n }\n }\n const cameraMoved = controls.update(time, delta);\n const targetMoved = scene.updateTarget(delta);\n if (cameraMoved || targetMoved) {\n this[$onChange]();\n }\n }\n [$deferInteractionPrompt]() {\n // Effectively cancel the timer waiting for user interaction:\n this[$waitingToPromptUser] = false;\n this[$promptElement].classList.remove('visible');\n this[$promptElementVisibleTime] = Infinity;\n }\n /**\n * Updates the camera's near and far planes to enclose the scene when\n * orbiting at the supplied radius.\n */\n [$updateCameraForRadius](radius) {\n const maximumRadius = Math.max(this[$scene].farRadius(), radius);\n const near = 0;\n const far = Math.abs(2 * maximumRadius);\n this[$controls].updateNearFar(near, far);\n }\n [$updateAria]() {\n const { theta, phi } = this[$controls].getCameraSpherical(this[$lastSpherical]);\n const azimuthalQuadrant = (4 + Math.floor(((theta % TAU) + QUARTER_PI) / HALF_PI)) % 4;\n const polarTrient = Math.floor(phi / THIRD_PI);\n const azimuthalQuadrantLabel = AZIMUTHAL_QUADRANT_LABELS[azimuthalQuadrant];\n const polarTrientLabel = POLAR_TRIENT_LABELS[polarTrient];\n const position = `${polarTrientLabel}${azimuthalQuadrantLabel}`;\n const key = position;\n if (key in this[$a11y]) {\n this[$updateStatus](this[$a11y][key]);\n }\n else {\n this[$updateStatus](`View from stage ${position}`);\n }\n }\n get [$ariaLabel]() {\n let interactionPrompt = INTERACTION_PROMPT;\n if ('interaction-prompt' in this[$a11y]) {\n interactionPrompt = `. ${this[$a11y]['interaction-prompt']}`;\n }\n return super[$ariaLabel].replace(/\\.$/, '') +\n (this.cameraControls ? interactionPrompt : '');\n }\n async [$onResize](event) {\n const controls = this[$controls];\n const scene = this[$scene];\n const oldFramedFoV = scene.adjustedFoV(scene.framedFoVDeg);\n // The super of $onResize may update the scene's adjustedFoV, so we\n // compare the before and after to calculate the proper zoom.\n super[$onResize](event);\n const fovRatio = scene.adjustedFoV(scene.framedFoVDeg) / oldFramedFoV;\n const fov = controls.getFieldOfView() * (isFinite(fovRatio) ? fovRatio : 1);\n controls.updateAspect(this[$scene].aspect);\n this.requestUpdate('maxFieldOfView', this.maxFieldOfView);\n await this.updateComplete;\n this[$controls].setFieldOfView(fov);\n this.jumpCameraToGoal();\n }\n [$onModelLoad]() {\n super[$onModelLoad]();\n if (this[$initialized]) {\n this[$maintainThetaPhi] = true;\n }\n else {\n this[$initialized] = true;\n }\n this.requestUpdate('maxFieldOfView', this.maxFieldOfView);\n this.requestUpdate('fieldOfView', this.fieldOfView);\n this.requestUpdate('minCameraOrbit', this.minCameraOrbit);\n this.requestUpdate('maxCameraOrbit', this.maxCameraOrbit);\n this.requestUpdate('cameraOrbit', this.cameraOrbit);\n this.requestUpdate('cameraTarget', this.cameraTarget);\n this.jumpCameraToGoal();\n }\n [(_r = $cancelPrompts, _s = $onChange, _t = $onPointerChange, $updateA11y)]() {\n if (typeof this.a11y === 'string') {\n if (this.a11y.startsWith('{')) {\n try {\n this[$a11y] = JSON.parse(this.a11y);\n }\n catch (error) {\n console.warn('Error parsing a11y JSON:', error);\n }\n }\n else if (this.a11y.length > 0) {\n console.warn('Error not supported format, should be a JSON string:', this.a11y);\n }\n else {\n this[$a11y] = {};\n }\n }\n else if (typeof this.a11y === 'object' && this.a11y != null) {\n this[$a11y] = Object.assign({}, this.a11y);\n }\n else {\n this[$a11y] = {};\n }\n this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]);\n }\n }\n __decorate([\n property({ type: Boolean, attribute: 'camera-controls' })\n ], ControlsModelViewerElement.prototype, \"cameraControls\", void 0);\n __decorate([\n style({\n intrinsics: cameraOrbitIntrinsics,\n observeEffects: true,\n updateHandler: $syncCameraOrbit\n }),\n property({ type: String, attribute: 'camera-orbit', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"cameraOrbit\", void 0);\n __decorate([\n style({\n intrinsics: cameraTargetIntrinsics,\n observeEffects: true,\n updateHandler: $syncCameraTarget\n }),\n property({ type: String, attribute: 'camera-target', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"cameraTarget\", void 0);\n __decorate([\n style({\n intrinsics: fieldOfViewIntrinsics,\n observeEffects: true,\n updateHandler: $syncFieldOfView\n }),\n property({ type: String, attribute: 'field-of-view', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"fieldOfView\", void 0);\n __decorate([\n style({\n intrinsics: minCameraOrbitIntrinsics,\n updateHandler: $syncMinCameraOrbit\n }),\n property({ type: String, attribute: 'min-camera-orbit', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"minCameraOrbit\", void 0);\n __decorate([\n style({\n intrinsics: maxCameraOrbitIntrinsics,\n updateHandler: $syncMaxCameraOrbit\n }),\n property({ type: String, attribute: 'max-camera-orbit', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"maxCameraOrbit\", void 0);\n __decorate([\n style({\n intrinsics: minFieldOfViewIntrinsics,\n updateHandler: $syncMinFieldOfView\n }),\n property({ type: String, attribute: 'min-field-of-view', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"minFieldOfView\", void 0);\n __decorate([\n style({ intrinsics: fieldOfViewIntrinsics, updateHandler: $syncMaxFieldOfView }),\n property({ type: String, attribute: 'max-field-of-view', hasChanged: () => true })\n ], ControlsModelViewerElement.prototype, \"maxFieldOfView\", void 0);\n __decorate([\n property({ type: Number, attribute: 'interaction-prompt-threshold' })\n ], ControlsModelViewerElement.prototype, \"interactionPromptThreshold\", void 0);\n __decorate([\n property({ type: String, attribute: 'interaction-prompt' })\n ], ControlsModelViewerElement.prototype, \"interactionPrompt\", void 0);\n __decorate([\n property({ type: String, attribute: 'interaction-prompt-style' })\n ], ControlsModelViewerElement.prototype, \"interactionPromptStyle\", void 0);\n __decorate([\n property({ type: Number, attribute: 'orbit-sensitivity' })\n ], ControlsModelViewerElement.prototype, \"orbitSensitivity\", void 0);\n __decorate([\n property({ type: Number, attribute: 'zoom-sensitivity' })\n ], ControlsModelViewerElement.prototype, \"zoomSensitivity\", void 0);\n __decorate([\n property({ type: Number, attribute: 'pan-sensitivity' })\n ], ControlsModelViewerElement.prototype, \"panSensitivity\", void 0);\n __decorate([\n property({ type: String, attribute: 'touch-action' })\n ], ControlsModelViewerElement.prototype, \"touchAction\", void 0);\n __decorate([\n property({ type: Boolean, attribute: 'disable-zoom' })\n ], ControlsModelViewerElement.prototype, \"disableZoom\", void 0);\n __decorate([\n property({ type: Boolean, attribute: 'disable-pan' })\n ], ControlsModelViewerElement.prototype, \"disablePan\", void 0);\n __decorate([\n property({ type: Boolean, attribute: 'disable-tap' })\n ], ControlsModelViewerElement.prototype, \"disableTap\", void 0);\n __decorate([\n property({ type: Number, attribute: 'interpolation-decay' })\n ], ControlsModelViewerElement.prototype, \"interpolationDecay\", void 0);\n __decorate([\n property()\n ], ControlsModelViewerElement.prototype, \"a11y\", void 0);\n return ControlsModelViewerElement;\n};\n//# sourceMappingURL=controls.js.map","/* @license\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Euler, EventDispatcher, Matrix3, Spherical, Vector2, Vector3 } from 'three';\nimport { $panElement } from '../features/controls.js';\nimport { clamp } from '../utilities.js';\nimport { Damper, SETTLING_TIME } from './Damper.js';\nconst PAN_SENSITIVITY = 0.018;\nconst TAP_DISTANCE = 2;\nconst TAP_MS = 300;\nconst vector2 = new Vector2();\nconst vector3 = new Vector3();\nexport const DEFAULT_OPTIONS = Object.freeze({\n minimumRadius: 0,\n maximumRadius: Infinity,\n minimumPolarAngle: 0,\n maximumPolarAngle: Math.PI,\n minimumAzimuthalAngle: -Infinity,\n maximumAzimuthalAngle: Infinity,\n minimumFieldOfView: 10,\n maximumFieldOfView: 45,\n touchAction: 'none'\n});\n// Constants\nconst KEYBOARD_ORBIT_INCREMENT = Math.PI / 8;\nconst ZOOM_SENSITIVITY = 0.04;\n// The move size on pan key event\nconst PAN_KEY_INCREMENT = 10;\nexport const KeyCode = {\n PAGE_UP: 33,\n PAGE_DOWN: 34,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40\n};\nexport const ChangeSource = {\n USER_INTERACTION: 'user-interaction',\n NONE: 'none',\n AUTOMATIC: 'automatic'\n};\n/**\n * SmoothControls is a Three.js helper for adding delightful pointer and\n * keyboard-based input to a staged Three.js scene. Its API is very similar to\n * OrbitControls, but it offers more opinionated (subjectively more delightful)\n * defaults, easy extensibility and subjectively better out-of-the-box keyboard\n * support.\n *\n * One important change compared to OrbitControls is that the `update` method\n * of SmoothControls must be invoked on every frame, otherwise the controls\n * will not have an effect.\n *\n * Another notable difference compared to OrbitControls is that SmoothControls\n * does not currently support panning (but probably will in a future revision).\n *\n * Like OrbitControls, SmoothControls assumes that the orientation of the camera\n * has been set in terms of position, rotation and scale, so it is important to\n * ensure that the camera's matrixWorld is in sync before using SmoothControls.\n */\nexport class SmoothControls extends EventDispatcher {\n constructor(camera, element, scene) {\n super();\n this.camera = camera;\n this.element = element;\n this.scene = scene;\n this.orbitSensitivity = 1;\n this.zoomSensitivity = 1;\n this.panSensitivity = 1;\n this.inputSensitivity = 1;\n this.changeSource = ChangeSource.NONE;\n this._interactionEnabled = false;\n this._disableZoom = false;\n this.isUserPointing = false;\n // Pan state\n this.enablePan = true;\n this.enableTap = true;\n this.panProjection = new Matrix3();\n this.panPerPixel = 0;\n // Internal orbital position state\n this.spherical = new Spherical();\n this.goalSpherical = new Spherical();\n this.thetaDamper = new Damper();\n this.phiDamper = new Damper();\n this.radiusDamper = new Damper();\n this.logFov = Math.log(DEFAULT_OPTIONS.maximumFieldOfView);\n this.goalLogFov = this.logFov;\n this.fovDamper = new Damper();\n // Pointer state\n this.touchMode = null;\n this.pointers = [];\n this.startTime = 0;\n this.startPointerPosition = { clientX: 0, clientY: 0 };\n this.lastSeparation = 0;\n this.touchDecided = false;\n this.onContext = (event) => {\n if (this.enablePan) {\n event.preventDefault();\n }\n else {\n for (const pointer of this.pointers) {\n // Required because of a common browser bug where the context menu never\n // fires a pointercancel event.\n this.onPointerUp(new PointerEvent('pointercancel', Object.assign(Object.assign({}, this.startPointerPosition), { pointerId: pointer.id })));\n }\n }\n };\n this.touchModeZoom = (dx, dy) => {\n if (!this._disableZoom) {\n const touchDistance = this.twoTouchDistance(this.pointers[0], this.pointers[1]);\n const deltaZoom = ZOOM_SENSITIVITY * this.zoomSensitivity *\n (this.lastSeparation - touchDistance) * 50 / this.scene.height;\n this.lastSeparation = touchDistance;\n this.userAdjustOrbit(0, 0, deltaZoom);\n }\n if (this.panPerPixel > 0) {\n this.movePan(dx, dy);\n }\n };\n // We implement our own version of the browser's CSS touch-action, enforced by\n // this function, because the iOS implementation of pan-y is bad and doesn't\n // match Android. Specifically, even if a touch gesture begins by panning X,\n // iOS will switch to scrolling as soon as the gesture moves in the Y, rather\n // than staying in the same mode until the end of the gesture.\n this.disableScroll = (event) => {\n event.preventDefault();\n };\n this.touchModeRotate = (dx, dy) => {\n const { touchAction } = this._options;\n if (!this.touchDecided && touchAction !== 'none') {\n this.touchDecided = true;\n const dxMag = Math.abs(dx);\n const dyMag = Math.abs(dy);\n // If motion is mostly vertical, assume scrolling is the intent.\n if (this.changeSource === ChangeSource.USER_INTERACTION &&\n ((touchAction === 'pan-y' && dyMag > dxMag) ||\n (touchAction === 'pan-x' && dxMag > dyMag))) {\n this.touchMode = null;\n return;\n }\n else {\n this.element.addEventListener('touchmove', this.disableScroll, { passive: false });\n }\n }\n this.handleSinglePointerMove(dx, dy);\n };\n this.onPointerDown = (event) => {\n if (this.pointers.length > 2) {\n return;\n }\n const { element } = this;\n if (this.pointers.length === 0) {\n element.addEventListener('pointermove', this.onPointerMove);\n element.addEventListener('pointerup', this.onPointerUp);\n this.touchMode = null;\n this.touchDecided = false;\n this.startPointerPosition.clientX = event.clientX;\n this.startPointerPosition.clientY = event.clientY;\n this.startTime = performance.now();\n }\n try {\n element.setPointerCapture(event.pointerId);\n }\n catch (_a) {\n }\n this.pointers.push({ clientX: event.clientX, clientY: event.clientY, id: event.pointerId });\n this.isUserPointing = false;\n if (event.pointerType === 'touch') {\n this.changeSource = event.altKey ? // set by interact() in controls.ts\n ChangeSource.AUTOMATIC :\n ChangeSource.USER_INTERACTION;\n this.onTouchChange(event);\n }\n else {\n this.changeSource = ChangeSource.USER_INTERACTION;\n this.onMouseDown(event);\n }\n if (this.changeSource === ChangeSource.USER_INTERACTION) {\n this.dispatchEvent({ type: 'user-interaction' });\n }\n };\n this.onPointerMove = (event) => {\n const pointer = this.pointers.find((pointer) => pointer.id === event.pointerId);\n if (pointer == null) {\n return;\n }\n // In case no one gave us a pointerup or pointercancel event.\n if (event.pointerType === 'mouse' && event.buttons === 0) {\n this.onPointerUp(event);\n return;\n }\n const numTouches = this.pointers.length;\n const dx = (event.clientX - pointer.clientX) / numTouches;\n const dy = (event.clientY - pointer.clientY) / numTouches;\n if (dx === 0 && dy === 0) {\n return;\n }\n pointer.clientX = event.clientX;\n pointer.clientY = event.clientY;\n if (event.pointerType === 'touch') {\n this.changeSource = event.altKey ? // set by interact() in controls.ts\n ChangeSource.AUTOMATIC :\n ChangeSource.USER_INTERACTION;\n if (this.touchMode !== null) {\n this.touchMode(dx, dy);\n }\n }\n else {\n this.changeSource = ChangeSource.USER_INTERACTION;\n if (this.panPerPixel > 0) {\n this.movePan(dx, dy);\n }\n else {\n this.handleSinglePointerMove(dx, dy);\n }\n }\n };\n this.onPointerUp = (event) => {\n const { element } = this;\n const index = this.pointers.findIndex((pointer) => pointer.id === event.pointerId);\n if (index !== -1) {\n this.pointers.splice(index, 1);\n }\n // altKey indicates an interaction prompt; don't reset radius in this case\n // as it will cause the camera to drift.\n if (this.panPerPixel > 0 && !event.altKey) {\n this.resetRadius();\n }\n if (this.pointers.length === 0) {\n element.removeEventListener('pointermove', this.onPointerMove);\n element.removeEventListener('pointerup', this.onPointerUp);\n element.removeEventListener('touchmove', this.disableScroll);\n if (this.enablePan && this.enableTap) {\n this.recenter(event);\n }\n }\n else if (this.touchMode !== null) {\n this.onTouchChange(event);\n }\n this.scene.element[$panElement].style.opacity = 0;\n element.style.cursor = 'grab';\n this.panPerPixel = 0;\n if (this.isUserPointing) {\n this.dispatchEvent({ type: 'pointer-change-end' });\n }\n };\n this.onWheel = (event) => {\n this.changeSource = ChangeSource.USER_INTERACTION;\n const deltaZoom = event.deltaY *\n (event.deltaMode == 1 ? 18 : 1) * ZOOM_SENSITIVITY *\n this.zoomSensitivity / 30;\n this.userAdjustOrbit(0, 0, deltaZoom);\n event.preventDefault();\n this.dispatchEvent({ type: 'user-interaction' });\n };\n this.onKeyDown = (event) => {\n // We track if the key is actually one we respond to, so as not to\n // accidentally clobber unrelated key inputs when the has\n // focus.\n const { changeSource } = this;\n this.changeSource = ChangeSource.USER_INTERACTION;\n const relevantKey = (event.shiftKey && this.enablePan) ?\n this.panKeyCodeHandler(event) :\n this.orbitZoomKeyCodeHandler(event);\n if (relevantKey) {\n event.preventDefault();\n this.dispatchEvent({ type: 'user-interaction' });\n }\n else {\n this.changeSource = changeSource;\n }\n };\n this._options = Object.assign({}, DEFAULT_OPTIONS);\n this.setOrbit(0, Math.PI / 2, 1);\n this.setFieldOfView(100);\n this.jumpToGoal();\n }\n get interactionEnabled() {\n return this._interactionEnabled;\n }\n enableInteraction() {\n if (this._interactionEnabled === false) {\n const { element } = this;\n element.addEventListener('pointerdown', this.onPointerDown);\n element.addEventListener('pointercancel', this.onPointerUp);\n if (!this._disableZoom) {\n element.addEventListener('wheel', this.onWheel);\n }\n element.addEventListener('keydown', this.onKeyDown);\n // This little beauty is to work around a WebKit bug that otherwise makes\n // touch events randomly not cancelable.\n element.addEventListener('touchmove', () => { }, { passive: false });\n element.addEventListener('contextmenu', this.onContext);\n this.element.style.cursor = 'grab';\n this._interactionEnabled = true;\n this.updateTouchActionStyle();\n }\n }\n disableInteraction() {\n if (this._interactionEnabled === true) {\n const { element } = this;\n element.removeEventListener('pointerdown', this.onPointerDown);\n element.removeEventListener('pointermove', this.onPointerMove);\n element.removeEventListener('pointerup', this.onPointerUp);\n element.removeEventListener('pointercancel', this.onPointerUp);\n element.removeEventListener('wheel', this.onWheel);\n element.removeEventListener('keydown', this.onKeyDown);\n element.removeEventListener('contextmenu', this.onContext);\n element.style.cursor = '';\n this.touchMode = null;\n this._interactionEnabled = false;\n this.updateTouchActionStyle();\n }\n }\n /**\n * The options that are currently configured for the controls instance.\n */\n get options() {\n return this._options;\n }\n set disableZoom(disable) {\n if (this._disableZoom != disable) {\n this._disableZoom = disable;\n if (disable === true) {\n this.element.removeEventListener('wheel', this.onWheel);\n }\n else {\n this.element.addEventListener('wheel', this.onWheel);\n }\n this.updateTouchActionStyle();\n }\n }\n /**\n * Copy the spherical values that represent the current camera orbital\n * position relative to the configured target into a provided Spherical\n * instance. If no Spherical is provided, a new Spherical will be allocated\n * to copy the values into. The Spherical that values are copied into is\n * returned.\n */\n getCameraSpherical(target = new Spherical()) {\n return target.copy(this.spherical);\n }\n /**\n * Returns the camera's current vertical field of view in degrees.\n */\n getFieldOfView() {\n return this.camera.fov;\n }\n /**\n * Configure the _options of the controls. Configured _options will be\n * merged with whatever _options have already been configured for this\n * controls instance.\n */\n applyOptions(_options) {\n Object.assign(this._options, _options);\n // Re-evaluates clamping based on potentially new values for min/max\n // polar, azimuth and radius:\n this.setOrbit();\n this.setFieldOfView(Math.exp(this.goalLogFov));\n }\n /**\n * Sets the near and far planes of the camera.\n */\n updateNearFar(nearPlane, farPlane) {\n this.camera.far = farPlane === 0 ? 2 : farPlane;\n this.camera.near = Math.max(nearPlane, this.camera.far / 1000);\n this.camera.updateProjectionMatrix();\n }\n /**\n * Sets the aspect ratio of the camera\n */\n updateAspect(aspect) {\n this.camera.aspect = aspect;\n this.camera.updateProjectionMatrix();\n }\n /**\n * Set the absolute orbital goal of the camera. The change will be\n * applied over a number of frames depending on configured acceleration and\n * dampening _options.\n *\n * Returns true if invoking the method will result in the camera changing\n * position and/or rotation, otherwise false.\n */\n setOrbit(goalTheta = this.goalSpherical.theta, goalPhi = this.goalSpherical.phi, goalRadius = this.goalSpherical.radius) {\n const { minimumAzimuthalAngle, maximumAzimuthalAngle, minimumPolarAngle, maximumPolarAngle, minimumRadius, maximumRadius } = this._options;\n const { theta, phi, radius } = this.goalSpherical;\n const nextTheta = clamp(goalTheta, minimumAzimuthalAngle, maximumAzimuthalAngle);\n if (!isFinite(minimumAzimuthalAngle) &&\n !isFinite(maximumAzimuthalAngle)) {\n this.spherical.theta =\n this.wrapAngle(this.spherical.theta - nextTheta) + nextTheta;\n }\n const nextPhi = clamp(goalPhi, minimumPolarAngle, maximumPolarAngle);\n const nextRadius = clamp(goalRadius, minimumRadius, maximumRadius);\n if (nextTheta === theta && nextPhi === phi && nextRadius === radius) {\n return false;\n }\n if (!isFinite(nextTheta) || !isFinite(nextPhi) || !isFinite(nextRadius)) {\n return false;\n }\n this.goalSpherical.theta = nextTheta;\n this.goalSpherical.phi = nextPhi;\n this.goalSpherical.radius = nextRadius;\n this.goalSpherical.makeSafe();\n return true;\n }\n /**\n * Subset of setOrbit() above, which only sets the camera's radius.\n */\n setRadius(radius) {\n this.goalSpherical.radius = radius;\n this.setOrbit();\n }\n /**\n * Sets the goal field of view for the camera\n */\n setFieldOfView(fov) {\n const { minimumFieldOfView, maximumFieldOfView } = this._options;\n fov = clamp(fov, minimumFieldOfView, maximumFieldOfView);\n this.goalLogFov = Math.log(fov);\n }\n /**\n * Sets the smoothing decay time.\n */\n setDamperDecayTime(decayMilliseconds) {\n this.thetaDamper.setDecayTime(decayMilliseconds);\n this.phiDamper.setDecayTime(decayMilliseconds);\n this.radiusDamper.setDecayTime(decayMilliseconds);\n this.fovDamper.setDecayTime(decayMilliseconds);\n }\n /**\n * Adjust the orbital position of the camera relative to its current orbital\n * position. Does not let the theta goal get more than pi ahead of the current\n * theta, which ensures interpolation continues in the direction of the delta.\n * The deltaZoom parameter adjusts both the field of view and the orbit radius\n * such that they progress across their allowed ranges in sync.\n */\n adjustOrbit(deltaTheta, deltaPhi, deltaZoom) {\n const { theta, phi, radius } = this.goalSpherical;\n const { minimumRadius, maximumRadius, minimumFieldOfView, maximumFieldOfView } = this._options;\n const dTheta = this.spherical.theta - theta;\n const dThetaLimit = Math.PI - 0.001;\n const goalTheta = theta - clamp(deltaTheta, -dThetaLimit - dTheta, dThetaLimit - dTheta);\n const goalPhi = phi - deltaPhi;\n const deltaRatio = deltaZoom === 0 ?\n 0 :\n ((deltaZoom > 0 ? maximumRadius : minimumRadius) - radius) /\n (Math.log(deltaZoom > 0 ? maximumFieldOfView : minimumFieldOfView) -\n this.goalLogFov);\n const goalRadius = radius +\n deltaZoom *\n (isFinite(deltaRatio) ? deltaRatio :\n (maximumRadius - minimumRadius) * 2);\n this.setOrbit(goalTheta, goalPhi, goalRadius);\n if (deltaZoom !== 0) {\n const goalLogFov = this.goalLogFov + deltaZoom;\n this.setFieldOfView(Math.exp(goalLogFov));\n }\n }\n /**\n * Move the camera instantly instead of accelerating toward the goal\n * parameters.\n */\n jumpToGoal() {\n this.update(0, SETTLING_TIME);\n }\n /**\n * Update controls. In most cases, this will result in the camera\n * interpolating its position and rotation until it lines up with the\n * designated goal orbital position. Returns false if the camera did not move.\n *\n * Time and delta are measured in milliseconds.\n */\n update(_time, delta) {\n if (this.isStationary()) {\n return false;\n }\n const { maximumPolarAngle, maximumRadius } = this._options;\n const dTheta = this.spherical.theta - this.goalSpherical.theta;\n if (Math.abs(dTheta) > Math.PI &&\n !isFinite(this._options.minimumAzimuthalAngle) &&\n !isFinite(this._options.maximumAzimuthalAngle)) {\n this.spherical.theta -= Math.sign(dTheta) * 2 * Math.PI;\n }\n this.spherical.theta = this.thetaDamper.update(this.spherical.theta, this.goalSpherical.theta, delta, Math.PI);\n this.spherical.phi = this.phiDamper.update(this.spherical.phi, this.goalSpherical.phi, delta, maximumPolarAngle);\n this.spherical.radius = this.radiusDamper.update(this.spherical.radius, this.goalSpherical.radius, delta, maximumRadius);\n this.logFov = this.fovDamper.update(this.logFov, this.goalLogFov, delta, 1);\n this.moveCamera();\n return true;\n }\n updateTouchActionStyle() {\n const { style } = this.element;\n if (this._interactionEnabled) {\n const { touchAction } = this._options;\n if (this._disableZoom && touchAction !== 'none') {\n style.touchAction = 'manipulation';\n }\n else {\n style.touchAction = touchAction;\n }\n }\n else {\n style.touchAction = '';\n }\n }\n isStationary() {\n return this.goalSpherical.theta === this.spherical.theta &&\n this.goalSpherical.phi === this.spherical.phi &&\n this.goalSpherical.radius === this.spherical.radius &&\n this.goalLogFov === this.logFov;\n }\n moveCamera() {\n // Derive the new camera position from the updated spherical:\n this.spherical.makeSafe();\n this.camera.position.setFromSpherical(this.spherical);\n this.camera.setRotationFromEuler(new Euler(this.spherical.phi - Math.PI / 2, this.spherical.theta, 0, 'YXZ'));\n if (this.camera.fov !== Math.exp(this.logFov)) {\n this.camera.fov = Math.exp(this.logFov);\n this.camera.updateProjectionMatrix();\n }\n }\n userAdjustOrbit(deltaTheta, deltaPhi, deltaZoom) {\n this.adjustOrbit(deltaTheta * this.orbitSensitivity * this.inputSensitivity, deltaPhi * this.orbitSensitivity * this.inputSensitivity, deltaZoom * this.inputSensitivity);\n }\n // Wraps to between -pi and pi\n wrapAngle(radians) {\n const normalized = (radians + Math.PI) / (2 * Math.PI);\n const wrapped = normalized - Math.floor(normalized);\n return wrapped * 2 * Math.PI - Math.PI;\n }\n pixelLengthToSphericalAngle(pixelLength) {\n return 2 * Math.PI * pixelLength / this.scene.height;\n }\n twoTouchDistance(touchOne, touchTwo) {\n const { clientX: xOne, clientY: yOne } = touchOne;\n const { clientX: xTwo, clientY: yTwo } = touchTwo;\n const xDelta = xTwo - xOne;\n const yDelta = yTwo - yOne;\n return Math.sqrt(xDelta * xDelta + yDelta * yDelta);\n }\n handleSinglePointerMove(dx, dy) {\n const deltaTheta = this.pixelLengthToSphericalAngle(dx);\n const deltaPhi = this.pixelLengthToSphericalAngle(dy);\n if (this.isUserPointing === false) {\n this.isUserPointing = true;\n this.dispatchEvent({ type: 'pointer-change-start' });\n }\n this.userAdjustOrbit(deltaTheta, deltaPhi, 0);\n }\n initializePan() {\n const { theta, phi } = this.spherical;\n const psi = theta - this.scene.yaw;\n this.panPerPixel =\n PAN_SENSITIVITY * this.panSensitivity / this.scene.height;\n this.panProjection.set(-Math.cos(psi), -Math.cos(phi) * Math.sin(psi), 0, 0, Math.sin(phi), 0, Math.sin(psi), -Math.cos(phi) * Math.cos(psi), 0);\n }\n movePan(dx, dy) {\n const { scene } = this;\n const dxy = vector3.set(dx, dy, 0).multiplyScalar(this.inputSensitivity);\n const metersPerPixel = this.spherical.radius * Math.exp(this.logFov) * this.panPerPixel;\n dxy.multiplyScalar(metersPerPixel);\n const target = scene.getTarget();\n target.add(dxy.applyMatrix3(this.panProjection));\n scene.boundingSphere.clampPoint(target, target);\n scene.setTarget(target.x, target.y, target.z);\n }\n recenter(pointer) {\n if (performance.now() > this.startTime + TAP_MS ||\n Math.abs(pointer.clientX - this.startPointerPosition.clientX) >\n TAP_DISTANCE ||\n Math.abs(pointer.clientY - this.startPointerPosition.clientY) >\n TAP_DISTANCE) {\n return;\n }\n const { scene } = this;\n const hit = scene.positionAndNormalFromPoint(scene.getNDC(pointer.clientX, pointer.clientY));\n if (hit == null) {\n const { cameraTarget } = scene.element;\n scene.element.cameraTarget = '';\n scene.element.cameraTarget = cameraTarget;\n // Zoom all the way out.\n this.userAdjustOrbit(0, 0, 1);\n }\n else {\n scene.target.worldToLocal(hit.position);\n scene.setTarget(hit.position.x, hit.position.y, hit.position.z);\n }\n }\n resetRadius() {\n const { scene } = this;\n const hit = scene.positionAndNormalFromPoint(vector2.set(0, 0));\n if (hit == null) {\n return;\n }\n scene.target.worldToLocal(hit.position);\n const goalTarget = scene.getTarget();\n const { theta, phi } = this.spherical;\n // Set target to surface hit point, except the target is still settling,\n // so offset the goal accordingly so the transition is smooth even though\n // this will drift the target slightly away from the hit point.\n const psi = theta - scene.yaw;\n const n = vector3.set(Math.sin(phi) * Math.sin(psi), Math.cos(phi), Math.sin(phi) * Math.cos(psi));\n const dr = n.dot(hit.position.sub(goalTarget));\n goalTarget.add(n.multiplyScalar(dr));\n scene.setTarget(goalTarget.x, goalTarget.y, goalTarget.z);\n // Change the camera radius to match the change in target so that the\n // camera itself does not move, unless it hits a radius bound.\n this.setOrbit(undefined, undefined, this.goalSpherical.radius - dr);\n }\n onTouchChange(event) {\n if (this.pointers.length === 1) {\n this.touchMode = this.touchModeRotate;\n }\n else {\n if (this._disableZoom) {\n this.touchMode = null;\n this.element.removeEventListener('touchmove', this.disableScroll);\n return;\n }\n this.touchMode = (this.touchDecided && this.touchMode === null) ?\n null :\n this.touchModeZoom;\n this.touchDecided = true;\n this.element.addEventListener('touchmove', this.disableScroll, { passive: false });\n this.lastSeparation =\n this.twoTouchDistance(this.pointers[0], this.pointers[1]);\n if (this.enablePan && this.touchMode != null) {\n this.initializePan();\n if (!event.altKey) { // user interaction, not prompt\n this.scene.element[$panElement].style.opacity = 1;\n }\n }\n }\n }\n onMouseDown(event) {\n this.panPerPixel = 0;\n if (this.enablePan &&\n (event.button === 2 || event.ctrlKey || event.metaKey ||\n event.shiftKey)) {\n this.initializePan();\n this.scene.element[$panElement].style.opacity = 1;\n }\n this.element.style.cursor = 'grabbing';\n }\n /**\n * Handles the orbit and Zoom key presses\n * Uses constants for the increment.\n * @param event The keyboard event for the .key value\n * @returns boolean to indicate if the key event has been handled\n */\n orbitZoomKeyCodeHandler(event) {\n let relevantKey = true;\n switch (event.key) {\n case 'PageUp':\n this.userAdjustOrbit(0, 0, ZOOM_SENSITIVITY * this.zoomSensitivity);\n break;\n case 'PageDown':\n this.userAdjustOrbit(0, 0, -1 * ZOOM_SENSITIVITY * this.zoomSensitivity);\n break;\n case 'ArrowUp':\n this.userAdjustOrbit(0, -KEYBOARD_ORBIT_INCREMENT, 0);\n break;\n case 'ArrowDown':\n this.userAdjustOrbit(0, KEYBOARD_ORBIT_INCREMENT, 0);\n break;\n case 'ArrowLeft':\n this.userAdjustOrbit(-KEYBOARD_ORBIT_INCREMENT, 0, 0);\n break;\n case 'ArrowRight':\n this.userAdjustOrbit(KEYBOARD_ORBIT_INCREMENT, 0, 0);\n break;\n default:\n relevantKey = false;\n break;\n }\n return relevantKey;\n }\n /**\n * Handles the Pan key presses\n * Uses constants for the increment.\n * @param event The keyboard event for the .key value\n * @returns boolean to indicate if the key event has been handled\n */\n panKeyCodeHandler(event) {\n this.initializePan();\n let relevantKey = true;\n switch (event.key) {\n case 'ArrowUp':\n this.movePan(0, -1 * PAN_KEY_INCREMENT); // This is the negative one so that the\n // model appears to move as the arrow\n // direction rather than the view moving\n break;\n case 'ArrowDown':\n this.movePan(0, PAN_KEY_INCREMENT);\n break;\n case 'ArrowLeft':\n this.movePan(-1 * PAN_KEY_INCREMENT, 0);\n break;\n case 'ArrowRight':\n this.movePan(PAN_KEY_INCREMENT, 0);\n break;\n default:\n relevantKey = false;\n break;\n }\n return relevantKey;\n }\n}\n//# sourceMappingURL=SmoothControls.js.map","import { CanvasTexture, Mesh, Object3D, Shape, ShapeGeometry, LinearFilter, MeshBasicMaterial, PlaneGeometry, Vector3 } from 'three';\nimport { Damper } from './Damper.js';\n// SVG strings for the icons are defined here to avoid io and better performance for xr.\nconst CLOSE_ICON_SVG = `\n \n`;\nconst VIEW_REAL_SIZE_ICON_SVG = `\n \n`;\nconst REPLAY_ICON_SVG = `\n \n \n \n \n \n \n \n \n`;\n// Panel configuration\nconst PANEL_CONFIG = {\n width: 0.16,\n height: 0.07,\n cornerRadius: 0.03,\n opacity: 1,\n color: 0x000000,\n // Distance-based scaling configuration\n minDistance: 0.5, // Minimum distance for scaling (meters)\n maxDistance: 10.0, // Maximum distance for scaling (meters)\n baseScale: 1.0, // Base scale factor\n distanceScaleFactor: 0.3 // How much to scale per meter of distance\n};\n// Button configuration\nconst BUTTON_CONFIG = {\n size: 0.05, // Fixed size for all buttons\n zOffset: 0.01, // Distance from panel surface\n spacing: 0.07 // Space between button centers\n};\n// Icon configuration\nconst ICON_CONFIG = {\n canvasSize: 128,\n filter: LinearFilter\n};\nexport class XRMenuPanel extends Object3D {\n constructor() {\n super();\n this.isActualSize = false; // Start with normalized size\n // Pre-render all icons\n this.preRenderIcons();\n this.createPanel();\n this.createButtons();\n this.opacityDamper = new Damper();\n this.goalOpacity = PANEL_CONFIG.opacity;\n }\n createPanel() {\n const panelShape = this.createPanelShape();\n const geometry = new ShapeGeometry(panelShape);\n const material = new MeshBasicMaterial({\n color: PANEL_CONFIG.color,\n opacity: PANEL_CONFIG.opacity,\n transparent: true\n });\n this.panelMesh = new Mesh(geometry, material);\n this.panelMesh.name = 'MenuPanel';\n this.add(this.panelMesh);\n }\n createButtons() {\n // Create exit button\n this.exitButton = this.createButton('close');\n this.exitButton.name = 'ExitButton';\n this.exitButton.position.set(BUTTON_CONFIG.spacing / 2, 0, BUTTON_CONFIG.zOffset);\n this.add(this.exitButton);\n // Create toggle button\n this.toggleButton = this.createButton('view-real-size');\n this.toggleButton.name = 'ToggleButton';\n this.toggleButton.position.set(-BUTTON_CONFIG.spacing / 2, 0, BUTTON_CONFIG.zOffset);\n this.add(this.toggleButton);\n }\n createPanelShape() {\n const shape = new Shape();\n const { width: w, height: h, cornerRadius: r } = PANEL_CONFIG;\n // Create rounded rectangle path\n shape.moveTo(-w / 2 + r, -h / 2);\n shape.lineTo(w / 2 - r, -h / 2);\n shape.quadraticCurveTo(w / 2, -h / 2, w / 2, -h / 2 + r);\n shape.lineTo(w / 2, h / 2 - r);\n shape.quadraticCurveTo(w / 2, h / 2, w / 2 - r, h / 2);\n shape.lineTo(-w / 2 + r, h / 2);\n shape.quadraticCurveTo(-w / 2, h / 2, -w / 2, h / 2 - r);\n shape.lineTo(-w / 2, -h / 2 + r);\n shape.quadraticCurveTo(-w / 2, -h / 2, -w / 2 + r, -h / 2);\n return shape;\n }\n preRenderIcons() {\n const iconSvgs = [\n { key: 'close', svg: CLOSE_ICON_SVG },\n { key: 'view-real-size', svg: VIEW_REAL_SIZE_ICON_SVG },\n { key: 'replay', svg: REPLAY_ICON_SVG }\n ];\n iconSvgs.forEach(({ key, svg }) => {\n if (!XRMenuPanel.iconTextures.has(key)) {\n this.createTextureFromSvg(svg, key);\n }\n });\n }\n createTextureFromSvg(svgContent, key) {\n const canvas = document.createElement('canvas');\n canvas.width = ICON_CONFIG.canvasSize;\n canvas.height = ICON_CONFIG.canvasSize;\n const ctx = canvas.getContext('2d');\n // Create an image from SVG content\n const img = new Image();\n const svgBlob = new Blob([svgContent], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(svgBlob);\n img.onload = () => {\n ctx.drawImage(img, 0, 0, ICON_CONFIG.canvasSize, ICON_CONFIG.canvasSize);\n const texture = new CanvasTexture(canvas);\n texture.needsUpdate = true;\n texture.minFilter = ICON_CONFIG.filter;\n XRMenuPanel.iconTextures.set(key, texture);\n URL.revokeObjectURL(url);\n };\n img.src = url;\n }\n createButton(iconKey) {\n // Create a placeholder mesh\n const material = new MeshBasicMaterial({ transparent: true });\n const geometry = new PlaneGeometry(BUTTON_CONFIG.size, BUTTON_CONFIG.size);\n const mesh = new Mesh(geometry, material);\n // Try to get cached texture, or create a fallback\n const cachedTexture = XRMenuPanel.iconTextures.get(iconKey);\n if (cachedTexture) {\n mesh.material.map = cachedTexture;\n mesh.material.needsUpdate = true;\n }\n else {\n // RACE CONDITION FIX: Texture creation is async (img.onload), but button creation is sync\n // This fallback handles the case where buttons are created before textures finish loading\n this.createTextureFromSvg(iconKey === 'close' ? CLOSE_ICON_SVG :\n iconKey === 'view-real-size' ? VIEW_REAL_SIZE_ICON_SVG :\n REPLAY_ICON_SVG, iconKey);\n // Polling mechanism: Wait for async texture creation to complete\n // This prevents white squares from appearing on first load\n const checkTexture = () => {\n const texture = XRMenuPanel.iconTextures.get(iconKey);\n if (texture) {\n // Texture is ready - apply it to the mesh\n mesh.material.map = texture;\n mesh.material.needsUpdate = true;\n }\n else {\n // Texture not ready yet - check again in 10ms\n setTimeout(checkTexture, 10);\n }\n };\n checkTexture();\n }\n return mesh;\n }\n exitButtonControllerIntersection(scene, controller) {\n const hitResult = scene.hitFromController(controller, this.exitButton);\n return hitResult;\n }\n scaleModeButtonControllerIntersection(scene, controller) {\n const hitResult = scene.hitFromController(controller, this.toggleButton);\n return hitResult;\n }\n handleScaleToggle(worldSpaceInitialPlacementDone, initialModelScale, minScale, maxScale) {\n if (!worldSpaceInitialPlacementDone) {\n return null;\n }\n this.isActualSize = !this.isActualSize;\n // Toggle between view real size icon and replay icon\n // When isActualSize is true, show replay icon (to reset)\n // When isActualSize is false, show view real size icon (to go to actual size)\n const iconKey = this.isActualSize ? 'replay' : 'view-real-size';\n this.updateScaleModeButtonLabel(iconKey);\n const targetScale = this.isActualSize ? 1.0 : initialModelScale;\n const goalScale = Math.max(minScale, Math.min(maxScale, targetScale));\n return goalScale;\n }\n updateScaleModeButtonLabel(iconKey) {\n const cachedTexture = XRMenuPanel.iconTextures.get(iconKey);\n if (cachedTexture) {\n this.toggleButton.material.map = cachedTexture;\n this.toggleButton.material.needsUpdate = true;\n }\n }\n updatePosition(camera, placementBox) {\n if (!placementBox) {\n return;\n }\n // Get the world position of the placement box\n const placementBoxWorldPos = new Vector3();\n placementBox.getWorldPosition(placementBoxWorldPos);\n // Get the placement box size to calculate dynamic offsets\n const placementBoxSize = placementBox.getSize();\n const placementBoxMinDimension = Math.min(placementBoxSize.x, placementBoxSize.z);\n // Calculate dynamic offsets based on placement box size\n // Base offsets with placement box size scaling\n const baseOffsetUp = -0.2;\n const baseOffsetForward = 0.9;\n const sizeScaleFactor = Math.max(0.5, Math.min(2.0, placementBoxMinDimension / 1.0)); // Scale between 0.5x and 2x\n const offsetUp = baseOffsetUp * sizeScaleFactor;\n const offsetForward = baseOffsetForward * sizeScaleFactor;\n // Get direction from placement box to camera (horizontal only)\n const directionToCamera = new Vector3()\n .copy(camera.position)\n .sub(placementBoxWorldPos);\n directionToCamera.y = 0; // Zero out vertical component\n directionToCamera.normalize();\n // Calculate the final position\n const panelPosition = new Vector3()\n .copy(placementBoxWorldPos)\n .add(new Vector3(0, offsetUp, 0)) // Move up\n .add(directionToCamera.multiplyScalar(offsetForward)); // Move forward\n this.position.copy(panelPosition);\n // Calculate distance-based scaling\n const distanceToCamera = camera.position.distanceTo(panelPosition);\n const clampedDistance = Math.max(PANEL_CONFIG.minDistance, Math.min(PANEL_CONFIG.maxDistance, distanceToCamera));\n const scaleFactor = PANEL_CONFIG.baseScale + (clampedDistance - PANEL_CONFIG.minDistance) * PANEL_CONFIG.distanceScaleFactor;\n // Apply scaling to the entire panel (including buttons)\n this.scale.set(scaleFactor, scaleFactor, scaleFactor);\n // Make the menu panel face the camera\n this.lookAt(camera.position);\n }\n /**\n * Set the box's visibility; it will fade in and out.\n */\n set show(visible) {\n this.goalOpacity = visible ? PANEL_CONFIG.opacity : 0;\n }\n /**\n * Call on each frame with the frame delta to fade the box.\n */\n updateOpacity(delta) {\n const material = this.panelMesh.material;\n const currentOpacity = material.opacity;\n const newOpacity = this.opacityDamper.update(currentOpacity, this.goalOpacity, delta, 1);\n this.traverse((child) => {\n if (child instanceof Mesh) {\n const mat = child.material;\n if (mat.transparent)\n mat.opacity = newOpacity;\n }\n });\n this.visible = newOpacity > 0;\n }\n dispose() {\n var _a;\n this.children.forEach(child => {\n if (child instanceof Mesh) {\n // Dispose geometry first\n if (child.geometry) {\n child.geometry.dispose();\n }\n // Handle material(s)\n // Material can be a single Material or an array of Materials\n const materials = Array.isArray(child.material) ? child.material : [child.material];\n materials.forEach(material => {\n if (material) { // Ensure material exists before proceeding\n // Dispose texture if it exists and is a CanvasTexture\n // We specifically created CanvasTextures for buttons, so check for that type.\n if ('map' in material && material.map instanceof CanvasTexture) { // Check if 'map' property exists and is a CanvasTexture\n material.map.dispose();\n }\n // Dispose material itself\n material.dispose();\n }\n });\n }\n });\n // Remove the panel itself from its parent in the scene graph\n (_a = this.parent) === null || _a === void 0 ? void 0 : _a.remove(this);\n }\n}\n// Cache for pre-rendered textures\nXRMenuPanel.iconTextures = new Map();\n//# sourceMappingURL=XRMenuPanel.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Box3, BufferGeometry, EventDispatcher, Line, Matrix4, PerspectiveCamera, Quaternion, Vector3 } from 'three';\nimport { XREstimatedLight } from 'three/examples/jsm/webxr/XREstimatedLight.js';\nimport { $currentBackground, $currentEnvironmentMap } from '../features/environment.js';\nimport { assertIsArCandidate } from '../utilities.js';\nimport { Damper } from './Damper.js';\nimport { PlacementBox } from './PlacementBox.js';\nimport { ChangeSource } from './SmoothControls.js';\nimport { XRMenuPanel } from './XRMenuPanel.js';\n// number of initial null pose XRFrames allowed before we post not-tracking\nconst INIT_FRAMES = 30;\n// AR shadow is not user-configurable. This is to pave the way for AR lighting\n// estimation, which will be used once available in WebXR.\nconst AR_SHADOW_INTENSITY = 0.8;\nconst ROTATION_RATE = 1.5;\n// Angle down (towards bottom of screen) from camera center ray to use for hit\n// testing against the floor. This makes placement faster and more intuitive\n// assuming the phone is in portrait mode. This seems to be a reasonable\n// assumption for the start of the session and UI will lack landscape mode to\n// encourage upright use.\nconst HIT_ANGLE_DEG = 20;\nconst SCALE_SNAP = 0.2;\n// upward-oriented ray for ceiling detection\nconst CEILING_HIT_ANGLE_DEG = 20;\nconst CEILING_ORIENTATION_THRESHOLD = 15; // degrees\n// For automatic dynamic viewport scaling, don't let the scale drop below this\n// limit.\nconst MIN_VIEWPORT_SCALE = 0.25;\n// Furthest away you can move an object (meters).\nconst MAX_DISTANCE = 10;\n// Damper decay in milliseconds for the headset - screen uses default.\nconst DECAY = 150;\n// Longer controller/hand indicator line (meters).\nconst MAX_LINE_LENGTH = 5;\n// Axis Y in webxr.\nconst AXIS_Y = new Vector3(0, 1, 0);\n// Webxr rotation sensitivity\nconst ROTATION_SENSIVITY = 0.3;\n// World-space AR automatic positioning constants (similar to FrameModel approach in SVXR)\nconst MIN_WORLD_SPACE_DISTANCE = 1.5; // Minimum distance from camera (meters)\nconst VIEW_DROP_DEGREES = 15; // Angle down from camera center for optimal viewing\nconst VIEW_RATIO = 0.3; // Ratio of viewport to use for model sizing\nconst MIN_MODEL_SIZE = 0.01; // Minimum model size to prevent division by zero\nconst PLACEMENT_BOX_EXTRA_PADDING = 0.15; // Extra padding for model-viewer\n// SVXR-like constants for scale limits\nconst MAX_MODEL_SIZE = 70.0;\nconst MODEL_SIZE_EPSILON = 0.001;\nconst FOOTPRINT__INTERSECT_THRESHOLD = 0.2;\nexport const ARStatus = {\n NOT_PRESENTING: 'not-presenting',\n SESSION_STARTED: 'session-started',\n OBJECT_PLACED: 'object-placed',\n FAILED: 'failed'\n};\nexport const ARTracking = {\n TRACKING: 'tracking',\n NOT_TRACKING: 'not-tracking'\n};\nconst vector3 = new Vector3();\nconst quaternion = new Quaternion();\nconst matrix4 = new Matrix4();\nconst hitPosition = new Vector3();\nconst camera = new PerspectiveCamera(45, 1, 0.1, 100);\nconst lineGeometry = new BufferGeometry().setFromPoints([new Vector3(0, 0, 0), new Vector3(0, 0, -1)]);\nexport const XRMode = {\n SCREEN_SPACE: 'screen-space',\n WORLD_SPACE: 'world-space'\n};\nexport class ARRenderer extends EventDispatcher {\n /**\n * Check if world-space mode is active and initial placement is complete\n */\n isWorldSpaceReady() {\n return this.xrMode === XRMode.WORLD_SPACE && this.worldSpaceInitialPlacementDone;\n }\n constructor(renderer) {\n super();\n this.renderer = renderer;\n this.currentSession = null;\n this.placementMode = 'floor';\n this.placementBox = null;\n this.menuPanel = null;\n this.lastTick = null;\n this.turntableRotation = null;\n this.oldShadowIntensity = null;\n this.frame = null;\n this.initialHitSource = null;\n this.transientHitTestSource = null;\n this.inputSource = null;\n this._presentedScene = null;\n this.resolveCleanup = null;\n this.exitWebXRButtonContainer = null;\n this.overlay = null;\n this.xrLight = null;\n this.xrMode = null;\n this.xrController1 = null;\n this.xrController2 = null;\n this.selectedXRController = null;\n this.tracking = true;\n this.frames = 0;\n this.initialized = false;\n this.oldTarget = new Vector3();\n this.placementComplete = false;\n this.isTranslating = false;\n this.isRotating = false;\n this.isTwoHandInteraction = false;\n this.lastDragPosition = new Vector3();\n this.deltaRotation = new Quaternion();\n this.scaleLine = new Line(lineGeometry);\n this.firstRatio = 0;\n this.lastAngle = 0;\n this.goalPosition = new Vector3();\n this.goalYaw = 0;\n this.goalScale = 1;\n this.xDamper = new Damper();\n this.yDamper = new Damper();\n this.zDamper = new Damper();\n this.yawDamper = new Damper();\n this.pitchDamper = new Damper();\n this.rollDamper = new Damper();\n this.scaleDamper = new Damper();\n this.wasTwoFingering = false;\n // Track if initial automatic placement has been done for world-space mode\n this.worldSpaceInitialPlacementDone = false;\n // Scale toggle state for world-space mode\n this.initialModelScale = 1.0;\n this.minScale = 1.0;\n this.maxScale = 1.0;\n this.onExitWebXRButtonContainerClick = () => this.stopPresenting();\n this.onControllerSelectStart = (event) => {\n var _a, _b, _c;\n const scene = this.presentedScene;\n const controller = event.target;\n const menuPanel = this.menuPanel;\n const exitIntersect = this.menuPanel.exitButtonControllerIntersection(scene, controller);\n if (exitIntersect != null) {\n (_a = this.menuPanel) === null || _a === void 0 ? void 0 : _a.dispose();\n this.stopPresenting();\n return;\n }\n const scaleModeIntersect = this.menuPanel.scaleModeButtonControllerIntersection(scene, controller);\n if (scaleModeIntersect != null) {\n const goalScale = this.menuPanel.handleScaleToggle(this.worldSpaceInitialPlacementDone, this.initialModelScale, this.minScale, this.maxScale);\n if (goalScale !== null) {\n this.goalScale = goalScale;\n }\n return;\n }\n if (menuPanel) {\n menuPanel.show = false;\n }\n const intersection = this.placementBox.controllerIntersection(scene, controller);\n if (intersection != null) {\n const bbox = new Box3().setFromObject(scene.pivot);\n const footprintY = bbox.min.y + FOOTPRINT__INTERSECT_THRESHOLD; // Small threshold above base\n // Check if the ray intersection is near the footprint\n const isFootprint = intersection.point.y <= footprintY;\n if (isFootprint) {\n if (this.selectedXRController != null) {\n this.selectedXRController.userData.line.visible = false;\n if (scene.canScale && this.isWorldSpaceReady()) {\n this.isTwoHandInteraction = true;\n this.firstRatio = this.controllerSeparation() / scene.pivot.scale.x;\n this.scaleLine.visible = true;\n }\n }\n else {\n controller.attach(scene.pivot);\n }\n this.selectedXRController = controller;\n scene.setShadowIntensity(0.01);\n }\n else {\n if (controller == this.xrController1) {\n this.xrController1.userData.isSelected = true;\n }\n else if (controller == this.xrController2) {\n this.xrController2.userData.isSelected = true;\n }\n if (((_b = this.xrController1) === null || _b === void 0 ? void 0 : _b.userData.isSelected) && ((_c = this.xrController2) === null || _c === void 0 ? void 0 : _c.userData.isSelected)) {\n if (scene.canScale && this.isWorldSpaceReady()) {\n this.isTwoHandInteraction = true;\n this.firstRatio = this.controllerSeparation() / scene.pivot.scale.x;\n this.scaleLine.visible = true;\n }\n }\n else {\n const otherController = controller === this.xrController1 ? this.xrController2 :\n this.xrController1;\n controller.userData.initialX = controller.position.x;\n otherController.userData.turning = false;\n controller.userData.turning = true;\n controller.userData.line.visible = false;\n }\n }\n }\n };\n this.onControllerSelectEnd = (event) => {\n const controller = event.target;\n controller.userData.turning = false;\n controller.userData.line.visible = true;\n this.isTwoHandInteraction = false;\n this.scaleLine.visible = false;\n if (controller == this.xrController1) {\n this.xrController1.userData.isSelected = false;\n }\n else if (controller == this.xrController2) {\n this.xrController2.userData.isSelected = false;\n }\n if (this.selectedXRController != null &&\n this.selectedXRController != controller) {\n return;\n }\n const scene = this.presentedScene;\n // drop on floor\n scene.attach(scene.pivot);\n this.selectedXRController = null;\n this.goalYaw = Math.atan2(scene.pivot.matrix.elements[8], scene.pivot.matrix.elements[10]);\n this.goalPosition.x = scene.pivot.position.x;\n this.goalPosition.z = scene.pivot.position.z;\n // For world-space mode after initial placement, preserve Y position\n if (this.isWorldSpaceReady()) {\n this.goalPosition.y = scene.pivot.position.y;\n }\n const menuPanel = this.menuPanel;\n menuPanel.show = true;\n };\n this.onUpdateScene = () => {\n if (this.placementBox != null && this.isPresenting) {\n // Update the existing placement box with new model dimensions instead of recreating\n this.placementBox.updateFromModelChanges();\n // Ensure screen space mode is maintained\n this.placementBox.setScreenSpaceMode(this.xrMode === XRMode.SCREEN_SPACE);\n }\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n if (this.menuPanel) {\n this.menuPanel.dispose();\n this.menuPanel = null;\n }\n this.menuPanel = new XRMenuPanel();\n this.presentedScene.add(this.menuPanel);\n this.menuPanel.updatePosition(this.presentedScene.getCamera(), this.placementBox);\n }\n };\n this.onSelectStart = (event) => {\n const hitSource = this.transientHitTestSource;\n if (hitSource == null) {\n return;\n }\n const fingers = this.frame.getHitTestResultsForTransientInput(hitSource);\n const scene = this.presentedScene;\n const box = this.placementBox;\n if (fingers.length === 1) {\n this.inputSource = event.inputSource;\n const { axes } = this.inputSource.gamepad;\n const hitPosition = box.getHit(this.presentedScene, axes[0], axes[1]);\n box.show = true;\n if (hitPosition != null) {\n this.isTranslating = true;\n this.lastDragPosition.copy(hitPosition);\n }\n else if (this.placeOnWall === false) {\n this.isRotating = true;\n this.lastAngle = axes[0] * ROTATION_RATE;\n }\n }\n else if (fingers.length === 2) {\n box.show = true;\n this.isTwoHandInteraction = true;\n const { separation, angle } = this.fingerPolar(fingers);\n this.lastAngle = angle; // Initialize lastAngle, do not update goalYaw\n if (this.firstRatio === 0) {\n this.firstRatio = separation / scene.pivot.scale.x;\n }\n if (scene.canScale) {\n this.setScale(separation);\n }\n return;\n }\n };\n this.onSelectEnd = () => {\n this.isTranslating = false;\n this.isRotating = false;\n this.isTwoHandInteraction = false;\n this.inputSource = null;\n this.goalPosition.y +=\n this.placementBox.offsetHeight * this.presentedScene.scale.x;\n this.placementBox.show = false;\n };\n this.threeRenderer = renderer.threeRenderer;\n this.threeRenderer.xr.enabled = true;\n }\n async resolveARSession() {\n assertIsArCandidate();\n const session = await navigator.xr.requestSession('immersive-ar', {\n requiredFeatures: [],\n optionalFeatures: ['hit-test', 'dom-overlay', 'light-estimation'],\n domOverlay: this.overlay ? { root: this.overlay } : undefined\n });\n this.threeRenderer.xr.setReferenceSpaceType('local');\n await this.threeRenderer.xr.setSession(session);\n this.threeRenderer.xr.cameraAutoUpdate = false;\n return session;\n }\n /**\n * The currently presented scene, if any\n */\n get presentedScene() {\n return this._presentedScene;\n }\n /**\n * Resolves to true if the renderer has detected all the necessary qualities\n * to support presentation in AR.\n */\n async supportsPresentation() {\n try {\n assertIsArCandidate();\n return await navigator.xr.isSessionSupported('immersive-ar');\n }\n catch (error) {\n console.warn('Request to present in WebXR denied:');\n console.warn(error);\n console.warn('Falling back to next ar-mode');\n return false;\n }\n }\n /**\n * Present a scene in AR\n */\n async present(scene, environmentEstimation = false) {\n if (this.isPresenting) {\n console.warn('Cannot present while a model is already presenting');\n }\n let waitForAnimationFrame = new Promise((resolve, _reject) => {\n requestAnimationFrame(() => resolve());\n });\n scene.setHotspotsVisibility(false);\n scene.queueRender();\n // Render a frame to turn off the hotspots\n await waitForAnimationFrame;\n // This sets isPresenting to true\n this._presentedScene = scene;\n this.overlay = scene.element.shadowRoot.querySelector('div.default');\n if (environmentEstimation === true) {\n this.xrLight = new XREstimatedLight(this.threeRenderer);\n this.xrLight.addEventListener('estimationstart', () => {\n if (!this.isPresenting || this.xrLight == null) {\n return;\n }\n const scene = this.presentedScene;\n scene.add(this.xrLight);\n scene.environment = this.xrLight.environment;\n });\n }\n const currentSession = await this.resolveARSession();\n currentSession.addEventListener('end', () => {\n this.postSessionCleanup();\n }, { once: true });\n const exitButton = scene.element.shadowRoot.querySelector('.slot.exit-webxr-ar-button');\n exitButton.classList.add('enabled');\n exitButton.addEventListener('click', this.onExitWebXRButtonContainerClick);\n this.exitWebXRButtonContainer = exitButton;\n const viewerRefSpace = await currentSession.requestReferenceSpace('viewer');\n this.xrMode = currentSession.interactionMode;\n this.tracking = true;\n this.frames = 0;\n this.initialized = false;\n this.turntableRotation = scene.yaw;\n this.goalYaw = scene.yaw;\n this.goalScale = 1;\n scene.setBackground(null);\n this.oldShadowIntensity = scene.shadowIntensity;\n scene.setShadowIntensity(0.01); // invisible, but not changing the shader\n this.oldTarget.copy(scene.getTarget());\n scene.element.addEventListener('load', this.onUpdateScene);\n // Create hit test source for all modes (will be used differently based on mode and state)\n let ray;\n if (!this.placeOnWall && !this.placeOnCeiling) {\n // floor – shoot slightly downward\n const r = HIT_ANGLE_DEG * Math.PI / 180;\n ray = new XRRay(new DOMPoint(0, 0, 0), { x: 0, y: -Math.sin(r), z: -Math.cos(r) });\n }\n else if (this.placeOnWall) {\n ray = undefined;\n }\n else { // ceiling – shoot upward\n const r = CEILING_HIT_ANGLE_DEG * Math.PI / 180;\n ray = new XRRay(new DOMPoint(0, 0, 0), { x: 0, y: Math.sin(r), z: -Math.cos(r) });\n }\n currentSession\n .requestHitTestSource({ space: viewerRefSpace, offsetRay: ray }).then(hitTestSource => {\n this.initialHitSource = hitTestSource;\n });\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n this.setupXRControllers();\n this.xDamper.setDecayTime(DECAY);\n this.yDamper.setDecayTime(DECAY);\n this.zDamper.setDecayTime(DECAY);\n this.yawDamper.setDecayTime(DECAY);\n this.pitchDamper.setDecayTime(DECAY);\n this.rollDamper.setDecayTime(DECAY);\n this.scaleDamper.setDecayTime(DECAY);\n }\n this.currentSession = currentSession;\n this.placementBox = new PlacementBox(scene, this.placeOnWall ? 'back'\n : this.placeOnCeiling ? 'top' : 'bottom');\n // Set screen space mode for proper positioning\n if (this.placementBox) {\n this.placementBox.setScreenSpaceMode(this.xrMode === XRMode.SCREEN_SPACE);\n }\n this.placementComplete = false;\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n this.menuPanel = new XRMenuPanel();\n scene.add(this.menuPanel);\n this.menuPanel.updatePosition(scene.getCamera(), this.placementBox); // Position the menu panel\n }\n this.lastTick = performance.now();\n this.dispatchEvent({ type: 'status', status: ARStatus.SESSION_STARTED });\n }\n setupXRControllerLine(xrController) {\n if (!xrController.userData.line) {\n const line = new Line(lineGeometry);\n line.name = 'line';\n line.scale.z = MAX_LINE_LENGTH;\n xrController.userData.turning = false;\n xrController.userData.line = line;\n xrController.add(line);\n }\n }\n setupController(controller) {\n this.setupXRControllerLine(controller);\n controller.addEventListener('selectstart', this.onControllerSelectStart);\n controller.addEventListener('selectend', this.onControllerSelectEnd);\n }\n setupXRControllers() {\n this.xrController1 = this.threeRenderer.xr.getController(0);\n this.xrController2 = this.threeRenderer.xr.getController(1);\n this.setupController(this.xrController1);\n this.setupController(this.xrController2);\n this.scaleLine.name = 'scale line';\n this.scaleLine.visible = false;\n this.xrController1.add(this.scaleLine);\n // Add controllers to the scene\n const scene = this.presentedScene;\n scene.add(this.xrController1);\n scene.add(this.xrController2);\n }\n hover(xrController) {\n // Do not highlight in mobile-ar\n if (this.xrMode === XRMode.SCREEN_SPACE ||\n this.selectedXRController == xrController) {\n return false;\n }\n const scene = this.presentedScene;\n const intersection = this.placementBox.controllerIntersection(scene, xrController);\n xrController.userData.line.scale.z =\n intersection == null ? MAX_LINE_LENGTH : intersection.distance;\n return intersection != null;\n }\n controllerSeparation() {\n return this.xrController1.position.distanceTo(this.xrController2.position);\n }\n /**\n * If currently presenting a scene in AR, stops presentation and exits AR.\n */\n async stopPresenting() {\n if (!this.isPresenting) {\n return;\n }\n const cleanupPromise = new Promise((resolve) => {\n this.resolveCleanup = resolve;\n });\n try {\n await this.currentSession.end();\n await cleanupPromise;\n }\n catch (error) {\n console.warn('Error while trying to end WebXR AR session');\n console.warn(error);\n this.postSessionCleanup();\n }\n }\n /**\n * True if a scene is currently in the process of being presented in AR\n */\n get isPresenting() {\n return this.presentedScene != null;\n }\n get target() {\n return this.oldTarget;\n }\n get placeOnCeiling() { return this.placementMode === 'ceiling'; }\n get placeOnWall() { return this.placementMode === 'wall'; }\n updateTarget() {\n const scene = this.presentedScene;\n if (scene != null) {\n const target = scene.getTarget();\n this.oldTarget.copy(target);\n if (this.placeOnWall) {\n target.z = scene.boundingBox.min.z;\n }\n else if (this.placeOnCeiling) {\n target.y = scene.boundingBox.max.y; // Use ceiling height\n }\n else {\n target.y = scene.boundingBox.min.y; // Floor height\n }\n scene.setTarget(target.x, target.y, target.z);\n }\n }\n cleanupXRController(xrController) {\n xrController.userData.turning = false;\n xrController.userData.line.visible = true;\n xrController.removeEventListener('selectstart', this.onControllerSelectStart);\n xrController.removeEventListener('selectend', this.onControllerSelectEnd);\n xrController.removeFromParent();\n }\n postSessionCleanup() {\n const session = this.currentSession;\n if (session != null) {\n session.removeEventListener('selectstart', this.onSelectStart);\n session.removeEventListener('selectend', this.onSelectEnd);\n this.currentSession = null;\n }\n const scene = this.presentedScene;\n this._presentedScene = null;\n if (scene != null) {\n const { element } = scene;\n if (this.xrLight != null) {\n scene.remove(this.xrLight);\n this.xrLight.dispose();\n this.xrLight = null;\n }\n if (this.menuPanel != null) {\n this.menuPanel.dispose();\n this.menuPanel = null;\n }\n scene.add(scene.pivot);\n scene.pivot.quaternion.set(0, 0, 0, 1);\n scene.pivot.position.set(0, 0, 0);\n scene.pivot.scale.set(1, 1, 1);\n scene.setShadowOffset(0);\n const yaw = this.turntableRotation;\n if (yaw != null) {\n scene.yaw = yaw;\n }\n const intensity = this.oldShadowIntensity;\n if (intensity != null) {\n scene.setShadowIntensity(intensity);\n }\n scene.setEnvironmentAndSkybox(element[$currentEnvironmentMap], element[$currentBackground]);\n const point = this.oldTarget;\n scene.setTarget(point.x, point.y, point.z);\n scene.xrCamera = null;\n scene.element.removeEventListener('load', this.onUpdateScene);\n scene.orientHotspots(0);\n const { width, height } = element.getBoundingClientRect();\n scene.setSize(width, height);\n requestAnimationFrame(() => {\n scene.element.dispatchEvent(new CustomEvent('camera-change', { detail: { source: ChangeSource.NONE } }));\n });\n }\n // Force the Renderer to update its size\n this.renderer.height = 0;\n const exitButton = this.exitWebXRButtonContainer;\n if (exitButton != null) {\n exitButton.classList.remove('enabled');\n exitButton.removeEventListener('click', this.onExitWebXRButtonContainerClick);\n this.exitWebXRButtonContainer = null;\n }\n const hitSource = this.transientHitTestSource;\n if (hitSource != null) {\n hitSource.cancel();\n this.transientHitTestSource = null;\n }\n const hitSourceInitial = this.initialHitSource;\n if (hitSourceInitial != null) {\n hitSourceInitial.cancel();\n this.initialHitSource = null;\n }\n if (this.placementBox != null) {\n this.placementBox.dispose();\n this.placementBox = null;\n }\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n if (this.xrController1 != null) {\n this.cleanupXRController(this.xrController1);\n this.xrController1 = null;\n }\n if (this.xrController2 != null) {\n this.cleanupXRController(this.xrController2);\n this.xrController2 = null;\n }\n this.selectedXRController = null;\n this.scaleLine.visible = false;\n }\n this.isTranslating = false;\n this.isRotating = false;\n this.isTwoHandInteraction = false;\n this.lastTick = null;\n this.turntableRotation = null;\n this.oldShadowIntensity = null;\n this.frame = null;\n this.inputSource = null;\n this.overlay = null;\n this.worldSpaceInitialPlacementDone = false;\n if (this.resolveCleanup != null) {\n this.resolveCleanup();\n }\n this.dispatchEvent({ type: 'status', status: ARStatus.NOT_PRESENTING });\n }\n updateView(view) {\n const scene = this.presentedScene;\n const xr = this.threeRenderer.xr;\n xr.updateCamera(camera);\n scene.xrCamera = xr.getCamera();\n const { elements } = scene.getCamera().matrixWorld;\n scene.orientHotspots(Math.atan2(elements[1], elements[5]));\n if (!this.initialized) {\n this.placeInitially();\n this.initialized = true;\n }\n // Use automatic dynamic viewport scaling if supported.\n if (view.requestViewportScale && view.recommendedViewportScale) {\n const scale = view.recommendedViewportScale;\n view.requestViewportScale(Math.max(scale, MIN_VIEWPORT_SCALE));\n }\n const layer = xr.getBaseLayer();\n if (layer != null) {\n const viewport = layer instanceof XRWebGLLayer ?\n layer.getViewport(view) :\n xr.getBinding().getViewSubImage(layer, view).viewport;\n this.threeRenderer.setViewport(viewport.x, viewport.y, viewport.width, viewport.height);\n }\n }\n placeInitially() {\n const scene = this.presentedScene;\n const { pivot, element } = scene;\n const { position } = pivot;\n const xrCamera = scene.getCamera();\n const { width, height } = this.overlay.getBoundingClientRect();\n scene.setSize(width, height);\n xrCamera.projectionMatrixInverse.copy(xrCamera.projectionMatrix).invert();\n const { theta } = element\n .getCameraOrbit();\n // Orient model to match the 3D camera view\n const cameraDirection = xrCamera.getWorldDirection(vector3);\n scene.yaw = Math.atan2(-cameraDirection.x, -cameraDirection.z) - theta;\n this.goalYaw = scene.yaw;\n if (this.placeOnCeiling && !this.isViewPointingUp()) {\n scene.visible = false; // Hide until properly oriented\n scene.setHotspotsVisibility(true); // Still show UI\n // Set up touch interaction for screen-space mode\n if (this.xrMode === XRMode.SCREEN_SPACE) {\n const { session } = this.frame;\n session.addEventListener('selectstart', this.onSelectStart);\n session.addEventListener('selectend', this.onSelectEnd);\n session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' })\n .then(hitTestSource => { this.transientHitTestSource = hitTestSource; });\n }\n return; // Exit early - don't place yet\n }\n // Use different placement logic for world-space vs screen-space\n if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone) {\n // Use automatic optimal placement for world-space AR only on first session\n const { position: optimalPosition, scale: optimalScale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera);\n this.goalPosition.copy(optimalPosition);\n this.goalScale = optimalScale;\n // Store the initial scale for toggle functionality\n this.initialModelScale = optimalScale;\n // Set initial position and scale immediately for world-space\n position.copy(optimalPosition);\n pivot.scale.set(optimalScale, optimalScale, optimalScale);\n // Mark that initial placement is done\n this.worldSpaceInitialPlacementDone = true;\n // Calculate scale limits for world-space mode (SVXR logic)\n this.calculateWorldSpaceScaleLimits(scene);\n // Enable user interaction after initial placement\n this.enableWorldSpaceUserInteraction();\n }\n else if (this.xrMode === XRMode.SCREEN_SPACE) {\n // Use original placement logic for screen-space AR\n const radius = Math.max(1, 2 * scene.boundingSphere.radius);\n position.copy(xrCamera.position)\n .add(cameraDirection.multiplyScalar(radius));\n this.updateTarget();\n const target = scene.getTarget();\n position.add(target).sub(this.oldTarget);\n this.goalPosition.copy(position);\n }\n scene.setHotspotsVisibility(true);\n scene.visible = true; // Model is properly oriented, show it\n if (this.xrMode === XRMode.SCREEN_SPACE) {\n const { session } = this.frame;\n session.addEventListener('selectstart', this.onSelectStart);\n session.addEventListener('selectend', this.onSelectEnd);\n session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' })\n .then(hitTestSource => { this.transientHitTestSource = hitTestSource; });\n }\n }\n checkForDeferredCeilingPlacement() {\n // Check on every frame—both XR modes, only when ceiling is the target and the model is hidden\n if (!this.placeOnCeiling || !this.presentedScene || this.presentedScene.visible)\n return;\n const isWorldSpaceDeferred = this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone;\n const isScreenSpaceDeferred = this.xrMode === XRMode.SCREEN_SPACE;\n if (isWorldSpaceDeferred || isScreenSpaceDeferred) {\n if (this.isViewPointingUp()) {\n this.performDeferredPlacement();\n }\n }\n }\n performDeferredPlacement() {\n const scene = this.presentedScene;\n if (this.xrMode === XRMode.WORLD_SPACE) {\n const xrCamera = scene.getCamera();\n const { position, scale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera);\n this.goalPosition.copy(position);\n this.goalScale = scale;\n this.initialModelScale = scale;\n scene.pivot.position.copy(position);\n scene.pivot.scale.set(scale, scale, scale);\n this.worldSpaceInitialPlacementDone = true;\n this.calculateWorldSpaceScaleLimits(scene);\n this.enableWorldSpaceUserInteraction();\n }\n else { // SCREEN_SPACE\n const xrCamera = scene.getCamera();\n const cameraDirection = xrCamera.getWorldDirection(new Vector3());\n const radius = Math.max(1, 2 * scene.boundingSphere.radius);\n scene.pivot.position.copy(xrCamera.position).add(cameraDirection.multiplyScalar(radius));\n this.updateTarget();\n const target = scene.getTarget();\n scene.pivot.position.add(target).sub(this.oldTarget);\n this.goalPosition.copy(scene.pivot.position);\n // Setup touch interaction if needed\n const { session } = this.frame;\n session.addEventListener('selectstart', this.onSelectStart);\n session.addEventListener('selectend', this.onSelectEnd);\n session.requestHitTestSourceForTransientInput({ profile: 'generic-touchscreen' })\n .then(hitTestSource => { this.transientHitTestSource = hitTestSource; });\n }\n scene.visible = true;\n scene.setHotspotsVisibility(true);\n this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED });\n }\n getTouchLocation() {\n const { axes } = this.inputSource.gamepad;\n let location = this.placementBox.getExpandedHit(this.presentedScene, axes[0], axes[1]);\n if (location != null) {\n vector3.copy(location).sub(this.presentedScene.getCamera().position);\n if (vector3.length() > MAX_DISTANCE)\n return null;\n }\n return location;\n }\n getHitPoint(hitResult) {\n const refSpace = this.threeRenderer.xr.getReferenceSpace();\n const pose = hitResult.getPose(refSpace);\n if (pose == null) {\n return null;\n }\n const hitMatrix = matrix4.fromArray(pose.transform.matrix);\n if (this.placeOnWall === true) {\n // Orient the model to the wall's normal vector.\n this.goalYaw = Math.atan2(hitMatrix.elements[4], hitMatrix.elements[6]);\n }\n // Check that the y-coordinate of the normal is large enough that the normal\n // is pointing up for floor placement; opposite for wall placement.\n const normalY = hitMatrix.elements[5];\n if (this.placeOnWall) {\n // wall: reject if normal points down/up too much\n return normalY < -0.75 ? null : hitPosition.setFromMatrixPosition(hitMatrix);\n }\n if (this.placeOnCeiling) {\n // ceiling: accept only downward-facing planes\n return normalY < -0.5\n ? hitPosition.setFromMatrixPosition(hitMatrix)\n : null;\n }\n // floor: accept only upward-facing planes\n return normalY > 0.75 ? hitPosition.setFromMatrixPosition(hitMatrix) : null;\n }\n /**\n * Hit-test the environment once per frame until a suitable surface is found,\n * then lock the model to that anchor.\n * – Floor: accept upward-facing planes and “drop” the model down.\n * – Wall: accept vertical planes; keep full XYZ.\n * – Ceiling: accept downward-facing planes; keep full XYZ and hide model\n * until a ceiling hit arrives (no premature floor placement).\n */\n moveToAnchor(frame) {\n // Handle deferred initial placement for ceiling mode\n if (this.placeOnCeiling &&\n this.xrMode === XRMode.WORLD_SPACE &&\n !this.worldSpaceInitialPlacementDone &&\n !this.presentedScene.visible) {\n // Check if orientation is now sufficient\n if (!this.isViewPointingUp()) {\n console.log('[ARR/moveToAnchor] Still waiting for proper ceiling orientation');\n return;\n }\n // Orientation is good - complete the deferred world-space placement\n const scene = this.presentedScene;\n const xrCamera = scene.getCamera();\n const { position: optimalPosition, scale: optimalScale } = this.calculateWorldSpaceOptimalPlacement(scene, xrCamera);\n this.goalPosition.copy(optimalPosition);\n this.goalScale = optimalScale;\n this.initialModelScale = optimalScale;\n scene.pivot.position.copy(optimalPosition);\n scene.pivot.scale.set(optimalScale, optimalScale, optimalScale);\n this.worldSpaceInitialPlacementDone = true;\n this.calculateWorldSpaceScaleLimits(scene);\n this.enableWorldSpaceUserInteraction();\n scene.visible = true;\n this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED });\n return;\n }\n // Skip for world-space mode after initial placement (unless ceiling was deferred)\n if (this.xrMode === XRMode.WORLD_SPACE && this.worldSpaceInitialPlacementDone) {\n this.placementBox.show = false;\n this.dispatchEvent({ type: 'status', status: ARStatus.OBJECT_PLACED });\n return;\n }\n }\n isViewPointingUp(thresholdDeg = CEILING_ORIENTATION_THRESHOLD) {\n const cam = this.presentedScene.getCamera();\n // Handle ArrayCamera (common in XR)\n const realCam = cam.isArrayCamera && Array.isArray(cam.cameras)\n ? cam.cameras[0] // Use first sub-camera\n : cam;\n if (!realCam || typeof realCam.updateMatrixWorld !== 'function') {\n return false;\n }\n // Update camera matrix to get current world orientation\n realCam.updateMatrixWorld(true);\n const elements = realCam.matrixWorld.elements;\n // Get forward direction from camera matrix (-Z column)\n const forwardY = -elements[9]; // Y component of forward vector\n const minY = Math.sin(thresholdDeg * Math.PI / 180);\n return forwardY >= minY;\n }\n fingerPolar(fingers) {\n const fingerOne = fingers[0].inputSource.gamepad.axes;\n const fingerTwo = fingers[1].inputSource.gamepad.axes;\n const deltaX = fingerTwo[0] - fingerOne[0];\n const deltaY = fingerTwo[1] - fingerOne[1];\n const angle = Math.atan2(deltaY, deltaX);\n let deltaYaw = this.lastAngle - angle;\n if (deltaYaw > Math.PI) {\n deltaYaw -= 2 * Math.PI;\n }\n else if (deltaYaw < -Math.PI) {\n deltaYaw += 2 * Math.PI;\n }\n return {\n separation: Math.sqrt(deltaX * deltaX + deltaY * deltaY),\n deltaYaw: deltaYaw,\n angle: angle\n };\n }\n setScale(separation) {\n let scale = separation / this.firstRatio;\n scale = (Math.abs(scale - 1) < SCALE_SNAP) ? 1 : scale;\n // Clamp to min/max for world-space mode after initial placement\n if (this.isWorldSpaceReady()) {\n scale = Math.max(this.minScale, Math.min(this.maxScale, scale));\n }\n this.goalScale = scale;\n }\n processInput(frame) {\n const hitSource = this.transientHitTestSource;\n if (hitSource == null) {\n return;\n }\n const fingers = frame.getHitTestResultsForTransientInput(hitSource);\n const scene = this.presentedScene;\n const scale = scene.pivot.scale.x;\n // Robust two-finger gesture handling\n if (fingers.length === 2) {\n if (!this.wasTwoFingering) {\n // New two-finger gesture starting\n const { separation, angle } = this.fingerPolar(fingers);\n this.firstRatio = separation / scale;\n this.lastAngle = angle;\n this.wasTwoFingering = true;\n this.isTwoHandInteraction = true;\n // Do not apply rotation or scale on this frame\n return;\n }\n // Ongoing two-finger gesture\n const { separation, deltaYaw, angle } = this.fingerPolar(fingers);\n this.goalYaw += deltaYaw;\n this.lastAngle = angle;\n if (scene.canScale) {\n this.setScale(separation);\n }\n this.isTwoHandInteraction = true;\n return;\n }\n else {\n if (this.wasTwoFingering) {\n // Two-finger gesture ended\n this.wasTwoFingering = false;\n this.isTwoHandInteraction = false;\n this.firstRatio = 0;\n }\n }\n if (!this.isTranslating && !this.isTwoHandInteraction && !this.isRotating) {\n return;\n }\n // Handle single finger interactions\n if (this.isRotating) {\n const angle = this.inputSource.gamepad.axes[0] * ROTATION_RATE;\n this.goalYaw += angle - this.lastAngle;\n this.lastAngle = angle;\n }\n else if (this.isTranslating) {\n fingers.forEach(finger => {\n if (finger.inputSource !== this.inputSource) {\n return;\n }\n let hit = null;\n if (finger.results.length > 0) {\n hit = this.getHitPoint(finger.results[0]);\n }\n if (hit == null) {\n hit = this.getTouchLocation();\n }\n if (hit == null) {\n return;\n }\n this.goalPosition.sub(this.lastDragPosition);\n // For world-space mode after initial placement, allow full Y-axis control\n if (this.isWorldSpaceReady()) {\n // Use the hit point directly without floor constraints\n console.log('[processInput] Setting goalPosition.y to hit.y:', hit.y);\n this.goalPosition.add(hit);\n }\n else if (this.placeOnWall === false) {\n // Original logic for screen-space or initial world-space placement\n const offset = hit.y - this.lastDragPosition.y;\n // When a lower floor is found, keep the model at the same height, but\n // drop the placement box to the floor. The model falls on select end.\n if (offset < 0) {\n this.placementBox.offsetHeight = offset / scale;\n this.presentedScene.setShadowOffset(offset);\n // Interpolate hit ray up to drag plane\n const cameraPosition = vector3.copy(scene.getCamera().position);\n const alpha = -offset / (cameraPosition.y - hit.y);\n cameraPosition.multiplyScalar(alpha);\n hit.multiplyScalar(1 - alpha).add(cameraPosition);\n }\n this.goalPosition.add(hit);\n }\n else {\n this.goalPosition.add(hit);\n }\n this.lastDragPosition.copy(hit);\n });\n }\n }\n applyXRControllerRotation(controller, pivot) {\n if (!controller.userData.turning) {\n return;\n }\n const angle = (controller.position.x - controller.userData.initialX) * ROTATION_SENSIVITY;\n this.deltaRotation.setFromAxisAngle(AXIS_Y, angle);\n pivot.quaternion.multiplyQuaternions(this.deltaRotation, pivot.quaternion);\n }\n handleScalingInXR(scene, delta) {\n // Allow manual scaling for world-space mode after initial placement\n if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone) {\n return;\n }\n if (this.xrController1 && this.xrController2 && this.isTwoHandInteraction) {\n const dist = this.controllerSeparation();\n this.setScale(dist);\n this.scaleLine.scale.z = -dist;\n this.scaleLine.lookAt(this.xrController2.position);\n }\n const oldScale = scene.pivot.scale.x;\n if (this.goalScale !== oldScale) {\n const newScale = this.scaleDamper.update(oldScale, this.goalScale, delta, 1);\n scene.pivot.scale.set(newScale, newScale, newScale);\n }\n }\n updatePivotPosition(scene, delta) {\n const { pivot } = scene;\n const box = this.placementBox;\n const boundingRadius = scene.boundingSphere.radius;\n const goal = this.goalPosition;\n const position = pivot.position;\n let source = ChangeSource.NONE;\n if (!goal.equals(position)) {\n source = ChangeSource.USER_INTERACTION;\n let { x, y, z } = position;\n x = this.xDamper.update(x, goal.x, delta, boundingRadius);\n y = this.yDamper.update(y, goal.y, delta, boundingRadius);\n z = this.zDamper.update(z, goal.z, delta, boundingRadius);\n position.set(x, y, z);\n if (this.xrMode === XRMode.SCREEN_SPACE && !this.isTranslating) {\n const offset = goal.y - y;\n if (this.placementComplete && this.placeOnWall === false) {\n box.offsetHeight = offset / scene.pivot.scale.x;\n scene.setShadowOffset(offset);\n }\n else if (offset === 0) {\n this.placementComplete = true;\n box.show = false;\n scene.setShadowIntensity(AR_SHADOW_INTENSITY);\n }\n }\n if (this.xrMode !== XRMode.SCREEN_SPACE && goal.equals(position)) {\n scene.setShadowIntensity(AR_SHADOW_INTENSITY);\n }\n // For world-space mode after initial placement, don't constrain Y position\n if (this.isWorldSpaceReady()) {\n // Allow full Y-axis movement without floor constraints\n scene.setShadowIntensity(AR_SHADOW_INTENSITY);\n }\n }\n // Handle automatic scaling for world-space mode only during initial placement\n if (this.xrMode === XRMode.WORLD_SPACE && !this.worldSpaceInitialPlacementDone && this.goalScale !== pivot.scale.x) {\n const newScale = this.scaleDamper.update(pivot.scale.x, this.goalScale, delta, 1);\n pivot.scale.set(newScale, newScale, newScale);\n }\n scene.updateTarget(delta);\n // Return the source so the caller can use it for camera-change events\n return source;\n }\n updateYaw(scene, delta) {\n // yaw must be updated last, since this also updates the shadow position.\n quaternion.setFromAxisAngle(vector3.set(0, 1, 0), this.goalYaw);\n const angle = scene.pivot.quaternion.angleTo(quaternion);\n const angleStep = angle - this.yawDamper.update(angle, 0, delta, Math.PI);\n scene.pivot.quaternion.rotateTowards(quaternion, angleStep);\n }\n updateMenuPanel(scene, box, delta) {\n if (this.menuPanel) {\n this.menuPanel.updateOpacity(delta);\n this.menuPanel.updatePosition(scene.getCamera(), box);\n }\n }\n applyXRInputToScene(delta) {\n const scene = this.presentedScene;\n const pivot = scene.pivot;\n const box = this.placementBox;\n this.updatePlacementBoxOpacity(box, delta);\n this.updateTwoHandInteractionState();\n this.applyXRControllerRotations(pivot);\n this.handleScalingInXR(scene, delta);\n if (pivot.parent !== scene) {\n // attached to controller instead\n // when moving the model, the menu panel should disapear\n this.updateMenuPanel(scene, box, delta);\n return;\n }\n const source = this.updatePivotPosition(scene, delta);\n this.updateYaw(scene, delta);\n this.dispatchCameraChangeEvent(scene, source);\n this.updateMenuPanel(scene, box, delta);\n }\n updatePlacementBoxOpacity(box, delta) {\n // Use the new enhanced update method that includes distance scaling and visual state\n const camera = this.presentedScene.getCamera();\n box.update(delta, camera.position);\n // Update interaction state based on hover\n const over1 = this.hover(this.xrController1);\n const over2 = this.hover(this.xrController2);\n const isHovered = (over1 || over2) && !this.isTwoHandInteraction;\n // Set interaction state for visual feedback\n box.setInteractionState(this.isTranslating || this.isRotating, isHovered);\n }\n updateTwoHandInteractionState() {\n var _a, _b;\n const bothSelected = ((_a = this.xrController1) === null || _a === void 0 ? void 0 : _a.userData.isSelected) && ((_b = this.xrController2) === null || _b === void 0 ? void 0 : _b.userData.isSelected);\n this.isTwoHandInteraction = !!bothSelected;\n }\n applyXRControllerRotations(pivot) {\n if (!this.isTwoHandInteraction) {\n if (this.xrController1)\n this.applyXRControllerRotation(this.xrController1, pivot);\n if (this.xrController2)\n this.applyXRControllerRotation(this.xrController2, pivot);\n }\n }\n dispatchCameraChangeEvent(scene, source) {\n scene.element.dispatchEvent(new CustomEvent('camera-change', { detail: { source } }));\n }\n updateXRControllerHover() {\n const over1 = this.hover(this.xrController1);\n const over2 = this.hover(this.xrController2);\n const isHovered = (over1 || over2) && !this.isTwoHandInteraction;\n // Use the new interaction state system\n if (this.placementBox) {\n this.placementBox.setInteractionState(this.isTranslating || this.isRotating, isHovered);\n this.placementBox.show = isHovered;\n }\n }\n /**\n * Enable user interaction for world-space mode after initial automatic placement\n */\n enableWorldSpaceUserInteraction() {\n // Show placement box to indicate model can be moved\n if (this.placementBox) {\n this.placementBox.show = true;\n }\n // Enable shadow to show model is placed\n if (this.presentedScene) {\n this.presentedScene.setShadowIntensity(AR_SHADOW_INTENSITY);\n }\n }\n handleFirstView(frame, time) {\n // Skip moveToFloor for world-space mode after initial placement to prevent overriding\n if (this.xrMode !== XRMode.WORLD_SPACE || !this.worldSpaceInitialPlacementDone) {\n this.moveToAnchor(frame);\n }\n this.processInput(frame);\n const delta = time - this.lastTick;\n this.applyXRInputToScene(delta);\n this.renderer.preRender(this.presentedScene, time, delta);\n this.lastTick = time;\n this.presentedScene.renderShadow(this.threeRenderer);\n }\n /**\n * Only public to make it testable.\n */\n onWebXRFrame(time, frame) {\n if (this.xrMode !== XRMode.SCREEN_SPACE) {\n this.updateXRControllerHover();\n }\n this.frame = frame;\n // increamenets a counter tracking how many frames have been processed sinces the session started\n ++this.frames;\n // refSpace and pose are used to get the user's current position and orientation in the XR session.\n const refSpace = this.threeRenderer.xr.getReferenceSpace();\n const pose = frame.getViewerPose(refSpace);\n // Tracking loss Detection.\n // If pos is null, it means the XR system cannot currently track the user's position(e.g., the camera is covered or the env can't be recognized).\n // Checks if we previously throught tracking was working\n // Ensures that we don't report tracking loss too early(sometimes the first few frames can be null as the system initializes).\n if (pose == null && this.tracking === true && this.frames > INIT_FRAMES) {\n this.tracking = false;\n this.dispatchEvent({ type: 'tracking', status: ARTracking.NOT_TRACKING });\n }\n // Prevent rendering if there's no valid pose, no scene, or the scene isen't loaded.\n const scene = this.presentedScene;\n if (pose == null || scene == null || !scene.element.loaded) {\n this.threeRenderer.clear();\n return;\n }\n // Tracking REcovery Detection. \n // If tracking was previously lost, but now we have a valid pose, it meanse tracking has been recovered.\n if (this.tracking === false) {\n this.tracking = true;\n this.dispatchEvent({ type: 'tracking', status: ARTracking.TRACKING });\n }\n // WebXR may return multiple views, i.e. for headset AR. This\n // isn't really supported at this point, but make a best-effort\n // attempt to render other views also, using the first view\n // as the main viewpoint.\n let isFirstView = true;\n for (const view of pose.views) {\n this.updateView(view);\n if (isFirstView) {\n this.checkForDeferredCeilingPlacement();\n this.handleFirstView(frame, time);\n isFirstView = false;\n }\n this.threeRenderer.render(scene, scene.getCamera());\n }\n }\n /**\n * Calculate optimal scale and position for world-space AR presentation\n * Similar to the SVXR:FrameModel approach for consistent model presentation\n *\n * This method implements automatic model framing for world-space AR sessions:\n * 1. Calculates optimal viewing distance based on model size and minimum distance\n * 2. Positions model at a drop angle below camera center for natural viewing\n * 3. Automatically scales model to fit within viewport constraints\n * 4. Ensures consistent presentation across different model sizes\n *\n * Note: This automatic placement only happens on the first session start.\n * After initial placement, users have full control over model position, rotation, and scale.\n */\n calculateWorldSpaceOptimalPlacement(scene, camera) {\n // Get model bounding box half extents\n const boundingBox = scene.boundingBox;\n const halfExtent = {\n x: (boundingBox.max.x - boundingBox.min.x) / 2,\n y: (boundingBox.max.y - boundingBox.min.y) / 2,\n z: (boundingBox.max.z - boundingBox.min.z) / 2\n };\n // Compute view distance (with extra padding for model-viewer)\n const placementBoxPadding = PLACEMENT_BOX_EXTRA_PADDING;\n const viewDistance = Math.max(MIN_WORLD_SPACE_DISTANCE + placementBoxPadding, 2 * Math.max(halfExtent.x, halfExtent.z) + placementBoxPadding);\n // Compute ideal view position (drop angle below camera center)\n const dropAngleRad = VIEW_DROP_DEGREES * Math.PI / 180;\n const idealViewPosition = new Vector3(0, -viewDistance * Math.sin(dropAngleRad), -viewDistance * Math.cos(dropAngleRad));\n // Transform ideal view position to world space\n const worldFromCamera = camera.matrixWorld;\n const idealWorldPosition = idealViewPosition.clone().applyMatrix4(worldFromCamera);\n // Compute turntable and vertical radii\n const turntableRadius = Math.max(halfExtent.x, halfExtent.z) + placementBoxPadding;\n const verticalRadius = halfExtent.y;\n const turntableRadiusLimit = viewDistance * VIEW_RATIO;\n const verticalRadiusLimit = viewDistance * VIEW_RATIO;\n // Compute optimal scale\n const verticalScale = verticalRadiusLimit / Math.max(verticalRadius, MIN_MODEL_SIZE);\n const turntableScale = turntableRadiusLimit / Math.max(turntableRadius, MIN_MODEL_SIZE);\n const optimalScale = Math.min(verticalScale, turntableScale);\n // Offset so the model's base sits at the ideal world position\n // (subtract scaled half height in Y)\n const finalPosition = idealWorldPosition.clone().sub(new Vector3(0, optimalScale * halfExtent.y, 0));\n return {\n position: finalPosition,\n scale: optimalScale\n };\n }\n /**\n * Calculate min/max scale for world-space AR, SVXR-style\n */\n calculateWorldSpaceScaleLimits(scene) {\n const size = scene.size;\n const largestDimension = Math.max(size.x, size.y, size.z);\n const smallestDimension = Math.max(Math.min(size.x, size.y, size.z), MODEL_SIZE_EPSILON);\n const scaleMin = MIN_MODEL_SIZE / Math.max(largestDimension, MODEL_SIZE_EPSILON);\n const scaleMax = MAX_MODEL_SIZE / Math.max(smallestDimension, MODEL_SIZE_EPSILON);\n // Clamp to initial scale if needed\n this.minScale = Math.min(scaleMin, scaleMax, this.goalScale);\n this.maxScale = Math.max(scaleMin, scaleMax, this.goalScale);\n }\n}\n//# sourceMappingURL=ARRenderer.js.map","import {\n\tAnimationClip,\n\tAnimationMixer,\n\tMatrix4,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tSkeletonHelper,\n\tVector3,\n\tVectorKeyframeTrack\n} from 'three';\n\nfunction getBoneName( bone, options ) {\n\n\tif ( options.getBoneName !== undefined ) {\n\n\t\treturn options.getBoneName( bone );\n\n\t}\n\n\treturn options.names[ bone.name ];\n\n}\n\nfunction retarget( target, source, options = {} ) {\n\n\tconst quat = new Quaternion(),\n\t\tscale = new Vector3(),\n\t\trelativeMatrix = new Matrix4(),\n\t\tglobalMatrix = new Matrix4();\n\n\toptions.preserveBoneMatrix = options.preserveBoneMatrix !== undefined ? options.preserveBoneMatrix : true;\n\toptions.preserveBonePositions = options.preserveBonePositions !== undefined ? options.preserveBonePositions : true;\n\toptions.useTargetMatrix = options.useTargetMatrix !== undefined ? options.useTargetMatrix : false;\n\toptions.hip = options.hip !== undefined ? options.hip : 'hip';\n\toptions.hipInfluence = options.hipInfluence !== undefined ? options.hipInfluence : new Vector3( 1, 1, 1 );\n\toptions.scale = options.scale !== undefined ? options.scale : 1;\n\toptions.names = options.names || {};\n\n\tconst sourceBones = source.isObject3D ? source.skeleton.bones : getBones( source ),\n\t\tbones = target.isObject3D ? target.skeleton.bones : getBones( target );\n\n\tlet bone, name, boneTo,\n\t\tbonesPosition;\n\n\t// reset bones\n\n\tif ( target.isObject3D ) {\n\n\t\ttarget.skeleton.pose();\n\n\t} else {\n\n\t\toptions.useTargetMatrix = true;\n\t\toptions.preserveBoneMatrix = false;\n\n\t}\n\n\tif ( options.preserveBonePositions ) {\n\n\t\tbonesPosition = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tbonesPosition.push( bones[ i ].position.clone() );\n\n\t\t}\n\n\t}\n\n\tif ( options.preserveBoneMatrix ) {\n\n\t\t// reset matrix\n\n\t\ttarget.updateMatrixWorld();\n\n\t\ttarget.matrixWorld.identity();\n\n\t\t// reset children matrix\n\n\t\tfor ( let i = 0; i < target.children.length; ++ i ) {\n\n\t\t\ttarget.children[ i ].updateMatrixWorld( true );\n\n\t\t}\n\n\t}\n\n\tfor ( let i = 0; i < bones.length; ++ i ) {\n\n\t\tbone = bones[ i ];\n\t\tname = getBoneName( bone, options );\n\n\t\tboneTo = getBoneByName( name, sourceBones );\n\n\t\tglobalMatrix.copy( bone.matrixWorld );\n\n\t\tif ( boneTo ) {\n\n\t\t\tboneTo.updateMatrixWorld();\n\n\t\t\tif ( options.useTargetMatrix ) {\n\n\t\t\t\trelativeMatrix.copy( boneTo.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\trelativeMatrix.copy( target.matrixWorld ).invert();\n\t\t\t\trelativeMatrix.multiply( boneTo.matrixWorld );\n\n\t\t\t}\n\n\t\t\t// ignore scale to extract rotation\n\n\t\t\tscale.setFromMatrixScale( relativeMatrix );\n\t\t\trelativeMatrix.scale( scale.set( 1 / scale.x, 1 / scale.y, 1 / scale.z ) );\n\n\t\t\t// apply to global matrix\n\n\t\t\tglobalMatrix.makeRotationFromQuaternion( quat.setFromRotationMatrix( relativeMatrix ) );\n\n\t\t\tif ( target.isObject3D ) {\n\n\t\t\t\tif ( options.localOffsets ) {\n\n\t\t\t\t\tif ( options.localOffsets[ bone.name ] ) {\n\n\t\t\t\t\t\tglobalMatrix.multiply( options.localOffsets[ bone.name ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tglobalMatrix.copyPosition( relativeMatrix );\n\n\t\t}\n\n\t\tif ( name === options.hip ) {\n\n\t\t\tglobalMatrix.elements[ 12 ] *= options.scale * options.hipInfluence.x;\n\t\t\tglobalMatrix.elements[ 13 ] *= options.scale * options.hipInfluence.y;\n\t\t\tglobalMatrix.elements[ 14 ] *= options.scale * options.hipInfluence.z;\n\n\t\t\tif ( options.hipPosition !== undefined ) {\n\n\t\t\t\tglobalMatrix.elements[ 12 ] += options.hipPosition.x * options.scale;\n\t\t\t\tglobalMatrix.elements[ 13 ] += options.hipPosition.y * options.scale;\n\t\t\t\tglobalMatrix.elements[ 14 ] += options.hipPosition.z * options.scale;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( bone.parent ) {\n\n\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\tbone.matrix.multiply( globalMatrix );\n\n\t\t} else {\n\n\t\t\tbone.matrix.copy( globalMatrix );\n\n\t\t}\n\n\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\tbone.updateMatrixWorld();\n\n\t}\n\n\tif ( options.preserveBonePositions ) {\n\n\t\tfor ( let i = 0; i < bones.length; ++ i ) {\n\n\t\t\tbone = bones[ i ];\n\t\t\tname = getBoneName( bone, options ) || bone.name;\n\n\t\t\tif ( name !== options.hip ) {\n\n\t\t\t\tbone.position.copy( bonesPosition[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tif ( options.preserveBoneMatrix ) {\n\n\t\t// restore matrix\n\n\t\ttarget.updateMatrixWorld( true );\n\n\t}\n\n}\n\nfunction retargetClip( target, source, clip, options = {} ) {\n\n\toptions.useFirstFramePosition = options.useFirstFramePosition !== undefined ? options.useFirstFramePosition : false;\n\n\t// Calculate the fps from the source clip based on the track with the most frames, unless fps is already provided.\n\toptions.fps = options.fps !== undefined ? options.fps : ( Math.max( ...clip.tracks.map( track => track.times.length ) ) / clip.duration );\n\toptions.names = options.names || [];\n\n\tif ( ! source.isObject3D ) {\n\n\t\tsource = getHelperFromSkeleton( source );\n\n\t}\n\n\tconst numFrames = Math.round( clip.duration * ( options.fps / 1000 ) * 1000 ),\n\t\tdelta = clip.duration / ( numFrames - 1 ),\n\t\tconvertedTracks = [],\n\t\tmixer = new AnimationMixer( source ),\n\t\tbones = getBones( target.skeleton ),\n\t\tboneDatas = [];\n\n\tlet positionOffset,\n\t\tbone, boneTo, boneData,\n\t\tname;\n\n\tmixer.clipAction( clip ).play();\n\n\t// trim\n\n\tlet start = 0, end = numFrames;\n\n\tif ( options.trim !== undefined ) {\n\n\t\tstart = Math.round( options.trim[ 0 ] * options.fps );\n\t\tend = Math.min( Math.round( options.trim[ 1 ] * options.fps ), numFrames ) - start;\n\n\t\tmixer.update( options.trim[ 0 ] );\n\n\t} else {\n\n\t\tmixer.update( 0 );\n\n\t}\n\n\tsource.updateMatrixWorld();\n\n\t//\n\n\tfor ( let frame = 0; frame < end; ++ frame ) {\n\n\t\tconst time = frame * delta;\n\n\t\tretarget( target, source, options );\n\n\t\tfor ( let j = 0; j < bones.length; ++ j ) {\n\n\t\t\tbone = bones[ j ];\n\t\t\tname = getBoneName( bone, options ) || bone.name;\n\t\t\tboneTo = getBoneByName( name, source.skeleton );\n\n\t\t\tif ( boneTo ) {\n\n\t\t\t\tboneData = boneDatas[ j ] = boneDatas[ j ] || { bone: bone };\n\n\t\t\t\tif ( options.hip === name ) {\n\n\t\t\t\t\tif ( ! boneData.pos ) {\n\n\t\t\t\t\t\tboneData.pos = {\n\t\t\t\t\t\t\ttimes: new Float32Array( end ),\n\t\t\t\t\t\t\tvalues: new Float32Array( end * 3 )\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( options.useFirstFramePosition ) {\n\n\t\t\t\t\t\tif ( frame === 0 ) {\n\n\t\t\t\t\t\t\tpositionOffset = bone.position.clone();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbone.position.sub( positionOffset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneData.pos.times[ frame ] = time;\n\n\t\t\t\t\tbone.position.toArray( boneData.pos.values, frame * 3 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! boneData.quat ) {\n\n\t\t\t\t\tboneData.quat = {\n\t\t\t\t\t\ttimes: new Float32Array( end ),\n\t\t\t\t\t\tvalues: new Float32Array( end * 4 )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tboneData.quat.times[ frame ] = time;\n\n\t\t\t\tbone.quaternion.toArray( boneData.quat.values, frame * 4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( frame === end - 2 ) {\n\n\t\t\t// last mixer update before final loop iteration\n\t\t\t// make sure we do not go over or equal to clip duration\n\t\t\tmixer.update( delta - 0.0000001 );\n\n\t\t} else {\n\n\t\t\tmixer.update( delta );\n\n\t\t}\n\n\t\tsource.updateMatrixWorld();\n\n\t}\n\n\tfor ( let i = 0; i < boneDatas.length; ++ i ) {\n\n\t\tboneData = boneDatas[ i ];\n\n\t\tif ( boneData ) {\n\n\t\t\tif ( boneData.pos ) {\n\n\t\t\t\tconvertedTracks.push( new VectorKeyframeTrack(\n\t\t\t\t\t'.bones[' + boneData.bone.name + '].position',\n\t\t\t\t\tboneData.pos.times,\n\t\t\t\t\tboneData.pos.values\n\t\t\t\t) );\n\n\t\t\t}\n\n\t\t\tconvertedTracks.push( new QuaternionKeyframeTrack(\n\t\t\t\t'.bones[' + boneData.bone.name + '].quaternion',\n\t\t\t\tboneData.quat.times,\n\t\t\t\tboneData.quat.values\n\t\t\t) );\n\n\t\t}\n\n\t}\n\n\tmixer.uncacheAction( clip );\n\n\treturn new AnimationClip( clip.name, - 1, convertedTracks );\n\n}\n\nfunction clone( source ) {\n\n\tconst sourceLookup = new Map();\n\tconst cloneLookup = new Map();\n\n\tconst clone = source.clone();\n\n\tparallelTraverse( source, clone, function ( sourceNode, clonedNode ) {\n\n\t\tsourceLookup.set( clonedNode, sourceNode );\n\t\tcloneLookup.set( sourceNode, clonedNode );\n\n\t} );\n\n\tclone.traverse( function ( node ) {\n\n\t\tif ( ! node.isSkinnedMesh ) return;\n\n\t\tconst clonedMesh = node;\n\t\tconst sourceMesh = sourceLookup.get( node );\n\t\tconst sourceBones = sourceMesh.skeleton.bones;\n\n\t\tclonedMesh.skeleton = sourceMesh.skeleton.clone();\n\t\tclonedMesh.bindMatrix.copy( sourceMesh.bindMatrix );\n\n\t\tclonedMesh.skeleton.bones = sourceBones.map( function ( bone ) {\n\n\t\t\treturn cloneLookup.get( bone );\n\n\t\t} );\n\n\t\tclonedMesh.bind( clonedMesh.skeleton, clonedMesh.bindMatrix );\n\n\t} );\n\n\treturn clone;\n\n}\n\n// internal helper\n\nfunction getBoneByName( name, skeleton ) {\n\n\tfor ( let i = 0, bones = getBones( skeleton ); i < bones.length; i ++ ) {\n\n\t\tif ( name === bones[ i ].name )\n\n\t\t\treturn bones[ i ];\n\n\t}\n\n}\n\nfunction getBones( skeleton ) {\n\n\treturn Array.isArray( skeleton ) ? skeleton : skeleton.bones;\n\n}\n\n\nfunction getHelperFromSkeleton( skeleton ) {\n\n\tconst source = new SkeletonHelper( skeleton.bones[ 0 ] );\n\tsource.skeleton = skeleton;\n\n\treturn source;\n\n}\n\nfunction parallelTraverse( a, b, callback ) {\n\n\tcallback( a, b );\n\n\tfor ( let i = 0; i < a.children.length; i ++ ) {\n\n\t\tparallelTraverse( a.children[ i ], b.children[ i ], callback );\n\n\t}\n\n}\n\nexport {\n\tretarget,\n\tretargetClip,\n\tclone,\n};\n","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Texture } from 'three';\nimport * as SkeletonUtils from 'three/examples/jsm/utils/SkeletonUtils.js';\nexport const $prepared = Symbol('prepared');\nexport const $prepare = Symbol('prepare');\nexport const $preparedGLTF = Symbol('preparedGLTF');\nexport const $clone = Symbol('clone');\n/**\n * Represents the preparation and enhancement of the output of a Three.js\n * GLTFLoader (a Three.js-flavor \"GLTF\"), to make it suitable for optimal,\n * correct viewing in a given presentation context and also make the cloning\n * process more explicit and legible.\n *\n * A GLTFInstance is API-compatible with a Three.js-flavor \"GLTF\", so it should\n * be considered to be interchangeable with the loaded result of a GLTFLoader.\n *\n * This basic implementation only implements trivial preparation and enhancement\n * of a GLTF. These operations are intended to be enhanced by inheriting\n * classes.\n */\nexport class GLTFInstance {\n /**\n * Prepares a given GLTF for presentation and future cloning. A GLTF that is\n * prepared can safely have this method invoked on it multiple times; it will\n * only be prepared once, including after being cloned.\n */\n static prepare(source) {\n if (source.scene == null) {\n throw new Error('Model does not have a scene');\n }\n if (source[$prepared]) {\n return source;\n }\n const prepared = this[$prepare](source);\n // NOTE: ES5 Symbol polyfill is not compatible with spread operator\n // so {...prepared, [$prepared]: true} does not work\n prepared[$prepared] = true;\n return prepared;\n }\n /**\n * Override in an inheriting class to apply specialty one-time preparations\n * for a given input GLTF.\n */\n static [$prepare](source) {\n // TODO(#195,#1003): We don't currently support multiple scenes, so we don't\n // bother preparing extra scenes for now:\n const { scene } = source;\n const scenes = [scene];\n return Object.assign(Object.assign({}, source), { scene, scenes });\n }\n get parser() {\n return this[$preparedGLTF].parser;\n }\n get animations() {\n return this[$preparedGLTF].animations;\n }\n get scene() {\n return this[$preparedGLTF].scene;\n }\n get scenes() {\n return this[$preparedGLTF].scenes;\n }\n get cameras() {\n return this[$preparedGLTF].cameras;\n }\n get asset() {\n return this[$preparedGLTF].asset;\n }\n get userData() {\n return this[$preparedGLTF].userData;\n }\n constructor(preparedGLTF) {\n this[$preparedGLTF] = preparedGLTF;\n }\n /**\n * Creates and returns a copy of this instance.\n */\n clone() {\n const GLTFInstanceConstructor = this.constructor;\n const clonedGLTF = this[$clone]();\n return new GLTFInstanceConstructor(clonedGLTF);\n }\n /**\n * Cleans up any retained memory that might not otherwise be released when\n * this instance is done being used.\n */\n dispose() {\n this.scenes.forEach((scene) => {\n scene.traverse((object) => {\n const mesh = object;\n if (!mesh.material) {\n return;\n }\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n materials.forEach(material => {\n // Explicitly dispose any textures assigned to this material\n for (const propertyName in material) {\n const texture = material[propertyName];\n if (texture instanceof Texture) {\n const image = texture.source.data;\n if (image.close != null) {\n image.close();\n }\n texture.dispose();\n }\n }\n material.dispose();\n });\n mesh.geometry.dispose();\n });\n });\n }\n /**\n * Override in an inheriting class to implement specialized cloning strategies\n */\n [$clone]() {\n const source = this[$preparedGLTF];\n // TODO(#195,#1003): We don't currently support multiple scenes, so we don't\n // bother cloning extra scenes for now:\n const scene = SkeletonUtils.clone(this.scene);\n cloneVariantMaterials(scene, this.scene);\n const scenes = [scene];\n const userData = source.userData ? Object.assign({}, source.userData) : {};\n return Object.assign(Object.assign({}, source), { scene, scenes, userData });\n }\n}\n// Variant materials and original material instances are stored under\n// object.userData.variantMaterials/originalMaterial.\n// Three.js Object3D.clone() doesn't clone Three.js objects under\n// .userData so this function is a workaround.\nconst cloneVariantMaterials = (dst, src) => {\n traversePair(dst, src, (dst, src) => {\n if (src.userData.variantMaterials !== undefined) {\n dst.userData.variantMaterials = new Map(src.userData.variantMaterials);\n }\n if (src.userData.variantData !== undefined) {\n dst.userData.variantData = src.userData.variantData;\n }\n if (src.userData.originalMaterial !== undefined) {\n dst.userData.originalMaterial = src.userData.originalMaterial;\n }\n });\n};\nconst traversePair = (obj1, obj2, callback) => {\n callback(obj1, obj2);\n // Assume obj1 and obj2 have the same tree structure\n for (let i = 0; i < obj1.children.length; i++) {\n traversePair(obj1.children[i], obj2.children[i], callback);\n }\n};\n//# sourceMappingURL=GLTFInstance.js.map","import { Material } from 'three';\nconst $threeGLTF = Symbol('threeGLTF');\nconst $gltf = Symbol('gltf');\nconst $gltfElementMap = Symbol('gltfElementMap');\nconst $threeObjectMap = Symbol('threeObjectMap');\nconst $parallelTraverseThreeScene = Symbol('parallelTraverseThreeScene');\nconst $correlateOriginalThreeGLTF = Symbol('correlateOriginalThreeGLTF');\nconst $correlateCloneThreeGLTF = Symbol('correlateCloneThreeGLTF');\n/**\n * The Three.js GLTFLoader provides us with an in-memory representation\n * of a glTF in terms of Three.js constructs. It also provides us with a copy\n * of the deserialized glTF without any Three.js decoration, and a mapping of\n * glTF elements to their corresponding Three.js constructs.\n *\n * A CorrelatedSceneGraph exposes a synchronously available mapping of glTF\n * element references to their corresponding Three.js constructs.\n */\nexport class CorrelatedSceneGraph {\n /**\n * Produce a CorrelatedSceneGraph from a naturally generated Three.js GLTF.\n * Such GLTFs are produced by Three.js' GLTFLoader, and contain cached\n * details that expedite the correlation step.\n *\n * If a CorrelatedSceneGraph is provided as the second argument, re-correlates\n * a cloned Three.js GLTF with a clone of the glTF hierarchy used to produce\n * the upstream Three.js GLTF that the clone was created from. The result\n * CorrelatedSceneGraph is representative of the cloned hierarchy.\n */\n static from(threeGLTF, upstreamCorrelatedSceneGraph) {\n if (upstreamCorrelatedSceneGraph != null) {\n return this[$correlateCloneThreeGLTF](threeGLTF, upstreamCorrelatedSceneGraph);\n }\n else {\n return this[$correlateOriginalThreeGLTF](threeGLTF);\n }\n }\n static [$correlateOriginalThreeGLTF](threeGLTF) {\n const gltf = threeGLTF.parser.json;\n const associations = threeGLTF.parser.associations;\n const gltfElementMap = new Map();\n const defaultMaterial = { name: 'Default' };\n const defaultReference = { type: 'materials', index: -1 };\n for (const threeMaterial of associations.keys()) {\n // Note: GLTFLoader creates a \"default\" material that has no\n // corresponding glTF element in the case that no materials are\n // specified in the source glTF. In this case we append a default\n // material to allow this to be operated upon.\n if (threeMaterial instanceof Material &&\n associations.get(threeMaterial) == null) {\n if (defaultReference.index < 0) {\n if (gltf.materials == null) {\n gltf.materials = [];\n }\n defaultReference.index = gltf.materials.length;\n gltf.materials.push(defaultMaterial);\n }\n threeMaterial.name = defaultMaterial.name;\n associations.set(threeMaterial, { materials: defaultReference.index });\n }\n }\n // Creates a reverse look up map (gltf-object to Three-object)\n for (const [threeObject, gltfMappings] of associations) {\n if (gltfMappings) {\n threeObject.userData = threeObject.userData || {};\n threeObject.userData.associations = gltfMappings;\n }\n for (const mapping in gltfMappings) {\n if (mapping != null && mapping !== 'primitives') {\n const type = mapping;\n const elementArray = gltf[type] || [];\n const gltfElement = elementArray[gltfMappings[type]];\n if (gltfElement == null) {\n // TODO: Maybe throw here...\n continue;\n }\n let threeObjects = gltfElementMap.get(gltfElement);\n if (threeObjects == null) {\n threeObjects = new Set();\n gltfElementMap.set(gltfElement, threeObjects);\n }\n threeObjects.add(threeObject);\n }\n }\n }\n return new CorrelatedSceneGraph(threeGLTF, gltf, associations, gltfElementMap);\n }\n /**\n * Transfers the association between a raw glTF and a Three.js scene graph\n * to a clone of the Three.js scene graph, resolved as a new\n * CorrelatedSceneGraph instance.\n */\n static [$correlateCloneThreeGLTF](cloneThreeGLTF, upstreamCorrelatedSceneGraph) {\n const originalThreeGLTF = upstreamCorrelatedSceneGraph.threeGLTF;\n const originalGLTF = upstreamCorrelatedSceneGraph.gltf;\n const cloneGLTF = JSON.parse(JSON.stringify(originalGLTF));\n const cloneThreeObjectMap = new Map();\n const cloneGLTFElementMap = new Map();\n for (let i = 0; i < originalThreeGLTF.scenes.length; i++) {\n this[$parallelTraverseThreeScene](originalThreeGLTF.scenes[i], cloneThreeGLTF.scenes[i], (object, cloneObject) => {\n const elementReference = upstreamCorrelatedSceneGraph.threeObjectMap.get(object);\n if (elementReference == null) {\n return;\n }\n for (const mapping in elementReference) {\n if (mapping != null && mapping !== 'primitives') {\n const type = mapping;\n const index = elementReference[type];\n const cloneElement = cloneGLTF[type][index];\n const mappings = cloneThreeObjectMap.get(cloneObject) || {};\n mappings[type] = index;\n cloneThreeObjectMap.set(cloneObject, mappings);\n const cloneObjects = cloneGLTFElementMap.get(cloneElement) || new Set();\n cloneObjects.add(cloneObject);\n cloneGLTFElementMap.set(cloneElement, cloneObjects);\n }\n }\n });\n }\n return new CorrelatedSceneGraph(cloneThreeGLTF, cloneGLTF, cloneThreeObjectMap, cloneGLTFElementMap);\n }\n /**\n * Traverses two presumably identical Three.js scenes, and invokes a\n * callback for each Object3D or Material encountered, including the initial\n * scene. Adapted from\n * https://github.com/mrdoob/three.js/blob/7c1424c5819ab622a346dd630ee4e6431388021e/examples/jsm/utils/SkeletonUtils.js#L586-L596\n */\n static [$parallelTraverseThreeScene](sceneOne, sceneTwo, callback) {\n const traverse = (a, b) => {\n callback(a, b);\n if (a.isObject3D) {\n const meshA = a;\n const meshB = b;\n if (meshA.material) {\n if (Array.isArray(meshA.material)) {\n for (let i = 0; i < meshA.material.length; ++i) {\n callback(meshA.material[i], meshB.material[i]);\n }\n }\n else {\n callback(meshA.material, meshB.material);\n }\n }\n for (let i = 0; i < a.children.length; ++i) {\n traverse(a.children[i], b.children[i]);\n }\n }\n };\n traverse(sceneOne, sceneTwo);\n }\n /**\n * The source Three.js GLTF result given to us by a Three.js GLTFLoader.\n */\n get threeGLTF() {\n return this[$threeGLTF];\n }\n /**\n * The in-memory deserialized source glTF.\n */\n get gltf() {\n return this[$gltf];\n }\n /**\n * A Map of glTF element references to arrays of corresponding Three.js\n * object references. Three.js objects are kept in arrays to account for\n * cases where more than one Three.js object corresponds to a single glTF\n * element.\n */\n get gltfElementMap() {\n return this[$gltfElementMap];\n }\n /**\n * A map of individual Three.js objects to corresponding elements in the\n * source glTF.\n */\n get threeObjectMap() {\n return this[$threeObjectMap];\n }\n constructor(threeGLTF, gltf, threeObjectMap, gltfElementMap) {\n this[$threeGLTF] = threeGLTF;\n this[$gltf] = gltf;\n this[$gltfElementMap] = gltfElementMap;\n this[$threeObjectMap] = threeObjectMap;\n }\n}\n//# sourceMappingURL=correlated-scene-graph.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { FrontSide, Sphere } from 'three';\nimport { $clone, $prepare, $preparedGLTF, GLTFInstance } from '../GLTFInstance.js';\nimport { CorrelatedSceneGraph } from './correlated-scene-graph.js';\nconst $correlatedSceneGraph = Symbol('correlatedSceneGraph');\n/**\n * This specialization of GLTFInstance collects all of the processing needed\n * to prepare a model and to clone it making special considerations for\n * use cases.\n */\nexport class ModelViewerGLTFInstance extends GLTFInstance {\n /**\n * @override\n */\n static [$prepare](source) {\n const prepared = super[$prepare](source);\n if (prepared[$correlatedSceneGraph] == null) {\n prepared[$correlatedSceneGraph] = CorrelatedSceneGraph.from(prepared);\n }\n const { scene } = prepared;\n const nullSphere = new Sphere(undefined, Infinity);\n scene.traverse((node) => {\n // Set a high renderOrder while we're here to ensure the model\n // always renders on top of the sky sphere\n node.renderOrder = 1000;\n // Three.js seems to cull some animated models incorrectly. Since we\n // expect to view our whole scene anyway, we turn off the frustum\n // culling optimization here.\n node.frustumCulled = false;\n // Animations for objects without names target their UUID instead. When\n // objects are cloned, they get new UUIDs which the animation can't\n // find. To fix this, we assign their UUID as their name.\n if (!node.name) {\n node.name = node.uuid;\n }\n const mesh = node;\n if (mesh.material) {\n const { geometry } = mesh;\n mesh.castShadow = true;\n if (mesh.isSkinnedMesh) {\n // Akin to disabling frustum culling above, we have to also manually\n // disable the bounds to make raycasting correct for skinned meshes.\n geometry.boundingSphere = nullSphere;\n // The bounding box is set in GLTFLoader by the accessor bounds, which\n // are not updated with animation.\n geometry.boundingBox = null;\n }\n const material = mesh.material;\n if (material.isMeshBasicMaterial === true) {\n material.toneMapped = false;\n }\n // This makes shadows better for non-manifold meshes\n material.shadowSide = FrontSide;\n // Fixes an edge case with unused extra UV-coords being incorrectly\n // referenced by three.js; remove when\n // https://github.com/mrdoob/three.js/pull/23974 is merged.\n if (material.aoMap) {\n const { gltf, threeObjectMap } = prepared[$correlatedSceneGraph];\n const gltfRef = threeObjectMap.get(material);\n if (gltf.materials != null && gltfRef != null &&\n gltfRef.materials != null) {\n const gltfMaterial = gltf.materials[gltfRef.materials];\n if (gltfMaterial.occlusionTexture &&\n gltfMaterial.occlusionTexture.texCoord === 0 &&\n geometry.attributes.uv != null) {\n geometry.setAttribute('uv2', geometry.attributes.uv);\n }\n }\n }\n }\n });\n return prepared;\n }\n get correlatedSceneGraph() {\n return this[$preparedGLTF][$correlatedSceneGraph];\n }\n /**\n * @override\n */\n [$clone]() {\n const clone = super[$clone]();\n const sourceUUIDToClonedMaterial = new Map();\n clone.scene.traverse((node) => {\n // Materials aren't cloned when cloning meshes; geometry\n // and materials are copied by reference. This is necessary\n // for the same model to be used twice with different\n // scene-graph operations.\n const mesh = node;\n if (mesh.material) {\n const material = mesh.material;\n if (material != null) {\n if (sourceUUIDToClonedMaterial.has(material.uuid)) {\n mesh.material = sourceUUIDToClonedMaterial.get(material.uuid);\n return;\n }\n mesh.material = material.clone();\n sourceUUIDToClonedMaterial.set(material.uuid, mesh.material);\n }\n }\n const light = node;\n if (light.target !== undefined) {\n // The target's parent is lost in the cloning process, but in\n // GLTFLoader, all light targets are children of their light.\n light.add(light.target);\n }\n });\n // Cross-correlate the scene graph by relying on information in the\n // current scene graph; without this step, relationships between the\n // Three.js object graph and the glTF scene graph will be lost.\n clone[$correlatedSceneGraph] =\n CorrelatedSceneGraph.from(clone, this.correlatedSceneGraph);\n return clone;\n }\n}\n//# sourceMappingURL=ModelViewerGLTFInstance.js.map","/**\n * @monogrid/gainmap-js v3.1.0\n * With ❤️, by MONOGRID \n */\n\nimport { RGBAFormat, LinearFilter, ClampToEdgeWrapping, Scene, OrthographicCamera, HalfFloatType, FloatType, Mesh, PlaneGeometry, WebGLRenderTarget, UVMapping, WebGLRenderer, DataTexture, LinearSRGBColorSpace, ShaderMaterial, Texture, IntType, ShortType, ByteType, UnsignedIntType, UnsignedByteType, MeshBasicMaterial } from 'three';\n\nconst getBufferForType = (type, width, height) => {\n let out;\n switch (type) {\n case UnsignedByteType:\n out = new Uint8ClampedArray(width * height * 4);\n break;\n case HalfFloatType:\n out = new Uint16Array(width * height * 4);\n break;\n case UnsignedIntType:\n out = new Uint32Array(width * height * 4);\n break;\n case ByteType:\n out = new Int8Array(width * height * 4);\n break;\n case ShortType:\n out = new Int16Array(width * height * 4);\n break;\n case IntType:\n out = new Int32Array(width * height * 4);\n break;\n case FloatType:\n out = new Float32Array(width * height * 4);\n break;\n default:\n throw new Error('Unsupported data type');\n }\n return out;\n};\nlet _canReadPixelsResult;\n/**\n * Test if this browser implementation can correctly read pixels from the specified\n * Render target type.\n *\n * Runs only once\n *\n * @param type\n * @param renderer\n * @param camera\n * @param renderTargetOptions\n * @returns\n */\nconst canReadPixels = (type, renderer, camera, renderTargetOptions) => {\n if (_canReadPixelsResult !== undefined)\n return _canReadPixelsResult;\n const testRT = new WebGLRenderTarget(1, 1, renderTargetOptions);\n renderer.setRenderTarget(testRT);\n const mesh = new Mesh(new PlaneGeometry(), new MeshBasicMaterial({ color: 0xffffff }));\n renderer.render(mesh, camera);\n renderer.setRenderTarget(null);\n const out = getBufferForType(type, testRT.width, testRT.height);\n renderer.readRenderTargetPixels(testRT, 0, 0, testRT.width, testRT.height, out);\n testRT.dispose();\n mesh.geometry.dispose();\n mesh.material.dispose();\n _canReadPixelsResult = out[0] !== 0;\n return _canReadPixelsResult;\n};\n/**\n * Utility class used for rendering a texture with a material\n *\n * @category Core\n * @group Core\n */\nclass QuadRenderer {\n /**\n * Constructs a new QuadRenderer\n *\n * @param options Parameters for this QuadRenderer\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;\n this._rendererIsDisposable = false;\n this._supportsReadPixels = true;\n /**\n * Renders the input texture using the specified material\n */\n this.render = () => {\n this._renderer.setRenderTarget(this._renderTarget);\n try {\n this._renderer.render(this._scene, this._camera);\n }\n catch (e) {\n this._renderer.setRenderTarget(null);\n throw e;\n }\n this._renderer.setRenderTarget(null);\n };\n this._width = options.width;\n this._height = options.height;\n this._type = options.type;\n this._colorSpace = options.colorSpace;\n const rtOptions = {\n // fixed options\n format: RGBAFormat,\n depthBuffer: false,\n stencilBuffer: false,\n // user options\n type: this._type, // set in class property\n colorSpace: this._colorSpace, // set in class property\n anisotropy: ((_a = options.renderTargetOptions) === null || _a === void 0 ? void 0 : _a.anisotropy) !== undefined ? (_b = options.renderTargetOptions) === null || _b === void 0 ? void 0 : _b.anisotropy : 1,\n generateMipmaps: ((_c = options.renderTargetOptions) === null || _c === void 0 ? void 0 : _c.generateMipmaps) !== undefined ? (_d = options.renderTargetOptions) === null || _d === void 0 ? void 0 : _d.generateMipmaps : false,\n magFilter: ((_e = options.renderTargetOptions) === null || _e === void 0 ? void 0 : _e.magFilter) !== undefined ? (_f = options.renderTargetOptions) === null || _f === void 0 ? void 0 : _f.magFilter : LinearFilter,\n minFilter: ((_g = options.renderTargetOptions) === null || _g === void 0 ? void 0 : _g.minFilter) !== undefined ? (_h = options.renderTargetOptions) === null || _h === void 0 ? void 0 : _h.minFilter : LinearFilter,\n samples: ((_j = options.renderTargetOptions) === null || _j === void 0 ? void 0 : _j.samples) !== undefined ? (_k = options.renderTargetOptions) === null || _k === void 0 ? void 0 : _k.samples : undefined,\n wrapS: ((_l = options.renderTargetOptions) === null || _l === void 0 ? void 0 : _l.wrapS) !== undefined ? (_m = options.renderTargetOptions) === null || _m === void 0 ? void 0 : _m.wrapS : ClampToEdgeWrapping,\n wrapT: ((_o = options.renderTargetOptions) === null || _o === void 0 ? void 0 : _o.wrapT) !== undefined ? (_p = options.renderTargetOptions) === null || _p === void 0 ? void 0 : _p.wrapT : ClampToEdgeWrapping\n };\n this._material = options.material;\n if (options.renderer) {\n this._renderer = options.renderer;\n }\n else {\n this._renderer = QuadRenderer.instantiateRenderer();\n this._rendererIsDisposable = true;\n }\n this._scene = new Scene();\n this._camera = new OrthographicCamera();\n this._camera.position.set(0, 0, 10);\n this._camera.left = -0.5;\n this._camera.right = 0.5;\n this._camera.top = 0.5;\n this._camera.bottom = -0.5;\n this._camera.updateProjectionMatrix();\n if (!canReadPixels(this._type, this._renderer, this._camera, rtOptions)) {\n let alternativeType;\n switch (this._type) {\n case HalfFloatType:\n alternativeType = this._renderer.extensions.has('EXT_color_buffer_float') ? FloatType : undefined;\n break;\n }\n if (alternativeType !== undefined) {\n console.warn(`This browser does not support reading pixels from ${this._type} RenderTargets, switching to ${FloatType}`);\n this._type = alternativeType;\n }\n else {\n this._supportsReadPixels = false;\n console.warn('This browser dos not support toArray or toDataTexture, calls to those methods will result in an error thrown');\n }\n }\n this._quad = new Mesh(new PlaneGeometry(), this._material);\n this._quad.geometry.computeBoundingBox();\n this._scene.add(this._quad);\n this._renderTarget = new WebGLRenderTarget(this.width, this.height, rtOptions);\n this._renderTarget.texture.mapping = ((_q = options.renderTargetOptions) === null || _q === void 0 ? void 0 : _q.mapping) !== undefined ? (_r = options.renderTargetOptions) === null || _r === void 0 ? void 0 : _r.mapping : UVMapping;\n }\n /**\n * Instantiates a temporary renderer\n *\n * @returns\n */\n static instantiateRenderer() {\n const renderer = new WebGLRenderer();\n renderer.setSize(128, 128);\n // renderer.outputColorSpace = SRGBColorSpace\n // renderer.toneMapping = LinearToneMapping\n // renderer.debug.checkShaderErrors = false\n // this._rendererIsDisposable = true\n return renderer;\n }\n /**\n * Obtains a Buffer containing the rendered texture.\n *\n * @throws Error if the browser cannot read pixels from this RenderTarget type.\n * @returns a TypedArray containing RGBA values from this renderer\n */\n toArray() {\n if (!this._supportsReadPixels)\n throw new Error('Can\\'t read pixels in this browser');\n const out = getBufferForType(this._type, this._width, this._height);\n this._renderer.readRenderTargetPixels(this._renderTarget, 0, 0, this._width, this._height, out);\n return out;\n }\n /**\n * Performs a readPixel operation in the renderTarget\n * and returns a DataTexture containing the read data\n *\n * @param options options\n * @returns\n */\n toDataTexture(options) {\n const returnValue = new DataTexture(\n // fixed values\n this.toArray(), this.width, this.height, RGBAFormat, this._type, \n // user values\n (options === null || options === void 0 ? void 0 : options.mapping) || UVMapping, (options === null || options === void 0 ? void 0 : options.wrapS) || ClampToEdgeWrapping, (options === null || options === void 0 ? void 0 : options.wrapT) || ClampToEdgeWrapping, (options === null || options === void 0 ? void 0 : options.magFilter) || LinearFilter, (options === null || options === void 0 ? void 0 : options.minFilter) || LinearFilter, (options === null || options === void 0 ? void 0 : options.anisotropy) || 1, \n // fixed value\n LinearSRGBColorSpace);\n // set this afterwards, we can't set it in constructor\n returnValue.generateMipmaps = (options === null || options === void 0 ? void 0 : options.generateMipmaps) !== undefined ? options === null || options === void 0 ? void 0 : options.generateMipmaps : false;\n return returnValue;\n }\n /**\n * If using a disposable renderer, it will dispose it.\n */\n disposeOnDemandRenderer() {\n this._renderer.setRenderTarget(null);\n if (this._rendererIsDisposable) {\n this._renderer.dispose();\n this._renderer.forceContextLoss();\n }\n }\n /**\n * Will dispose of **all** assets used by this renderer.\n *\n *\n * @param disposeRenderTarget will dispose of the renderTarget which will not be usable later\n * set this to true if you passed the `renderTarget.texture` to a `PMREMGenerator`\n * or are otherwise done with it.\n *\n * @example\n * ```js\n * const loader = new HDRJPGLoader(renderer)\n * const result = await loader.loadAsync('gainmap.jpeg')\n * const mesh = new Mesh(geometry, new MeshBasicMaterial({ map: result.renderTarget.texture }) )\n * // DO NOT dispose the renderTarget here,\n * // it is used directly in the material\n * result.dispose()\n * ```\n *\n * @example\n * ```js\n * const loader = new HDRJPGLoader(renderer)\n * const pmremGenerator = new PMREMGenerator( renderer );\n * const result = await loader.loadAsync('gainmap.jpeg')\n * const envMap = pmremGenerator.fromEquirectangular(result.renderTarget.texture)\n * const mesh = new Mesh(geometry, new MeshStandardMaterial({ envMap }) )\n * // renderTarget can be disposed here\n * // because it was used to generate a PMREM texture\n * result.dispose(true)\n * ```\n */\n dispose(disposeRenderTarget) {\n this.disposeOnDemandRenderer();\n if (disposeRenderTarget) {\n this.renderTarget.dispose();\n }\n // dispose shader material texture uniforms\n if (this.material instanceof ShaderMaterial) {\n Object.values(this.material.uniforms).forEach(v => {\n if (v.value instanceof Texture)\n v.value.dispose();\n });\n }\n // dispose other material properties\n Object.values(this.material).forEach(value => {\n if (value instanceof Texture)\n value.dispose();\n });\n this.material.dispose();\n this._quad.geometry.dispose();\n }\n /**\n * Width of the texture\n */\n get width() { return this._width; }\n set width(value) {\n this._width = value;\n this._renderTarget.setSize(this._width, this._height);\n }\n /**\n * Height of the texture\n */\n get height() { return this._height; }\n set height(value) {\n this._height = value;\n this._renderTarget.setSize(this._width, this._height);\n }\n /**\n * The renderer used\n */\n get renderer() { return this._renderer; }\n /**\n * The `WebGLRenderTarget` used.\n */\n get renderTarget() { return this._renderTarget; }\n set renderTarget(value) {\n this._renderTarget = value;\n this._width = value.width;\n this._height = value.height;\n // this._type = value.texture.type\n }\n /**\n * The `Material` used.\n */\n get material() { return this._material; }\n /**\n *\n */\n get type() { return this._type; }\n get colorSpace() { return this._colorSpace; }\n}\n\nexport { QuadRenderer as Q };\n","/**\n * @monogrid/gainmap-js v3.1.0\n * With ❤️, by MONOGRID \n */\n\nimport { Q as QuadRenderer } from './QuadRenderer-DuOPRGA4.js';\nimport { ShaderMaterial, Vector3, NoBlending, SRGBColorSpace, LinearSRGBColorSpace, HalfFloatType, Loader, LoadingManager, Texture, UVMapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, FileLoader } from 'three';\n\nconst vertexShader = /* glsl */ `\nvarying vec2 vUv;\n\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\nconst fragmentShader = /* glsl */ `\n// min half float value\n#define HALF_FLOAT_MIN vec3( -65504, -65504, -65504 )\n// max half float value\n#define HALF_FLOAT_MAX vec3( 65504, 65504, 65504 )\n\nuniform sampler2D sdr;\nuniform sampler2D gainMap;\nuniform vec3 gamma;\nuniform vec3 offsetHdr;\nuniform vec3 offsetSdr;\nuniform vec3 gainMapMin;\nuniform vec3 gainMapMax;\nuniform float weightFactor;\n\nvarying vec2 vUv;\n\nvoid main() {\n vec3 rgb = texture2D( sdr, vUv ).rgb;\n vec3 recovery = texture2D( gainMap, vUv ).rgb;\n vec3 logRecovery = pow( recovery, gamma );\n vec3 logBoost = gainMapMin * ( 1.0 - logRecovery ) + gainMapMax * logRecovery;\n vec3 hdrColor = (rgb + offsetSdr) * exp2( logBoost * weightFactor ) - offsetHdr;\n vec3 clampedHdrColor = max( HALF_FLOAT_MIN, min( HALF_FLOAT_MAX, hdrColor ));\n gl_FragColor = vec4( clampedHdrColor , 1.0 );\n}\n`;\n/**\n * A Material which is able to decode the Gainmap into a full HDR Representation\n *\n * @category Materials\n * @group Materials\n */\nclass GainMapDecoderMaterial extends ShaderMaterial {\n /**\n *\n * @param params\n */\n constructor({ gamma, offsetHdr, offsetSdr, gainMapMin, gainMapMax, maxDisplayBoost, hdrCapacityMin, hdrCapacityMax, sdr, gainMap }) {\n super({\n name: 'GainMapDecoderMaterial',\n vertexShader,\n fragmentShader,\n uniforms: {\n sdr: { value: sdr },\n gainMap: { value: gainMap },\n gamma: { value: new Vector3(1.0 / gamma[0], 1.0 / gamma[1], 1.0 / gamma[2]) },\n offsetHdr: { value: new Vector3().fromArray(offsetHdr) },\n offsetSdr: { value: new Vector3().fromArray(offsetSdr) },\n gainMapMin: { value: new Vector3().fromArray(gainMapMin) },\n gainMapMax: { value: new Vector3().fromArray(gainMapMax) },\n weightFactor: {\n value: (Math.log2(maxDisplayBoost) - hdrCapacityMin) / (hdrCapacityMax - hdrCapacityMin)\n }\n },\n blending: NoBlending,\n depthTest: false,\n depthWrite: false\n });\n this._maxDisplayBoost = maxDisplayBoost;\n this._hdrCapacityMin = hdrCapacityMin;\n this._hdrCapacityMax = hdrCapacityMax;\n this.needsUpdate = true;\n this.uniformsNeedUpdate = true;\n }\n get sdr() { return this.uniforms.sdr.value; }\n set sdr(value) { this.uniforms.sdr.value = value; }\n get gainMap() { return this.uniforms.gainMap.value; }\n set gainMap(value) { this.uniforms.gainMap.value = value; }\n /**\n * @see {@link GainMapMetadata.offsetHdr}\n */\n get offsetHdr() { return this.uniforms.offsetHdr.value.toArray(); }\n set offsetHdr(value) { this.uniforms.offsetHdr.value.fromArray(value); }\n /**\n * @see {@link GainMapMetadata.offsetSdr}\n */\n get offsetSdr() { return this.uniforms.offsetSdr.value.toArray(); }\n set offsetSdr(value) { this.uniforms.offsetSdr.value.fromArray(value); }\n /**\n * @see {@link GainMapMetadata.gainMapMin}\n */\n get gainMapMin() { return this.uniforms.gainMapMin.value.toArray(); }\n set gainMapMin(value) { this.uniforms.gainMapMin.value.fromArray(value); }\n /**\n * @see {@link GainMapMetadata.gainMapMax}\n */\n get gainMapMax() { return this.uniforms.gainMapMax.value.toArray(); }\n set gainMapMax(value) { this.uniforms.gainMapMax.value.fromArray(value); }\n /**\n * @see {@link GainMapMetadata.gamma}\n */\n get gamma() {\n const g = this.uniforms.gamma.value;\n return [1 / g.x, 1 / g.y, 1 / g.z];\n }\n set gamma(value) {\n const g = this.uniforms.gamma.value;\n g.x = 1.0 / value[0];\n g.y = 1.0 / value[1];\n g.z = 1.0 / value[2];\n }\n /**\n * @see {@link GainMapMetadata.hdrCapacityMin}\n * @remarks Logarithmic space\n */\n get hdrCapacityMin() { return this._hdrCapacityMin; }\n set hdrCapacityMin(value) {\n this._hdrCapacityMin = value;\n this.calculateWeight();\n }\n /**\n * @see {@link GainMapMetadata.hdrCapacityMin}\n * @remarks Logarithmic space\n */\n get hdrCapacityMax() { return this._hdrCapacityMax; }\n set hdrCapacityMax(value) {\n this._hdrCapacityMax = value;\n this.calculateWeight();\n }\n /**\n * @see {@link GainmapDecodingParameters.maxDisplayBoost}\n * @remarks Non Logarithmic space\n */\n get maxDisplayBoost() { return this._maxDisplayBoost; }\n set maxDisplayBoost(value) {\n this._maxDisplayBoost = Math.max(1, Math.min(65504, value));\n this.calculateWeight();\n }\n calculateWeight() {\n const val = (Math.log2(this._maxDisplayBoost) - this._hdrCapacityMin) / (this._hdrCapacityMax - this._hdrCapacityMin);\n this.uniforms.weightFactor.value = Math.max(0, Math.min(1, val));\n }\n}\n\n/**\n * Decodes a gain map using a WebGLRenderTarget\n *\n * @category Decoding Functions\n * @group Decoding Functions\n * @example\n * import { decode } from '@monogrid/gainmap-js'\n * import {\n * Mesh,\n * MeshBasicMaterial,\n * PerspectiveCamera,\n * PlaneGeometry,\n * Scene,\n * TextureLoader,\n * WebGLRenderer\n * } from 'three'\n *\n * const renderer = new WebGLRenderer()\n *\n * const textureLoader = new TextureLoader()\n *\n * // load SDR Representation\n * const sdr = await textureLoader.loadAsync('sdr.jpg')\n * // load Gain map recovery image\n * const gainMap = await textureLoader.loadAsync('gainmap.jpg')\n * // load metadata\n * const metadata = await (await fetch('metadata.json')).json()\n *\n * const result = await decode({\n * sdr,\n * gainMap,\n * // this allows to use `result.renderTarget.texture` directly\n * renderer,\n * // this will restore the full HDR range\n * maxDisplayBoost: Math.pow(2, metadata.hdrCapacityMax),\n * ...metadata\n * })\n *\n * const scene = new Scene()\n * // `result` can be used to populate a Texture\n * const mesh = new Mesh(\n * new PlaneGeometry(),\n * new MeshBasicMaterial({ map: result.renderTarget.texture })\n * )\n * scene.add(mesh)\n * renderer.render(scene, new PerspectiveCamera())\n *\n * // result must be manually disposed\n * // when you are done using it\n * result.dispose()\n *\n * @param params\n * @returns\n * @throws {Error} if the WebGLRenderer fails to render the gain map\n */\nconst decode = (params) => {\n const { sdr, gainMap, renderer } = params;\n if (sdr.colorSpace !== SRGBColorSpace) {\n console.warn('SDR Colorspace needs to be *SRGBColorSpace*, setting it automatically');\n sdr.colorSpace = SRGBColorSpace;\n }\n sdr.needsUpdate = true;\n if (gainMap.colorSpace !== LinearSRGBColorSpace) {\n console.warn('Gainmap Colorspace needs to be *LinearSRGBColorSpace*, setting it automatically');\n gainMap.colorSpace = LinearSRGBColorSpace;\n }\n gainMap.needsUpdate = true;\n const material = new GainMapDecoderMaterial({\n ...params,\n sdr,\n gainMap\n });\n const quadRenderer = new QuadRenderer({\n // TODO: three types are generic, eslint complains here, see how we can solve\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n width: sdr.image.width,\n // TODO: three types are generic, eslint complains here, see how we can solve\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n height: sdr.image.height,\n type: HalfFloatType,\n colorSpace: LinearSRGBColorSpace,\n material,\n renderer,\n renderTargetOptions: params.renderTargetOptions\n });\n try {\n quadRenderer.render();\n }\n catch (e) {\n quadRenderer.disposeOnDemandRenderer();\n throw e;\n }\n return quadRenderer;\n};\n\nclass GainMapNotFoundError extends Error {\n}\n\nclass XMPMetadataNotFoundError extends Error {\n}\n\nconst getXMLValue = (xml, tag, defaultValue) => {\n // Check for attribute format first: tag=\"value\"\n const attributeMatch = new RegExp(`${tag}=\"([^\"]*)\"`, 'i').exec(xml);\n if (attributeMatch)\n return attributeMatch[1];\n // Check for tag format: value or value...\n const tagMatch = new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)`, 'i').exec(xml);\n if (tagMatch) {\n // Check if it contains rdf:li elements\n const liValues = tagMatch[1].match(/([^<]*)<\\/rdf:li>/g);\n if (liValues && liValues.length === 3) {\n return liValues.map(v => v.replace(/<\\/?rdf:li>/g, ''));\n }\n return tagMatch[1].trim();\n }\n if (defaultValue !== undefined)\n return defaultValue;\n throw new Error(`Can't find ${tag} in gainmap metadata`);\n};\nconst extractXMP = (input) => {\n let str;\n // support node test environment\n if (typeof TextDecoder !== 'undefined')\n str = new TextDecoder().decode(input);\n else\n str = input.toString();\n let start = str.indexOf('', start);\n const xmpBlock = str.slice(start, end + 10);\n try {\n const gainMapMin = getXMLValue(xmpBlock, 'hdrgm:GainMapMin', '0');\n const gainMapMax = getXMLValue(xmpBlock, 'hdrgm:GainMapMax');\n const gamma = getXMLValue(xmpBlock, 'hdrgm:Gamma', '1');\n const offsetSDR = getXMLValue(xmpBlock, 'hdrgm:OffsetSDR', '0.015625');\n const offsetHDR = getXMLValue(xmpBlock, 'hdrgm:OffsetHDR', '0.015625');\n // These are always attributes, so we can use a simpler regex\n const hdrCapacityMinMatch = /hdrgm:HDRCapacityMin=\"([^\"]*)\"/.exec(xmpBlock);\n const hdrCapacityMin = hdrCapacityMinMatch ? hdrCapacityMinMatch[1] : '0';\n const hdrCapacityMaxMatch = /hdrgm:HDRCapacityMax=\"([^\"]*)\"/.exec(xmpBlock);\n if (!hdrCapacityMaxMatch)\n throw new Error('Incomplete gainmap metadata');\n const hdrCapacityMax = hdrCapacityMaxMatch[1];\n return {\n gainMapMin: Array.isArray(gainMapMin) ? gainMapMin.map(v => parseFloat(v)) : [parseFloat(gainMapMin), parseFloat(gainMapMin), parseFloat(gainMapMin)],\n gainMapMax: Array.isArray(gainMapMax) ? gainMapMax.map(v => parseFloat(v)) : [parseFloat(gainMapMax), parseFloat(gainMapMax), parseFloat(gainMapMax)],\n gamma: Array.isArray(gamma) ? gamma.map(v => parseFloat(v)) : [parseFloat(gamma), parseFloat(gamma), parseFloat(gamma)],\n offsetSdr: Array.isArray(offsetSDR) ? offsetSDR.map(v => parseFloat(v)) : [parseFloat(offsetSDR), parseFloat(offsetSDR), parseFloat(offsetSDR)],\n offsetHdr: Array.isArray(offsetHDR) ? offsetHDR.map(v => parseFloat(v)) : [parseFloat(offsetHDR), parseFloat(offsetHDR), parseFloat(offsetHDR)],\n hdrCapacityMin: parseFloat(hdrCapacityMin),\n hdrCapacityMax: parseFloat(hdrCapacityMax)\n };\n }\n catch (e) {\n // Continue searching for another xmpmeta block if this one fails\n }\n start = str.indexOf(' {\n const debug = this.options.debug;\n const dataView = new DataView(imageArrayBuffer.buffer);\n // If you're executing this line on a big endian machine, it'll be reversed.\n // bigEnd further down though, refers to the endianness of the image itself.\n if (dataView.getUint16(0) !== 0xffd8) {\n reject(new Error('Not a valid jpeg'));\n return;\n }\n const length = dataView.byteLength;\n let offset = 2;\n let loops = 0;\n let marker; // APP# marker\n while (offset < length) {\n if (++loops > 250) {\n reject(new Error(`Found no marker after ${loops} loops 😵`));\n return;\n }\n if (dataView.getUint8(offset) !== 0xff) {\n reject(new Error(`Not a valid marker at offset 0x${offset.toString(16)}, found: 0x${dataView.getUint8(offset).toString(16)}`));\n return;\n }\n marker = dataView.getUint8(offset + 1);\n if (debug)\n console.log(`Marker: ${marker.toString(16)}`);\n if (marker === 0xe2) {\n if (debug)\n console.log('Found APP2 marker (0xffe2)');\n // Works for iPhone 8 Plus, X, and XSMax. Or any photos of MPF format.\n // Great way to visualize image information in html is using Exiftool. E.g.:\n // ./exiftool.exe -htmldump -wantTrailer photo.jpg > photo.html\n const formatPt = offset + 4;\n /*\n * Structure of the MP Format Identifier\n *\n * Offset Addr. | Code (Hex) | Description\n * +00 ff Marker Prefix <-- offset\n * +01 e2 APP2\n * +02 #n APP2 Field Length\n * +03 #n APP2 Field Length\n * +04 4d 'M' <-- formatPt\n * +05 50 'P'\n * +06 46 'F'\n * +07 00 NULL\n * <-- tiffOffset\n */\n if (dataView.getUint32(formatPt) === 0x4d504600) {\n // Found MPF tag, so we start dig out sub images\n const tiffOffset = formatPt + 4;\n let bigEnd; // Endianness from TIFF header\n // Test for TIFF validity and endianness\n // 0x4949 and 0x4D4D ('II' and 'MM') marks Little Endian and Big Endian\n if (dataView.getUint16(tiffOffset) === 0x4949) {\n bigEnd = false;\n }\n else if (dataView.getUint16(tiffOffset) === 0x4d4d) {\n bigEnd = true;\n }\n else {\n reject(new Error('No valid endianness marker found in TIFF header'));\n return;\n }\n if (dataView.getUint16(tiffOffset + 2, !bigEnd) !== 0x002a) {\n reject(new Error('Not valid TIFF data! (no 0x002A marker)'));\n return;\n }\n // 32 bit number stating the offset from the start of the 8 Byte MP Header\n // to MP Index IFD Least possible value is thus 8 (means 0 offset)\n const firstIFDOffset = dataView.getUint32(tiffOffset + 4, !bigEnd);\n if (firstIFDOffset < 0x00000008) {\n reject(new Error('Not valid TIFF data! (First offset less than 8)'));\n return;\n }\n // Move ahead to MP Index IFD\n // Assume we're at the first IFD, so firstIFDOffset points to\n // MP Index IFD and not MP Attributes IFD. (If we try extract from a sub image,\n // we fail silently here due to this assumption)\n // Count (2 Byte) | MP Index Fields a.k.a. MP Entries (count * 12 Byte) | Offset of Next IFD (4 Byte)\n const dirStart = tiffOffset + firstIFDOffset; // Start of IFD (Image File Directory)\n const count = dataView.getUint16(dirStart, !bigEnd); // Count of MPEntries (2 Byte)\n // Extract info from MPEntries (starting after Count)\n const entriesStart = dirStart + 2;\n let numberOfImages = 0;\n for (let i = entriesStart; i < entriesStart + 12 * count; i += 12) {\n // Each entry is 12 Bytes long\n // Check MP Index IFD tags, here we only take tag 0xb001 = Number of images\n if (dataView.getUint16(i, !bigEnd) === 0xb001) {\n // stored in Last 4 bytes of its 12 Byte entry.\n numberOfImages = dataView.getUint32(i + 8, !bigEnd);\n }\n }\n const nextIFDOffsetLen = 4; // 4 Byte offset field that appears after MP Index IFD tags\n const MPImageListValPt = dirStart + 2 + count * 12 + nextIFDOffsetLen;\n const images = [];\n for (let i = MPImageListValPt; i < MPImageListValPt + numberOfImages * 16; i += 16) {\n const image = {\n MPType: dataView.getUint32(i, !bigEnd),\n size: dataView.getUint32(i + 4, !bigEnd),\n // This offset is specified relative to the address of the MP Endian\n // field in the MP Header, unless the image is a First Individual Image,\n // in which case the value of the offset shall be NULL (0x00000000).\n dataOffset: dataView.getUint32(i + 8, !bigEnd),\n dependantImages: dataView.getUint32(i + 12, !bigEnd),\n start: -1,\n end: -1,\n isFII: false\n };\n if (!image.dataOffset) {\n // dataOffset is 0x00000000 for First Individual Image\n image.start = 0;\n image.isFII = true;\n }\n else {\n image.start = tiffOffset + image.dataOffset;\n image.isFII = false;\n }\n image.end = image.start + image.size;\n images.push(image);\n }\n if (this.options.extractNonFII && images.length) {\n const bufferBlob = new Blob([dataView]);\n const imgs = [];\n for (const image of images) {\n if (image.isFII && !this.options.extractFII) {\n continue; // Skip FII\n }\n const imageBlob = bufferBlob.slice(image.start, image.end + 1, 'image/jpeg');\n // we don't need this\n // const imageUrl = URL.createObjectURL(imageBlob)\n // image.img = document.createElement('img')\n // image.img.src = imageUrl\n imgs.push(imageBlob);\n }\n resolve(imgs);\n }\n }\n }\n offset += 2 + dataView.getUint16(offset + 2);\n }\n });\n }\n}\n\n/**\n * Extracts XMP Metadata and the gain map recovery image\n * from a single JPEG file.\n *\n * @category Decoding Functions\n * @group Decoding Functions\n * @param jpegFile an `Uint8Array` containing and encoded JPEG file\n * @returns an sdr `Uint8Array` compressed in JPEG, a gainMap `Uint8Array` compressed in JPEG and the XMP parsed XMP metadata\n * @throws Error if XMP Metadata is not found\n * @throws Error if Gain map image is not found\n * @example\n * import { FileLoader } from 'three'\n * import { extractGainmapFromJPEG } from '@monogrid/gainmap-js'\n *\n * const jpegFile = await new FileLoader()\n * .setResponseType('arraybuffer')\n * .loadAsync('image.jpg')\n *\n * const { sdr, gainMap, metadata } = extractGainmapFromJPEG(jpegFile)\n */\nconst extractGainmapFromJPEG = async (jpegFile) => {\n const metadata = extractXMP(jpegFile);\n if (!metadata)\n throw new XMPMetadataNotFoundError('Gain map XMP metadata not found');\n const mpfExtractor = new MPFExtractor({ extractFII: true, extractNonFII: true });\n const images = await mpfExtractor.extract(jpegFile);\n if (images.length !== 2)\n throw new GainMapNotFoundError('Gain map recovery image not found');\n return {\n sdr: new Uint8Array(await images[0].arrayBuffer()),\n gainMap: new Uint8Array(await images[1].arrayBuffer()),\n metadata\n };\n};\n\n/**\n * private function, async get image from blob\n *\n * @param blob\n * @returns\n */\nconst getHTMLImageFromBlob = (blob) => {\n return new Promise((resolve, reject) => {\n const img = document.createElement('img');\n img.onload = () => { resolve(img); };\n img.onerror = (e) => { reject(e); };\n img.src = URL.createObjectURL(blob);\n });\n};\n\nclass LoaderBase extends Loader {\n /**\n *\n * @param renderer\n * @param manager\n */\n constructor(renderer, manager) {\n super(manager);\n if (renderer)\n this._renderer = renderer;\n this._internalLoadingManager = new LoadingManager();\n }\n /**\n * Specify the renderer to use when rendering the gain map\n *\n * @param renderer\n * @returns\n */\n setRenderer(renderer) {\n this._renderer = renderer;\n return this;\n }\n /**\n * Specify the renderTarget options to use when rendering the gain map\n *\n * @param options\n * @returns\n */\n setRenderTargetOptions(options) {\n this._renderTargetOptions = options;\n return this;\n }\n /**\n * @private\n * @returns\n */\n prepareQuadRenderer() {\n if (!this._renderer)\n console.warn('WARNING: An existing WebGL Renderer was not passed to this Loader constructor or in setRenderer, the result of this Loader will need to be converted to a Data Texture with toDataTexture() before you can use it in your renderer.');\n // temporary values\n const material = new GainMapDecoderMaterial({\n gainMapMax: [1, 1, 1],\n gainMapMin: [0, 0, 0],\n gamma: [1, 1, 1],\n offsetHdr: [1, 1, 1],\n offsetSdr: [1, 1, 1],\n hdrCapacityMax: 1,\n hdrCapacityMin: 0,\n maxDisplayBoost: 1,\n gainMap: new Texture(),\n sdr: new Texture()\n });\n return new QuadRenderer({\n width: 16,\n height: 16,\n type: HalfFloatType,\n colorSpace: LinearSRGBColorSpace,\n material,\n renderer: this._renderer,\n renderTargetOptions: this._renderTargetOptions\n });\n }\n /**\n * @private\n * @param quadRenderer\n * @param metadata\n * @param sdrBuffer\n * @param gainMapBuffer\n */\n async render(quadRenderer, metadata, sdrBuffer, gainMapBuffer) {\n // this is optional, will render a black gain-map if not present\n const gainMapBlob = gainMapBuffer ? new Blob([gainMapBuffer], { type: 'image/jpeg' }) : undefined;\n const sdrBlob = new Blob([sdrBuffer], { type: 'image/jpeg' });\n let sdrImage;\n let gainMapImage;\n let needsFlip = false;\n if (typeof createImageBitmap === 'undefined') {\n const res = await Promise.all([\n gainMapBlob ? getHTMLImageFromBlob(gainMapBlob) : Promise.resolve(undefined),\n getHTMLImageFromBlob(sdrBlob)\n ]);\n gainMapImage = res[0];\n sdrImage = res[1];\n needsFlip = true;\n }\n else {\n const res = await Promise.all([\n gainMapBlob ? createImageBitmap(gainMapBlob, { imageOrientation: 'flipY' }) : Promise.resolve(undefined),\n createImageBitmap(sdrBlob, { imageOrientation: 'flipY' })\n ]);\n gainMapImage = res[0];\n sdrImage = res[1];\n }\n const gainMap = new Texture(gainMapImage || new ImageData(2, 2), UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, 1, LinearSRGBColorSpace);\n gainMap.flipY = needsFlip;\n gainMap.needsUpdate = true;\n const sdr = new Texture(sdrImage, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, LinearMipMapLinearFilter, RGBAFormat, UnsignedByteType, 1, SRGBColorSpace);\n sdr.flipY = needsFlip;\n sdr.needsUpdate = true;\n quadRenderer.width = sdrImage.width;\n quadRenderer.height = sdrImage.height;\n quadRenderer.material.gainMap = gainMap;\n quadRenderer.material.sdr = sdr;\n quadRenderer.material.gainMapMin = metadata.gainMapMin;\n quadRenderer.material.gainMapMax = metadata.gainMapMax;\n quadRenderer.material.offsetHdr = metadata.offsetHdr;\n quadRenderer.material.offsetSdr = metadata.offsetSdr;\n quadRenderer.material.gamma = metadata.gamma;\n quadRenderer.material.hdrCapacityMin = metadata.hdrCapacityMin;\n quadRenderer.material.hdrCapacityMax = metadata.hdrCapacityMax;\n quadRenderer.material.maxDisplayBoost = Math.pow(2, metadata.hdrCapacityMax);\n quadRenderer.material.needsUpdate = true;\n quadRenderer.render();\n }\n}\n\n/**\n * A Three.js Loader for the gain map format.\n *\n * @category Loaders\n * @group Loaders\n *\n * @example\n * import { GainMapLoader } from '@monogrid/gainmap-js'\n * import {\n * EquirectangularReflectionMapping,\n * LinearFilter,\n * Mesh,\n * MeshBasicMaterial,\n * PerspectiveCamera,\n * PlaneGeometry,\n * Scene,\n * WebGLRenderer\n * } from 'three'\n *\n * const renderer = new WebGLRenderer()\n *\n * const loader = new GainMapLoader(renderer)\n *\n * const result = await loader.loadAsync(['sdr.jpeg', 'gainmap.jpeg', 'metadata.json'])\n * // `result` can be used to populate a Texture\n *\n * const scene = new Scene()\n * const mesh = new Mesh(\n * new PlaneGeometry(),\n * new MeshBasicMaterial({ map: result.renderTarget.texture })\n * )\n * scene.add(mesh)\n * renderer.render(scene, new PerspectiveCamera())\n *\n * // Starting from three.js r159\n * // `result.renderTarget.texture` can\n * // also be used as Equirectangular scene background\n * //\n * // it was previously needed to convert it\n * // to a DataTexture with `result.toDataTexture()`\n * scene.background = result.renderTarget.texture\n * scene.background.mapping = EquirectangularReflectionMapping\n *\n * // result must be manually disposed\n * // when you are done using it\n * result.dispose()\n *\n */\nclass GainMapLoader extends LoaderBase {\n /**\n * Loads a gainmap using separate data\n * * sdr image\n * * gain map image\n * * metadata json\n *\n * useful for webp gain maps\n *\n * @param urls An array in the form of [sdr.jpg, gainmap.jpg, metadata.json]\n * @param onLoad Load complete callback, will receive the result\n * @param onProgress Progress callback, will receive a {@link ProgressEvent}\n * @param onError Error callback\n * @returns\n */\n load([sdrUrl, gainMapUrl, metadataUrl], onLoad, onProgress, onError) {\n const quadRenderer = this.prepareQuadRenderer();\n let sdr;\n let gainMap;\n let metadata;\n const loadCheck = async () => {\n if (sdr && gainMap && metadata) {\n // solves #16\n try {\n await this.render(quadRenderer, metadata, sdr, gainMap);\n }\n catch (error) {\n this.manager.itemError(sdrUrl);\n this.manager.itemError(gainMapUrl);\n this.manager.itemError(metadataUrl);\n if (typeof onError === 'function')\n onError(error);\n quadRenderer.disposeOnDemandRenderer();\n return;\n }\n if (typeof onLoad === 'function')\n onLoad(quadRenderer);\n this.manager.itemEnd(sdrUrl);\n this.manager.itemEnd(gainMapUrl);\n this.manager.itemEnd(metadataUrl);\n quadRenderer.disposeOnDemandRenderer();\n }\n };\n let sdrLengthComputable = true;\n let sdrTotal = 0;\n let sdrLoaded = 0;\n let gainMapLengthComputable = true;\n let gainMapTotal = 0;\n let gainMapLoaded = 0;\n let metadataLengthComputable = true;\n let metadataTotal = 0;\n let metadataLoaded = 0;\n const progressHandler = () => {\n if (typeof onProgress === 'function') {\n const total = sdrTotal + gainMapTotal + metadataTotal;\n const loaded = sdrLoaded + gainMapLoaded + metadataLoaded;\n const lengthComputable = sdrLengthComputable && gainMapLengthComputable && metadataLengthComputable;\n onProgress(new ProgressEvent('progress', { lengthComputable, loaded, total }));\n }\n };\n this.manager.itemStart(sdrUrl);\n this.manager.itemStart(gainMapUrl);\n this.manager.itemStart(metadataUrl);\n const sdrLoader = new FileLoader(this._internalLoadingManager);\n sdrLoader.setResponseType('arraybuffer');\n sdrLoader.setRequestHeader(this.requestHeader);\n sdrLoader.setPath(this.path);\n sdrLoader.setWithCredentials(this.withCredentials);\n sdrLoader.load(sdrUrl, async (buffer) => {\n /* istanbul ignore if\n this condition exists only because of three.js types + strict mode\n */\n if (typeof buffer === 'string')\n throw new Error('Invalid sdr buffer');\n sdr = buffer;\n await loadCheck();\n }, (e) => {\n sdrLengthComputable = e.lengthComputable;\n sdrLoaded = e.loaded;\n sdrTotal = e.total;\n progressHandler();\n }, (error) => {\n this.manager.itemError(sdrUrl);\n if (typeof onError === 'function')\n onError(error);\n });\n const gainMapLoader = new FileLoader(this._internalLoadingManager);\n gainMapLoader.setResponseType('arraybuffer');\n gainMapLoader.setRequestHeader(this.requestHeader);\n gainMapLoader.setPath(this.path);\n gainMapLoader.setWithCredentials(this.withCredentials);\n gainMapLoader.load(gainMapUrl, async (buffer) => {\n /* istanbul ignore if\n this condition exists only because of three.js types + strict mode\n */\n if (typeof buffer === 'string')\n throw new Error('Invalid gainmap buffer');\n gainMap = buffer;\n await loadCheck();\n }, (e) => {\n gainMapLengthComputable = e.lengthComputable;\n gainMapLoaded = e.loaded;\n gainMapTotal = e.total;\n progressHandler();\n }, (error) => {\n this.manager.itemError(gainMapUrl);\n if (typeof onError === 'function')\n onError(error);\n });\n const metadataLoader = new FileLoader(this._internalLoadingManager);\n // metadataLoader.setResponseType('json')\n metadataLoader.setRequestHeader(this.requestHeader);\n metadataLoader.setPath(this.path);\n metadataLoader.setWithCredentials(this.withCredentials);\n metadataLoader.load(metadataUrl, async (json) => {\n /* istanbul ignore if\n this condition exists only because of three.js types + strict mode\n */\n if (typeof json !== 'string')\n throw new Error('Invalid metadata string');\n // TODO: implement check on JSON file and remove this eslint disable\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n metadata = JSON.parse(json);\n await loadCheck();\n }, (e) => {\n metadataLengthComputable = e.lengthComputable;\n metadataLoaded = e.loaded;\n metadataTotal = e.total;\n progressHandler();\n }, (error) => {\n this.manager.itemError(metadataUrl);\n if (typeof onError === 'function')\n onError(error);\n });\n return quadRenderer;\n }\n}\n\n/**\n * A Three.js Loader for a JPEG with embedded gainmap metadata.\n *\n * @category Loaders\n * @group Loaders\n *\n * @example\n * import { HDRJPGLoader } from '@monogrid/gainmap-js'\n * import {\n * EquirectangularReflectionMapping,\n * LinearFilter,\n * Mesh,\n * MeshBasicMaterial,\n * PerspectiveCamera,\n * PlaneGeometry,\n * Scene,\n * WebGLRenderer\n * } from 'three'\n *\n * const renderer = new WebGLRenderer()\n *\n * const loader = new HDRJPGLoader(renderer)\n *\n * const result = await loader.loadAsync('gainmap.jpeg')\n * // `result` can be used to populate a Texture\n *\n * const scene = new Scene()\n * const mesh = new Mesh(\n * new PlaneGeometry(),\n * new MeshBasicMaterial({ map: result.renderTarget.texture })\n * )\n * scene.add(mesh)\n * renderer.render(scene, new PerspectiveCamera())\n *\n * // Starting from three.js r159\n * // `result.renderTarget.texture` can\n * // also be used as Equirectangular scene background\n * //\n * // it was previously needed to convert it\n * // to a DataTexture with `result.toDataTexture()`\n * scene.background = result.renderTarget.texture\n * scene.background.mapping = EquirectangularReflectionMapping\n *\n * // result must be manually disposed\n * // when you are done using it\n * result.dispose()\n *\n */\nclass HDRJPGLoader extends LoaderBase {\n /**\n * Loads a JPEG containing gain map metadata\n * Renders a normal SDR image if gainmap data is not found\n *\n * @param url An array in the form of [sdr.jpg, gainmap.jpg, metadata.json]\n * @param onLoad Load complete callback, will receive the result\n * @param onProgress Progress callback, will receive a {@link ProgressEvent}\n * @param onError Error callback\n * @returns\n */\n load(url, onLoad, onProgress, onError) {\n const quadRenderer = this.prepareQuadRenderer();\n const loader = new FileLoader(this._internalLoadingManager);\n loader.setResponseType('arraybuffer');\n loader.setRequestHeader(this.requestHeader);\n loader.setPath(this.path);\n loader.setWithCredentials(this.withCredentials);\n this.manager.itemStart(url);\n loader.load(url, async (jpeg) => {\n /* istanbul ignore if\n this condition exists only because of three.js types + strict mode\n */\n if (typeof jpeg === 'string')\n throw new Error('Invalid buffer, received [string], was expecting [ArrayBuffer]');\n const jpegBuffer = new Uint8Array(jpeg);\n let sdrJPEG;\n let gainMapJPEG;\n let metadata;\n try {\n const extractionResult = await extractGainmapFromJPEG(jpegBuffer);\n // gain map is successfully reconstructed\n sdrJPEG = extractionResult.sdr;\n gainMapJPEG = extractionResult.gainMap;\n metadata = extractionResult.metadata;\n }\n catch (e) {\n // render the SDR version if this is not a gainmap\n if (e instanceof XMPMetadataNotFoundError || e instanceof GainMapNotFoundError) {\n console.warn(`Failure to reconstruct an HDR image from ${url}: Gain map metadata not found in the file, HDRJPGLoader will render the SDR jpeg`);\n metadata = {\n gainMapMin: [0, 0, 0],\n gainMapMax: [1, 1, 1],\n gamma: [1, 1, 1],\n hdrCapacityMin: 0,\n hdrCapacityMax: 1,\n offsetHdr: [0, 0, 0],\n offsetSdr: [0, 0, 0]\n };\n sdrJPEG = jpegBuffer;\n }\n else {\n throw e;\n }\n }\n // solves #16\n try {\n await this.render(quadRenderer, metadata, sdrJPEG, gainMapJPEG);\n }\n catch (error) {\n this.manager.itemError(url);\n if (typeof onError === 'function')\n onError(error);\n quadRenderer.disposeOnDemandRenderer();\n return;\n }\n if (typeof onLoad === 'function')\n onLoad(quadRenderer);\n this.manager.itemEnd(url);\n quadRenderer.disposeOnDemandRenderer();\n }, onProgress, (error) => {\n this.manager.itemError(url);\n if (typeof onError === 'function')\n onError(error);\n });\n return quadRenderer;\n }\n}\n\nexport { GainMapDecoderMaterial, GainMapLoader, HDRJPGLoader, HDRJPGLoader as JPEGRLoader, MPFExtractor, QuadRenderer, decode, extractGainmapFromJPEG, extractXMP };\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearSRGBColorSpace\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* default error routine. change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: throw new Error( 'THREE.RGBELoader: Read Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_write_error: throw new Error( 'THREE.RGBELoader: Write Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_format_error: throw new Error( 'THREE.RGBELoader: Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: throw new Error( 'THREE.RGBELoader: Memory Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading. modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\trgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tconst w = rgbe_header_info.width,\n\t\t\th = rgbe_header_info.height,\n\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\n\t\tlet data, type;\n\t\tlet numElements;\n\n\t\tswitch ( this.type ) {\n\n\t\t\tcase FloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = floatArray;\n\t\t\t\ttype = FloatType;\n\t\t\t\tbreak;\n\n\t\t\tcase HalfFloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = halfArray;\n\t\t\t\ttype = HalfFloatType;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tthrow new Error( 'THREE.RGBELoader: Unsupported type: ' + this.type );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn {\n\t\t\twidth: w, height: h,\n\t\t\tdata: data,\n\t\t\theader: rgbe_header_info.string,\n\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\texposure: rgbe_header_info.exposure,\n\t\t\ttype: type\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","/* @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { BackSide, BoxGeometry, Mesh, MeshBasicMaterial, MeshStandardMaterial, PointLight, Scene } from 'three';\nconst legacy = {\n topLight: {\n intensity: 500,\n position: [0.418, 16.199, 0.300],\n },\n room: {\n position: [-0.757, 13.219, 0.717],\n scale: [31.713, 28.305, 28.591],\n },\n boxes: [\n {\n position: [-10.906, 2.009, 1.846],\n rotation: -0.195,\n scale: [2.328, 7.905, 4.651],\n },\n {\n position: [-5.607, -0.754, -0.758],\n rotation: 0.994,\n scale: [1.970, 1.534, 3.955],\n },\n {\n position: [6.167, 0.857, 7.803],\n rotation: 0.561,\n scale: [3.927, 6.285, 3.687],\n },\n {\n position: [-2.017, 0.018, 6.124],\n rotation: 0.333,\n scale: [2.002, 4.566, 2.064],\n },\n {\n position: [2.291, -0.756, -2.621],\n rotation: -0.286,\n scale: [1.546, 1.552, 1.496],\n },\n {\n position: [-2.193, -0.369, -5.547],\n rotation: 0.516,\n scale: [3.875, 3.487, 2.986],\n },\n ],\n lights: [\n {\n intensity: 50,\n position: [-16.116, 14.37, 8.208],\n scale: [0.1, 2.428, 2.739],\n },\n {\n intensity: 50,\n position: [-16.109, 18.021, -8.207],\n scale: [0.1, 2.425, 2.751],\n },\n {\n intensity: 17,\n position: [14.904, 12.198, -1.832],\n scale: [0.15, 4.265, 6.331],\n },\n {\n intensity: 43,\n position: [-0.462, 8.89, 14.520],\n scale: [4.38, 5.441, 0.088],\n },\n {\n intensity: 20,\n position: [3.235, 11.486, -12.541],\n scale: [2.5, 2.0, 0.1],\n },\n {\n intensity: 100,\n position: [0.0, 20.0, 0.0],\n scale: [1.0, 0.1, 1.0],\n },\n ]\n};\nconst neutral = {\n topLight: {\n intensity: 400,\n position: [0.5, 14.0, 0.5],\n },\n room: {\n position: [0.0, 13.2, 0.0],\n scale: [31.5, 28.5, 31.5],\n },\n boxes: [\n {\n position: [-10.906, -1.0, 1.846],\n rotation: -0.195,\n scale: [2.328, 7.905, 4.651],\n },\n {\n position: [-5.607, -0.754, -0.758],\n rotation: 0.994,\n scale: [1.970, 1.534, 3.955],\n },\n {\n position: [6.167, -0.16, 7.803],\n rotation: 0.561,\n scale: [3.927, 6.285, 3.687],\n },\n {\n position: [-2.017, 0.018, 6.124],\n rotation: 0.333,\n scale: [2.002, 4.566, 2.064],\n },\n {\n position: [2.291, -0.756, -2.621],\n rotation: -0.286,\n scale: [1.546, 1.552, 1.496],\n },\n {\n position: [-2.193, -0.369, -5.547],\n rotation: 0.516,\n scale: [3.875, 3.487, 2.986],\n },\n ],\n lights: [\n {\n intensity: 80,\n position: [-14.0, 10.0, 8.0],\n scale: [0.1, 2.5, 2.5],\n },\n {\n intensity: 80,\n position: [-14.0, 14.0, -4.0],\n scale: [0.1, 2.5, 2.5],\n },\n {\n intensity: 23,\n position: [14.0, 12.0, 0.0],\n scale: [0.1, 5.0, 5.0],\n },\n {\n intensity: 16,\n position: [0.0, 9.0, 14.0],\n scale: [5.0, 5.0, 0.1],\n },\n {\n intensity: 80,\n position: [7.0, 8.0, -14.0],\n scale: [2.5, 2.5, 0.1],\n },\n {\n intensity: 80,\n position: [-7.0, 16.0, -14.0],\n scale: [2.5, 2.5, 0.1],\n },\n {\n intensity: 1,\n position: [0.0, 20.0, 0.0],\n scale: [0.1, 0.1, 0.1],\n },\n ]\n};\nexport default class EnvironmentScene extends Scene {\n constructor(name) {\n super();\n this.position.y = -3.5;\n const geometry = new BoxGeometry();\n geometry.deleteAttribute('uv');\n const roomMaterial = new MeshStandardMaterial({ metalness: 0, side: BackSide });\n const boxMaterial = new MeshStandardMaterial({ metalness: 0 });\n const data = name == 'legacy' ? legacy : neutral;\n const mainLight = new PointLight(0xffffff, data.topLight.intensity, 28, 2);\n mainLight.position.set(...data.topLight.position);\n this.add(mainLight);\n const room = new Mesh(geometry, roomMaterial);\n room.position.set(...data.room.position);\n room.scale.set(...data.room.scale);\n this.add(room);\n for (const box of data.boxes) {\n const box1 = new Mesh(geometry, boxMaterial);\n box1.position.set(...box.position);\n box1.rotation.set(0, box.rotation, 0);\n box1.scale.set(...box.scale);\n this.add(box1);\n }\n for (const light of data.lights) {\n const light1 = new Mesh(geometry, this.createAreaLightMaterial(light.intensity));\n light1.position.set(...light.position);\n light1.scale.set(...light.scale);\n this.add(light1);\n }\n }\n createAreaLightMaterial(intensity) {\n const material = new MeshBasicMaterial();\n material.color.setScalar(intensity);\n return material;\n }\n}\n//# sourceMappingURL=EnvironmentScene.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { HDRJPGLoader } from '@monogrid/gainmap-js';\nimport { BackSide, BoxGeometry, CubeCamera, EquirectangularReflectionMapping, HalfFloatType, LinearSRGBColorSpace, Mesh, NoBlending, NoToneMapping, RGBAFormat, Scene, ShaderMaterial, SRGBColorSpace, TextureLoader, Vector3, WebGLCubeRenderTarget } from 'three';\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\nimport { deserializeUrl, timePasses } from '../utilities.js';\nimport EnvironmentScene from './EnvironmentScene.js';\nconst GENERATED_SIGMA = 0.04;\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\nconst HDR_FILE_RE = /\\.hdr(\\.js)?$/;\nexport default class TextureUtils {\n constructor(threeRenderer) {\n this.threeRenderer = threeRenderer;\n this.lottieLoaderUrl = '';\n this._ldrLoader = null;\n this._imageLoader = null;\n this._hdrLoader = null;\n this._lottieLoader = null;\n this.generatedEnvironmentMap = null;\n this.generatedEnvironmentMapAlt = null;\n this.skyboxCache = new Map();\n this.blurMaterial = null;\n this.blurScene = null;\n }\n ldrLoader(withCredentials) {\n if (this._ldrLoader == null) {\n this._ldrLoader = new TextureLoader();\n }\n this._ldrLoader.setWithCredentials(withCredentials);\n return this._ldrLoader;\n }\n imageLoader(withCredentials) {\n if (this._imageLoader == null) {\n this._imageLoader = new HDRJPGLoader(this.threeRenderer);\n }\n this._imageLoader.setWithCredentials(withCredentials);\n return this._imageLoader;\n }\n hdrLoader(withCredentials) {\n if (this._hdrLoader == null) {\n this._hdrLoader = new RGBELoader();\n this._hdrLoader.setDataType(HalfFloatType);\n }\n this._hdrLoader.setWithCredentials(withCredentials);\n return this._hdrLoader;\n }\n async getLottieLoader(withCredentials) {\n if (this._lottieLoader == null) {\n const { LottieLoader } = await import(/* webpackIgnore: true */ this.lottieLoaderUrl);\n this._lottieLoader = new LottieLoader();\n }\n this._lottieLoader.setWithCredentials(withCredentials);\n return this._lottieLoader;\n }\n async loadImage(url, withCredentials) {\n const texture = await new Promise((resolve, reject) => this.ldrLoader(withCredentials)\n .load(url, resolve, () => { }, reject));\n texture.name = url;\n texture.flipY = false;\n return texture;\n }\n async loadLottie(url, quality, withCredentials) {\n const loader = await this.getLottieLoader(withCredentials);\n loader.setQuality(quality);\n const texture = await new Promise((resolve, reject) => loader.load(url, resolve, () => { }, reject));\n texture.name = url;\n return texture;\n }\n async loadEquirect(url, withCredentials = false, progressCallback = () => { }) {\n try {\n const isHDR = HDR_FILE_RE.test(url);\n const loader = isHDR ? this.hdrLoader(withCredentials) :\n this.imageLoader(withCredentials);\n const texture = await new Promise((resolve, reject) => loader.load(url, (result) => {\n const { renderTarget } = result;\n if (renderTarget != null) {\n const { texture } = renderTarget;\n result.dispose(false);\n resolve(texture);\n }\n else {\n resolve(result);\n }\n }, (event) => {\n progressCallback(event.loaded / event.total * 0.9);\n }, reject));\n progressCallback(1.0);\n texture.name = url;\n texture.mapping = EquirectangularReflectionMapping;\n if (!isHDR) {\n texture.colorSpace = SRGBColorSpace;\n }\n return texture;\n }\n finally {\n if (progressCallback) {\n progressCallback(1);\n }\n }\n }\n /**\n * Returns a { skybox, environmentMap } object with the targets/textures\n * accordingly. `skybox` is a WebGLRenderCubeTarget, and `environmentMap`\n * is a Texture from a WebGLRenderCubeTarget.\n */\n async generateEnvironmentMapAndSkybox(skyboxUrl = null, environmentMapUrl = null, progressCallback = () => { }, withCredentials = false) {\n const useAltEnvironment = environmentMapUrl !== 'legacy';\n if (environmentMapUrl === 'legacy' || environmentMapUrl === 'neutral') {\n environmentMapUrl = null;\n }\n environmentMapUrl = deserializeUrl(environmentMapUrl);\n let skyboxLoads = Promise.resolve(null);\n let environmentMapLoads;\n // If we have a skybox URL, attempt to load it as a cubemap\n if (!!skyboxUrl) {\n skyboxLoads = this.loadEquirectFromUrl(skyboxUrl, withCredentials, progressCallback);\n }\n if (!!environmentMapUrl) {\n // We have an available environment map URL\n environmentMapLoads = this.loadEquirectFromUrl(environmentMapUrl, withCredentials, progressCallback);\n }\n else if (!!skyboxUrl) {\n // Fallback to deriving the environment map from an available skybox\n environmentMapLoads = this.loadEquirectFromUrl(skyboxUrl, withCredentials, progressCallback);\n }\n else {\n // Fallback to generating the environment map\n environmentMapLoads = useAltEnvironment ?\n this.loadGeneratedEnvironmentMapAlt() :\n this.loadGeneratedEnvironmentMap();\n }\n const [environmentMap, skybox] = await Promise.all([environmentMapLoads, skyboxLoads]);\n if (environmentMap == null) {\n throw new Error('Failed to load environment map.');\n }\n return { environmentMap, skybox };\n }\n /**\n * Loads an equirect Texture from a given URL, for use as a skybox.\n */\n async loadEquirectFromUrl(url, withCredentials, progressCallback) {\n if (!this.skyboxCache.has(url)) {\n const skyboxMapLoads = this.loadEquirect(url, withCredentials, progressCallback);\n this.skyboxCache.set(url, skyboxMapLoads);\n }\n return this.skyboxCache.get(url);\n }\n async GenerateEnvironmentMap(scene, name) {\n await timePasses();\n const renderer = this.threeRenderer;\n const cubeTarget = new WebGLCubeRenderTarget(256, {\n generateMipmaps: false,\n type: HalfFloatType,\n format: RGBAFormat,\n colorSpace: LinearSRGBColorSpace,\n depthBuffer: true\n });\n const cubeCamera = new CubeCamera(0.1, 100, cubeTarget);\n const generatedEnvironmentMap = cubeCamera.renderTarget.texture;\n generatedEnvironmentMap.name = name;\n const outputColorSpace = renderer.outputColorSpace;\n const toneMapping = renderer.toneMapping;\n renderer.toneMapping = NoToneMapping;\n renderer.outputColorSpace = LinearSRGBColorSpace;\n cubeCamera.update(renderer, scene);\n this.blurCubemap(cubeTarget, GENERATED_SIGMA);\n renderer.toneMapping = toneMapping;\n renderer.outputColorSpace = outputColorSpace;\n return generatedEnvironmentMap;\n }\n /**\n * Loads a dynamically generated environment map.\n */\n async loadGeneratedEnvironmentMap() {\n if (this.generatedEnvironmentMap == null) {\n this.generatedEnvironmentMap =\n this.GenerateEnvironmentMap(new EnvironmentScene('legacy'), 'legacy');\n }\n return this.generatedEnvironmentMap;\n }\n /**\n * Loads a dynamically generated environment map, designed to be neutral and\n * color-preserving. Shows less contrast around the different sides of the\n * object.\n */\n async loadGeneratedEnvironmentMapAlt() {\n if (this.generatedEnvironmentMapAlt == null) {\n this.generatedEnvironmentMapAlt = this.GenerateEnvironmentMap(new EnvironmentScene('neutral'), 'neutral');\n }\n return this.generatedEnvironmentMapAlt;\n }\n blurCubemap(cubeTarget, sigma) {\n if (this.blurMaterial == null) {\n this.blurMaterial = this.getBlurShader(MAX_SAMPLES);\n const box = new BoxGeometry();\n const blurMesh = new Mesh(box, this.blurMaterial);\n this.blurScene = new Scene();\n this.blurScene.add(blurMesh);\n }\n const tempTarget = cubeTarget.clone();\n this.halfblur(cubeTarget, tempTarget, sigma, 'latitudinal');\n this.halfblur(tempTarget, cubeTarget, sigma, 'longitudinal');\n // Disposing this target after we're done with it somehow corrupts Safari's\n // whole graphics driver. It's random, but occurs more frequently on\n // lower-powered GPUs (macbooks with intel graphics, older iPhones). It goes\n // beyond just messing up the PMREM, as it also occasionally causes\n // visible corruption on the canvas and even on the rest of the page.\n /** tempTarget.dispose(); */\n }\n halfblur(targetIn, targetOut, sigmaRadians, direction) {\n // Number of standard deviations at which to cut off the discrete\n // approximation.\n const STANDARD_DEVIATIONS = 3;\n const pixels = targetIn.width;\n const radiansPerPixel = isFinite(sigmaRadians) ?\n Math.PI / (2 * pixels) :\n 2 * Math.PI / (2 * MAX_SAMPLES - 1);\n const sigmaPixels = sigmaRadians / radiansPerPixel;\n const samples = isFinite(sigmaRadians) ?\n 1 + Math.floor(STANDARD_DEVIATIONS * sigmaPixels) :\n MAX_SAMPLES;\n if (samples > MAX_SAMPLES) {\n console.warn(`sigmaRadians, ${sigmaRadians}, is too large and will clip, as it requested ${samples} samples when the maximum is set to ${MAX_SAMPLES}`);\n }\n const weights = [];\n let sum = 0;\n for (let i = 0; i < MAX_SAMPLES; ++i) {\n const x = i / sigmaPixels;\n const weight = Math.exp(-x * x / 2);\n weights.push(weight);\n if (i == 0) {\n sum += weight;\n }\n else if (i < samples) {\n sum += 2 * weight;\n }\n }\n for (let i = 0; i < weights.length; i++) {\n weights[i] = weights[i] / sum;\n }\n const blurUniforms = this.blurMaterial.uniforms;\n blurUniforms['envMap'].value = targetIn.texture;\n blurUniforms['samples'].value = samples;\n blurUniforms['weights'].value = weights;\n blurUniforms['latitudinal'].value = direction === 'latitudinal';\n blurUniforms['dTheta'].value = radiansPerPixel;\n const cubeCamera = new CubeCamera(0.1, 100, targetOut);\n cubeCamera.update(this.threeRenderer, this.blurScene);\n }\n getBlurShader(maxSamples) {\n const weights = new Float32Array(maxSamples);\n const poleAxis = new Vector3(0, 1, 0);\n const shaderMaterial = new ShaderMaterial({\n name: 'SphericalGaussianBlur',\n defines: { 'n': maxSamples },\n uniforms: {\n 'envMap': { value: null },\n 'samples': { value: 1 },\n 'weights': { value: weights },\n 'latitudinal': { value: false },\n 'dTheta': { value: 0 },\n 'poleAxis': { value: poleAxis }\n },\n vertexShader: /* glsl */ `\n \n varying vec3 vOutputDirection;\n \n void main() {\n \n vOutputDirection = vec3( position );\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n \n }\n `,\n fragmentShader: /* glsl */ `\n varying vec3 vOutputDirection;\n \n uniform samplerCube envMap;\n uniform int samples;\n uniform float weights[ n ];\n uniform bool latitudinal;\n uniform float dTheta;\n uniform vec3 poleAxis;\n \n vec3 getSample( float theta, vec3 axis ) {\n \n float cosTheta = cos( theta );\n // Rodrigues' axis-angle rotation\n vec3 sampleDirection = vOutputDirection * cosTheta\n + cross( axis, vOutputDirection ) * sin( theta )\n + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n \n return vec3( textureCube( envMap, sampleDirection ) );\n \n }\n \n void main() {\n \n vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n \n if ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n \n axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n \n }\n \n axis = normalize( axis );\n \n gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n \n for ( int i = 1; i < n; i++ ) {\n \n if ( i >= samples ) {\n \n break;\n \n }\n \n float theta = dTheta * float( i );\n gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n gl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n \n }\n }\n `,\n blending: NoBlending,\n depthTest: false,\n depthWrite: false,\n side: BackSide\n });\n return shaderMaterial;\n }\n async dispose() {\n for (const [, promise] of this.skyboxCache) {\n const skybox = await promise;\n skybox.dispose();\n }\n if (this.generatedEnvironmentMap != null) {\n (await this.generatedEnvironmentMap).dispose();\n this.generatedEnvironmentMap = null;\n }\n if (this.generatedEnvironmentMapAlt != null) {\n (await this.generatedEnvironmentMapAlt).dispose();\n this.generatedEnvironmentMapAlt = null;\n }\n if (this.blurMaterial != null) {\n this.blurMaterial.dispose();\n }\n }\n}\n//# sourceMappingURL=TextureUtils.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { EventDispatcher, NeutralToneMapping, Vector2, WebGLRenderer } from 'three';\nimport { $updateEnvironment } from '../features/environment.js';\nimport { $canvas, $tick, $updateSize } from '../model-viewer-base.js';\nimport { clamp, isDebugMode } from '../utilities.js';\nimport { ARRenderer } from './ARRenderer.js';\nimport { CachingGLTFLoader } from './CachingGLTFLoader.js';\nimport { ModelViewerGLTFInstance } from './gltf-instance/ModelViewerGLTFInstance.js';\nimport TextureUtils from './TextureUtils.js';\n// Between 0 and 1: larger means the average responds faster and is less smooth.\nconst DURATION_DECAY = 0.2;\nconst LOW_FRAME_DURATION_MS = 40;\nconst HIGH_FRAME_DURATION_MS = 60;\nconst MAX_AVG_CHANGE_MS = 5;\nconst SCALE_STEPS = [1, 0.79, 0.62, 0.5, 0.4, 0.31, 0.25];\nconst DEFAULT_LAST_STEP = 3;\nexport const DEFAULT_POWER_PREFERENCE = 'high-performance';\nconst COMMERCE_EXPOSURE = 1.3;\n/**\n * Registers canvases with Canvas2DRenderingContexts and renders them\n * all in the same WebGLRenderingContext, spitting out textures to apply\n * to the canvases. Creates a fullscreen WebGL canvas that is not added\n * to the DOM, and on each frame, renders each registered canvas on a portion\n * of the WebGL canvas, and applies the texture on the registered canvas.\n *\n * In the future, can use ImageBitmapRenderingContext instead of\n * Canvas2DRenderingContext if supported for cheaper transferring of\n * the texture.\n */\nexport class Renderer extends EventDispatcher {\n static get singleton() {\n if (!this._singleton) {\n this._singleton = new Renderer({\n powerPreference: (self.ModelViewerElement || {})\n .powerPreference ||\n DEFAULT_POWER_PREFERENCE,\n debug: isDebugMode()\n });\n }\n return this._singleton;\n }\n static resetSingleton() {\n const elements = this._singleton.dispose();\n for (const element of elements) {\n element.disconnectedCallback();\n }\n this._singleton = new Renderer({\n powerPreference: (self.ModelViewerElement || {})\n .powerPreference ||\n DEFAULT_POWER_PREFERENCE,\n debug: isDebugMode()\n });\n for (const element of elements) {\n element.connectedCallback();\n }\n }\n get canRender() {\n return this.threeRenderer != null;\n }\n get scaleFactor() {\n return SCALE_STEPS[this.scaleStep];\n }\n set minScale(scale) {\n let i = 1;\n while (i < SCALE_STEPS.length) {\n if (SCALE_STEPS[i] < scale) {\n break;\n }\n ++i;\n }\n this.lastStep = i - 1;\n }\n constructor(options) {\n super();\n this.loader = new CachingGLTFLoader(ModelViewerGLTFInstance);\n this.width = 0;\n this.height = 0;\n this.dpr = 1;\n this.scenes = new Set();\n this.multipleScenesVisible = false;\n this.lastTick = performance.now();\n this.renderedLastFrame = false;\n this.scaleStep = 0;\n this.lastStep = DEFAULT_LAST_STEP;\n this.avgFrameDuration = (HIGH_FRAME_DURATION_MS + LOW_FRAME_DURATION_MS) / 2;\n this.onWebGLContextLost = (event) => {\n this.dispatchEvent({ type: 'contextlost', sourceEvent: event });\n };\n this.onWebGLContextRestored = () => {\n var _a;\n (_a = this.textureUtils) === null || _a === void 0 ? void 0 : _a.dispose();\n this.textureUtils = new TextureUtils(this.threeRenderer);\n for (const scene of this.scenes) {\n scene.element[$updateEnvironment]();\n }\n };\n this.dpr = window.devicePixelRatio;\n this.canvas3D = document.createElement('canvas');\n this.canvas3D.id = 'webgl-canvas';\n this.canvas3D.classList.add('show');\n try {\n this.threeRenderer = new WebGLRenderer({\n canvas: this.canvas3D,\n alpha: true,\n antialias: true,\n powerPreference: options.powerPreference,\n preserveDrawingBuffer: true,\n });\n this.threeRenderer.autoClear = true;\n this.threeRenderer.setPixelRatio(1); // handle pixel ratio externally\n this.threeRenderer.debug = {\n checkShaderErrors: !!options.debug,\n onShaderError: null\n };\n // ACESFilmicToneMapping appears to be the most \"saturated\",\n // and similar to Filament's gltf-viewer.\n this.threeRenderer.toneMapping = NeutralToneMapping;\n }\n catch (error) {\n console.warn(error);\n }\n this.arRenderer = new ARRenderer(this);\n this.textureUtils =\n this.canRender ? new TextureUtils(this.threeRenderer) : null;\n CachingGLTFLoader.initializeKTX2Loader(this.threeRenderer);\n this.canvas3D.addEventListener('webglcontextlost', this.onWebGLContextLost);\n this.canvas3D.addEventListener('webglcontextrestored', this.onWebGLContextRestored);\n this.updateRendererSize();\n }\n registerScene(scene) {\n this.scenes.add(scene);\n scene.forceRescale();\n const size = new Vector2();\n this.threeRenderer.getSize(size);\n scene.canvas.width = size.x;\n scene.canvas.height = size.y;\n if (this.canRender && this.scenes.size > 0) {\n this.threeRenderer.setAnimationLoop((time, frame) => this.render(time, frame));\n }\n }\n unregisterScene(scene) {\n this.scenes.delete(scene);\n if (this.canvas3D.parentElement === scene.canvas.parentElement) {\n scene.canvas.parentElement.removeChild(this.canvas3D);\n }\n if (this.canRender && this.scenes.size === 0) {\n this.threeRenderer.setAnimationLoop(null);\n }\n }\n displayCanvas(scene) {\n return scene.element.modelIsVisible && !this.multipleScenesVisible ?\n this.canvas3D :\n scene.element[$canvas];\n }\n /**\n * The function enables an optimization, where when there is only a single\n * element, we can use the renderer's 3D canvas directly for\n * display. Otherwise we need to use the element's 2D canvas and copy the\n * renderer's result into it.\n */\n countVisibleScenes() {\n const { canvas3D } = this;\n let visibleScenes = 0;\n let canvas3DScene = null;\n for (const scene of this.scenes) {\n const { element } = scene;\n if (element.modelIsVisible && scene.externalRenderer == null) {\n ++visibleScenes;\n }\n if (canvas3D.parentElement === scene.canvas.parentElement) {\n canvas3DScene = scene;\n }\n }\n const multipleScenesVisible = visibleScenes > 1;\n if (canvas3DScene != null) {\n const newlyMultiple = multipleScenesVisible && !this.multipleScenesVisible;\n const disappearing = !canvas3DScene.element.modelIsVisible;\n if (newlyMultiple || disappearing) {\n const { width, height } = this.sceneSize(canvas3DScene);\n this.copyPixels(canvas3DScene, width, height);\n canvas3D.parentElement.removeChild(canvas3D);\n }\n }\n this.multipleScenesVisible = multipleScenesVisible;\n }\n /**\n * Updates the renderer's size based on the largest scene and any changes to\n * device pixel ratio.\n */\n updateRendererSize() {\n var _a;\n const dpr = window.devicePixelRatio;\n if (dpr !== this.dpr) {\n // If the device pixel ratio has changed due to page zoom, elements\n // specified by % width do not fire a resize event even though their CSS\n // pixel dimensions change, so we force them to update their size here.\n for (const scene of this.scenes) {\n const { element } = scene;\n element[$updateSize](element.getBoundingClientRect());\n }\n }\n // Make the renderer the size of the largest scene\n let width = 0;\n let height = 0;\n for (const scene of this.scenes) {\n width = Math.max(width, scene.width);\n height = Math.max(height, scene.height);\n }\n if (width === this.width && height === this.height && dpr === this.dpr) {\n return;\n }\n this.width = width;\n this.height = height;\n this.dpr = dpr;\n width = Math.ceil(width * dpr);\n height = Math.ceil(height * dpr);\n if (this.canRender) {\n this.threeRenderer.setSize(width, height, false);\n }\n // Each scene's canvas must match the renderer size. In general they can be\n // larger than the element that contains them, but the overflow is hidden\n // and only the portion that is shown is copied over.\n for (const scene of this.scenes) {\n const { canvas } = scene;\n canvas.width = width;\n canvas.height = height;\n scene.forceRescale();\n (_a = scene.effectRenderer) === null || _a === void 0 ? void 0 : _a.setSize(width, height);\n }\n }\n updateRendererScale(delta) {\n const scaleStep = this.scaleStep;\n this.avgFrameDuration += clamp(DURATION_DECAY * (delta - this.avgFrameDuration), -MAX_AVG_CHANGE_MS, MAX_AVG_CHANGE_MS);\n if (this.avgFrameDuration > HIGH_FRAME_DURATION_MS) {\n ++this.scaleStep;\n }\n else if (this.avgFrameDuration < LOW_FRAME_DURATION_MS && this.scaleStep > 0) {\n --this.scaleStep;\n }\n this.scaleStep = Math.min(this.scaleStep, this.lastStep);\n if (scaleStep !== this.scaleStep) {\n this.avgFrameDuration =\n (HIGH_FRAME_DURATION_MS + LOW_FRAME_DURATION_MS) / 2;\n }\n }\n shouldRender(scene) {\n if (!scene.shouldRender()) {\n // The first frame we stop rendering the scene (because it stops moving),\n // trigger one extra render at full scale.\n if (scene.scaleStep != 0) {\n scene.scaleStep = 0;\n this.rescaleCanvas(scene);\n }\n else {\n return false;\n }\n }\n else if (scene.scaleStep != this.scaleStep) {\n // Update render scale\n scene.scaleStep = this.scaleStep;\n this.rescaleCanvas(scene);\n }\n return true;\n }\n rescaleCanvas(scene) {\n const scale = SCALE_STEPS[scene.scaleStep];\n const width = Math.ceil(this.width / scale);\n const height = Math.ceil(this.height / scale);\n const { style } = scene.canvas;\n style.width = `${width}px`;\n style.height = `${height}px`;\n this.canvas3D.style.width = `${width}px`;\n this.canvas3D.style.height = `${height}px`;\n const renderedDpr = this.dpr * scale;\n const reason = scale < 1 ? 'GPU throttling' :\n this.dpr !== window.devicePixelRatio ? 'No meta viewport tag' :\n '';\n scene.element.dispatchEvent(new CustomEvent('render-scale', {\n detail: {\n reportedDpr: window.devicePixelRatio,\n renderedDpr: renderedDpr,\n minimumDpr: this.dpr * SCALE_STEPS[this.lastStep],\n pixelWidth: Math.ceil(scene.width * renderedDpr),\n pixelHeight: Math.ceil(scene.height * renderedDpr),\n reason: reason\n }\n }));\n }\n sceneSize(scene) {\n const { dpr } = this;\n const scaleFactor = SCALE_STEPS[scene.scaleStep];\n // We avoid using the Three.js PixelRatio and handle it ourselves here so\n // that we can do proper rounding and avoid white boundary pixels.\n const width = Math.min(Math.ceil(scene.width * scaleFactor * dpr), this.canvas3D.width);\n const height = Math.min(Math.ceil(scene.height * scaleFactor * dpr), this.canvas3D.height);\n return { width, height };\n }\n copyPixels(scene, width, height) {\n const context2D = scene.context;\n if (context2D == null) {\n console.log('could not acquire 2d context');\n return;\n }\n context2D.clearRect(0, 0, width, height);\n context2D.drawImage(this.canvas3D, 0, 0, width, height, 0, 0, width, height);\n scene.canvas.classList.add('show');\n }\n /**\n * Returns an array version of this.scenes where the non-visible ones are\n * first. This allows eager scenes to be rendered before they are visible,\n * without needing the multi-canvas render path.\n */\n orderedScenes() {\n const scenes = [];\n for (const visible of [false, true]) {\n for (const scene of this.scenes) {\n if (scene.element.modelIsVisible === visible) {\n scenes.push(scene);\n }\n }\n }\n return scenes;\n }\n get isPresenting() {\n return this.arRenderer.isPresenting;\n }\n /**\n * This method takes care of updating the element and renderer state based on\n * the time that has passed since the last rendered frame.\n */\n preRender(scene, t, delta) {\n const { element, exposure, toneMapping } = scene;\n element[$tick](t, delta);\n const exposureIsNumber = typeof exposure === 'number' && !Number.isNaN(exposure);\n const env = element.environmentImage;\n const sky = element.skyboxImage;\n const compensateExposure = toneMapping === NeutralToneMapping &&\n (env === 'neutral' || env === 'legacy' || (!env && !sky));\n this.threeRenderer.toneMappingExposure =\n (exposureIsNumber ? exposure : 1.0) *\n (compensateExposure ? COMMERCE_EXPOSURE : 1.0);\n }\n render(t, frame) {\n if (frame != null) {\n this.arRenderer.onWebXRFrame(t, frame);\n return;\n }\n const delta = t - this.lastTick;\n this.lastTick = t;\n if (!this.canRender || this.isPresenting) {\n return;\n }\n this.countVisibleScenes();\n this.updateRendererSize();\n if (this.renderedLastFrame) {\n this.updateRendererScale(delta);\n this.renderedLastFrame = false;\n }\n const { canvas3D } = this;\n for (const scene of this.orderedScenes()) {\n const { element } = scene;\n if (!element.loaded ||\n (!element.modelIsVisible && scene.renderCount > 0)) {\n continue;\n }\n this.preRender(scene, t, delta);\n if (!this.shouldRender(scene)) {\n continue;\n }\n if (scene.externalRenderer != null) {\n const camera = scene.getCamera();\n camera.updateMatrix();\n const { matrix, projectionMatrix } = camera;\n const viewMatrix = matrix.elements.slice();\n const target = scene.getTarget();\n viewMatrix[12] += target.x;\n viewMatrix[13] += target.y;\n viewMatrix[14] += target.z;\n scene.externalRenderer.render({\n viewMatrix: viewMatrix,\n projectionMatrix: projectionMatrix.elements\n });\n continue;\n }\n if (!element.modelIsVisible && !this.multipleScenesVisible) {\n // Here we are pre-rendering on the visible canvas, so we must mark the\n // visible scene dirty to ensure it overwrites us.\n for (const visibleScene of this.scenes) {\n if (visibleScene.element.modelIsVisible) {\n visibleScene.queueRender();\n }\n }\n }\n const { width, height } = this.sceneSize(scene);\n scene.renderShadow(this.threeRenderer);\n // Need to set the render target in order to prevent\n // clearing the depth from a different buffer\n this.threeRenderer.setRenderTarget(null);\n this.threeRenderer.setViewport(0, Math.ceil(this.height * this.dpr) - height, width, height);\n if (scene.effectRenderer != null) {\n scene.effectRenderer.render(delta);\n }\n else {\n this.threeRenderer.autoClear =\n true; // this might get reset by the effectRenderer\n this.threeRenderer.toneMapping = scene.toneMapping;\n this.threeRenderer.render(scene, scene.camera);\n }\n if (this.multipleScenesVisible ||\n (!scene.element.modelIsVisible && scene.renderCount === 0)) {\n this.copyPixels(scene, width, height);\n }\n else if (canvas3D.parentElement !== scene.canvas.parentElement) {\n scene.canvas.parentElement.appendChild(canvas3D);\n scene.canvas.classList.remove('show');\n }\n scene.hasRendered();\n ++scene.renderCount;\n this.renderedLastFrame = true;\n }\n }\n dispose() {\n if (this.textureUtils != null) {\n this.textureUtils.dispose();\n }\n if (this.threeRenderer != null) {\n this.threeRenderer.dispose();\n }\n this.textureUtils = null;\n this.threeRenderer = null;\n const elements = [];\n for (const scene of this.scenes) {\n elements.push(scene.element);\n }\n this.canvas3D.removeEventListener('webglcontextlost', this.onWebGLContextLost);\n this.canvas3D.removeEventListener('webglcontextrestored', this.onWebGLContextRestored);\n return elements;\n }\n}\n//# sourceMappingURL=Renderer.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const $correlatedObjects = Symbol('correlatedObjects');\nexport const $onUpdate = Symbol('onUpdate');\n/**\n * A SerializableThreeDOMElement is the common primitive of all scene graph\n * elements that have been facaded in the host execution context. It adds\n * a common interface to these elements in support of convenient\n * serializability.\n */\nexport class ThreeDOMElement {\n constructor(onUpdate, correlatedObjects) {\n this[$onUpdate] = onUpdate;\n this[$correlatedObjects] = correlatedObjects;\n }\n}\n//# sourceMappingURL=three-dom-element.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Mesh, MeshBasicMaterial, OrthographicCamera, PlaneGeometry, Scene, WebGLRenderTarget } from 'three';\nimport { blobCanvas } from '../../model-viewer-base.js';\nimport { Renderer } from '../../three-components/Renderer.js';\nimport { $correlatedObjects, $onUpdate, ThreeDOMElement } from './three-dom-element.js';\nconst quadMaterial = new MeshBasicMaterial();\nconst quad = new PlaneGeometry(2, 2);\nlet adhocNum = 0;\nexport const $threeTexture = Symbol('threeTexture');\nexport const $threeTextures = Symbol('threeTextures');\nexport const $applyTexture = Symbol('applyTexture');\n/**\n * Image facade implementation for Three.js textures\n */\nexport class Image extends ThreeDOMElement {\n get [$threeTexture]() {\n var _a;\n return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value;\n }\n get [$threeTextures]() {\n return this[$correlatedObjects];\n }\n constructor(onUpdate, texture) {\n super(onUpdate, new Set(texture ? [texture] : []));\n if (!this[$threeTexture].image.src) {\n this[$threeTexture].image.src =\n texture.name ? texture.name : 'adhoc_image' + adhocNum++;\n }\n if (!this[$threeTexture].image.name) {\n this[$threeTexture].image.name =\n (texture && texture.image && texture.image.src) ?\n texture.image.src.split('/').pop() :\n 'adhoc_image';\n }\n }\n get name() {\n return this[$threeTexture].image.name || '';\n }\n get uri() {\n return this[$threeTexture].image.src;\n }\n get bufferView() {\n return this[$threeTexture].image.bufferView;\n }\n get element() {\n const texture = this[$threeTexture];\n if (texture && (texture.isCanvasTexture || texture.isVideoTexture)) {\n return texture.image;\n }\n return;\n }\n get animation() {\n const texture = this[$threeTexture];\n if (texture && texture.isCanvasTexture && texture.animation) {\n return texture.animation;\n }\n return;\n }\n get type() {\n return this.uri != null ? 'external' : 'embedded';\n }\n set name(name) {\n for (const texture of this[$threeTextures]) {\n texture.image.name = name;\n }\n }\n update() {\n const texture = this[$threeTexture];\n // Applies to non-Lottie canvas textures only\n if (texture && texture.isCanvasTexture && !texture.animation) {\n this[$threeTexture].needsUpdate = true;\n this[$onUpdate]();\n }\n }\n async createThumbnail(width, height) {\n const scene = new Scene();\n quadMaterial.map = this[$threeTexture];\n const mesh = new Mesh(quad, quadMaterial);\n scene.add(mesh);\n const camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1);\n const { threeRenderer } = Renderer.singleton;\n const renderTarget = new WebGLRenderTarget(width, height);\n threeRenderer.setRenderTarget(renderTarget);\n threeRenderer.render(scene, camera);\n threeRenderer.setRenderTarget(null);\n const buffer = new Uint8Array(width * height * 4);\n threeRenderer.readRenderTargetPixels(renderTarget, 0, 0, width, height, buffer);\n blobCanvas.width = width;\n blobCanvas.height = height;\n const blobContext = blobCanvas.getContext('2d');\n const imageData = blobContext.createImageData(width, height);\n imageData.data.set(buffer);\n blobContext.putImageData(imageData, 0, 0);\n return new Promise(async (resolve, reject) => {\n blobCanvas.toBlob(blob => {\n if (!blob) {\n return reject('Failed to capture thumbnail.');\n }\n resolve(URL.createObjectURL(blob));\n }, 'image/png');\n });\n }\n}\n//# sourceMappingURL=image.js.map","export var Filter;\n(function (Filter) {\n Filter[Filter[\"Nearest\"] = 9728] = \"Nearest\";\n Filter[Filter[\"Linear\"] = 9729] = \"Linear\";\n Filter[Filter[\"NearestMipmapNearest\"] = 9984] = \"NearestMipmapNearest\";\n Filter[Filter[\"LinearMipmapNearest\"] = 9985] = \"LinearMipmapNearest\";\n Filter[Filter[\"NearestMipmapLinear\"] = 9986] = \"NearestMipmapLinear\";\n Filter[Filter[\"LinearMipmapLinear\"] = 9987] = \"LinearMipmapLinear\";\n})(Filter || (Filter = {}));\nexport var Wrap;\n(function (Wrap) {\n Wrap[Wrap[\"ClampToEdge\"] = 33071] = \"ClampToEdge\";\n Wrap[Wrap[\"MirroredRepeat\"] = 33648] = \"MirroredRepeat\";\n Wrap[Wrap[\"Repeat\"] = 10497] = \"Repeat\";\n})(Wrap || (Wrap = {}));\n//# sourceMappingURL=gltf-2.0.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClampToEdgeWrapping, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, MirroredRepeatWrapping, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RepeatWrapping, Vector2 } from 'three';\nimport { toVector2D } from '../../model-viewer-base.js';\nimport { Filter, Wrap } from '../../three-components/gltf-instance/gltf-2.0.js';\nimport { $correlatedObjects, $onUpdate, ThreeDOMElement } from './three-dom-element.js';\n// Convertion between gltf standards and threejs standards.\nconst wrapModeToWrapping = new Map([\n [Wrap.Repeat, RepeatWrapping],\n [Wrap.ClampToEdge, ClampToEdgeWrapping],\n [Wrap.MirroredRepeat, MirroredRepeatWrapping]\n]);\nconst wrappingToWrapMode = new Map([\n [RepeatWrapping, Wrap.Repeat],\n [ClampToEdgeWrapping, Wrap.ClampToEdge],\n [MirroredRepeatWrapping, Wrap.MirroredRepeat]\n]);\nconst minFilterToMinification = new Map([\n [Filter.Nearest, NearestFilter],\n [Filter.Linear, LinearFilter],\n [Filter.NearestMipmapNearest, NearestMipmapNearestFilter],\n [Filter.LinearMipmapNearest, LinearMipmapNearestFilter],\n [Filter.NearestMipmapLinear, NearestMipmapLinearFilter],\n [Filter.LinearMipmapLinear, LinearMipmapLinearFilter]\n]);\nconst minificationToMinFilter = new Map([\n [NearestFilter, Filter.Nearest],\n [LinearFilter, Filter.Linear],\n [NearestMipmapNearestFilter, Filter.NearestMipmapNearest],\n [LinearMipmapNearestFilter, Filter.LinearMipmapNearest],\n [NearestMipmapLinearFilter, Filter.NearestMipmapLinear],\n [LinearMipmapLinearFilter, Filter.LinearMipmapLinear]\n]);\nconst magFilterToMagnification = new Map([[Filter.Nearest, NearestFilter], [Filter.Linear, LinearFilter]]);\nconst magnificationToMagFilter = new Map([[NearestFilter, Filter.Nearest], [LinearFilter, Filter.Linear]]);\n// Checks for threejs standards.\nconst isMinFilter = (() => {\n return (value) => minificationToMinFilter.has(value);\n})();\nconst isMagFilter = (() => {\n return (value) => magnificationToMagFilter.has(value);\n})();\nconst isWrapping = (() => {\n return (value) => wrappingToWrapMode.has(value);\n})();\nconst isValidSamplerValue = (property, value) => {\n switch (property) {\n case 'minFilter':\n return isMinFilter(value);\n case 'magFilter':\n return isMagFilter(value);\n case 'wrapS':\n case 'wrapT':\n return isWrapping(value);\n case 'rotation':\n case 'repeat':\n case 'offset':\n return true;\n default:\n throw new Error(`Cannot configure property \"${property}\" on Sampler`);\n }\n};\nconst $threeTexture = Symbol('threeTexture');\nconst $threeTextures = Symbol('threeTextures');\nconst $setProperty = Symbol('setProperty');\n/**\n * Sampler facade implementation for Three.js textures\n */\nexport class Sampler extends ThreeDOMElement {\n get [$threeTexture]() {\n var _a;\n return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value;\n }\n get [$threeTextures]() {\n return this[$correlatedObjects];\n }\n constructor(onUpdate, texture) {\n super(onUpdate, new Set(texture ? [texture] : []));\n }\n get name() {\n return this[$threeTexture].name || '';\n }\n get minFilter() {\n return minificationToMinFilter.get(this[$threeTexture].minFilter);\n }\n get magFilter() {\n return magnificationToMagFilter.get(this[$threeTexture].magFilter);\n }\n get wrapS() {\n return wrappingToWrapMode.get(this[$threeTexture].wrapS);\n }\n get wrapT() {\n return wrappingToWrapMode.get(this[$threeTexture].wrapT);\n }\n get rotation() {\n return this[$threeTexture].rotation;\n }\n get scale() {\n return toVector2D(this[$threeTexture].repeat);\n }\n get offset() {\n return toVector2D(this[$threeTexture].offset);\n }\n setMinFilter(filter) {\n this[$setProperty]('minFilter', minFilterToMinification.get(filter));\n }\n setMagFilter(filter) {\n this[$setProperty]('magFilter', magFilterToMagnification.get(filter));\n }\n setWrapS(mode) {\n this[$setProperty]('wrapS', wrapModeToWrapping.get(mode));\n }\n setWrapT(mode) {\n this[$setProperty]('wrapT', wrapModeToWrapping.get(mode));\n }\n setRotation(rotation) {\n if (rotation == null) {\n // Reset rotation.\n rotation = 0;\n }\n this[$setProperty]('rotation', rotation);\n }\n setScale(scale) {\n if (scale == null) {\n // Reset scale.\n scale = { u: 1, v: 1 };\n }\n this[$setProperty]('repeat', new Vector2(scale.u, scale.v));\n }\n setOffset(offset) {\n if (offset == null) {\n // Reset offset.\n offset = { u: 0, v: 0 };\n }\n this[$setProperty]('offset', new Vector2(offset.u, offset.v));\n }\n [$setProperty](property, value) {\n if (isValidSamplerValue(property, value)) {\n for (const texture of this[$threeTextures]) {\n texture[property] = value;\n texture.needsUpdate = true;\n }\n }\n this[$onUpdate]();\n }\n}\n//# sourceMappingURL=sampler.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Image } from './image.js';\nimport { Sampler } from './sampler.js';\nimport { $correlatedObjects, ThreeDOMElement } from './three-dom-element.js';\nconst $image = Symbol('image');\nconst $sampler = Symbol('sampler');\nconst $threeTexture = Symbol('threeTexture');\n/**\n * Material facade implementation for Three.js materials\n */\nexport class Texture extends ThreeDOMElement {\n get [$threeTexture]() {\n var _a;\n return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value;\n }\n constructor(onUpdate, threeTexture) {\n super(onUpdate, new Set(threeTexture ? [threeTexture] : []));\n this[$sampler] = new Sampler(onUpdate, threeTexture);\n this[$image] = new Image(onUpdate, threeTexture);\n }\n get name() {\n return this[$threeTexture].name || '';\n }\n set name(name) {\n for (const texture of this[$correlatedObjects]) {\n texture.name = name;\n }\n }\n get sampler() {\n return this[$sampler];\n }\n get source() {\n return this[$image];\n }\n}\n//# sourceMappingURL=texture.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b, _c;\nimport { LinearSRGBColorSpace, SRGBColorSpace, Vector2 } from 'three';\nimport { $threeTexture } from './image.js';\nimport { Texture } from './texture.js';\nconst $texture = Symbol('texture');\nconst $transform = Symbol('transform');\nexport const $materials = Symbol('materials');\nexport const $usage = Symbol('usage');\nconst $onUpdate = Symbol('onUpdate');\nconst $activeVideo = Symbol('activeVideo');\n// Defines what a texture will be used for.\nexport var TextureUsage;\n(function (TextureUsage) {\n TextureUsage[TextureUsage[\"Base\"] = 0] = \"Base\";\n TextureUsage[TextureUsage[\"MetallicRoughness\"] = 1] = \"MetallicRoughness\";\n TextureUsage[TextureUsage[\"Normal\"] = 2] = \"Normal\";\n TextureUsage[TextureUsage[\"Occlusion\"] = 3] = \"Occlusion\";\n TextureUsage[TextureUsage[\"Emissive\"] = 4] = \"Emissive\";\n TextureUsage[TextureUsage[\"Clearcoat\"] = 5] = \"Clearcoat\";\n TextureUsage[TextureUsage[\"ClearcoatRoughness\"] = 6] = \"ClearcoatRoughness\";\n TextureUsage[TextureUsage[\"ClearcoatNormal\"] = 7] = \"ClearcoatNormal\";\n TextureUsage[TextureUsage[\"SheenColor\"] = 8] = \"SheenColor\";\n TextureUsage[TextureUsage[\"SheenRoughness\"] = 9] = \"SheenRoughness\";\n TextureUsage[TextureUsage[\"Transmission\"] = 10] = \"Transmission\";\n TextureUsage[TextureUsage[\"Thickness\"] = 11] = \"Thickness\";\n TextureUsage[TextureUsage[\"Specular\"] = 12] = \"Specular\";\n TextureUsage[TextureUsage[\"SpecularColor\"] = 13] = \"SpecularColor\";\n TextureUsage[TextureUsage[\"Iridescence\"] = 14] = \"Iridescence\";\n TextureUsage[TextureUsage[\"IridescenceThickness\"] = 15] = \"IridescenceThickness\";\n TextureUsage[TextureUsage[\"Anisotropy\"] = 16] = \"Anisotropy\";\n})(TextureUsage || (TextureUsage = {}));\n/**\n * TextureInfo facade implementation for Three.js materials\n */\nexport class TextureInfo {\n constructor(onUpdate, usage, threeTexture, material) {\n this[_a] = null;\n this[_b] = {\n rotation: 0,\n scale: new Vector2(1, 1),\n offset: new Vector2(0, 0)\n };\n this[_c] = false;\n // Creates image, sampler, and texture if valid texture info is provided.\n if (threeTexture) {\n this[$transform].rotation = threeTexture.rotation;\n this[$transform].scale.copy(threeTexture.repeat);\n this[$transform].offset.copy(threeTexture.offset);\n this[$texture] = new Texture(onUpdate, threeTexture);\n }\n this[$onUpdate] = onUpdate;\n this[$materials] = material;\n this[$usage] = usage;\n }\n get texture() {\n return this[$texture];\n }\n setTexture(texture) {\n var _d, _e;\n const threeTexture = texture != null ? texture.source[$threeTexture] : null;\n const oldTexture = (_d = this[$texture]) === null || _d === void 0 ? void 0 : _d.source[$threeTexture];\n if (oldTexture != null && oldTexture.isVideoTexture) {\n this[$activeVideo] = false;\n }\n else if ((_e = this[$texture]) === null || _e === void 0 ? void 0 : _e.source.animation) {\n this[$texture].source.animation.removeEventListener('enterFrame', this[$onUpdate]);\n }\n this[$texture] = texture;\n if (threeTexture != null && threeTexture.isVideoTexture) {\n const element = threeTexture.image;\n this[$activeVideo] = true;\n if (element.requestVideoFrameCallback != null) {\n const update = () => {\n if (!this[$activeVideo]) {\n return;\n }\n this[$onUpdate]();\n element.requestVideoFrameCallback(update);\n };\n element.requestVideoFrameCallback(update);\n }\n else {\n const update = () => {\n if (!this[$activeVideo]) {\n return;\n }\n this[$onUpdate]();\n requestAnimationFrame(update);\n };\n requestAnimationFrame(update);\n }\n }\n else if ((texture === null || texture === void 0 ? void 0 : texture.source.animation) != null) {\n texture.source.animation.addEventListener('enterFrame', this[$onUpdate]);\n }\n let colorSpace = SRGBColorSpace;\n if (this[$materials]) {\n for (const material of this[$materials]) {\n switch (this[$usage]) {\n case TextureUsage.Base:\n material.map = threeTexture;\n break;\n case TextureUsage.MetallicRoughness:\n colorSpace = LinearSRGBColorSpace;\n material.metalnessMap = threeTexture;\n material.roughnessMap = threeTexture;\n break;\n case TextureUsage.Normal:\n colorSpace = LinearSRGBColorSpace;\n material.normalMap = threeTexture;\n break;\n case TextureUsage.Occlusion:\n colorSpace = LinearSRGBColorSpace;\n material.aoMap = threeTexture;\n break;\n case TextureUsage.Emissive:\n material.emissiveMap = threeTexture;\n break;\n case TextureUsage.Clearcoat:\n material.clearcoatMap = threeTexture;\n break;\n case TextureUsage.ClearcoatRoughness:\n material.clearcoatRoughnessMap = threeTexture;\n break;\n case TextureUsage.ClearcoatNormal:\n material.clearcoatNormalMap = threeTexture;\n break;\n case TextureUsage.SheenColor:\n material.sheenColorMap = threeTexture;\n break;\n case TextureUsage.SheenRoughness:\n material.sheenRoughnessMap = threeTexture;\n break;\n case TextureUsage.Transmission:\n material.transmissionMap = threeTexture;\n break;\n case TextureUsage.Thickness:\n material.thicknessMap = threeTexture;\n break;\n case TextureUsage.Specular:\n material.specularIntensityMap = threeTexture;\n break;\n case TextureUsage.SpecularColor:\n material.specularColorMap = threeTexture;\n break;\n case TextureUsage.Iridescence:\n material.iridescenceMap = threeTexture;\n break;\n case TextureUsage.IridescenceThickness:\n material.iridescenceThicknessMap = threeTexture;\n break;\n case TextureUsage.Anisotropy:\n material.anisotropyMap = threeTexture;\n break;\n default:\n }\n material.needsUpdate = true;\n }\n }\n if (threeTexture) {\n // Updates the colorSpace for the texture, affects all references.\n threeTexture.colorSpace = colorSpace;\n threeTexture.rotation = this[$transform].rotation;\n threeTexture.repeat = this[$transform].scale;\n threeTexture.offset = this[$transform].offset;\n }\n this[$onUpdate]();\n }\n}\n_a = $texture, _b = $transform, _c = $activeVideo;\n//# sourceMappingURL=texture-info.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Color } from 'three';\nimport { TextureInfo, TextureUsage } from './texture-info.js';\nimport { $correlatedObjects, $onUpdate, ThreeDOMElement } from './three-dom-element.js';\nconst $threeMaterial = Symbol('threeMaterial');\nconst $threeMaterials = Symbol('threeMaterials');\nconst $baseColorTexture = Symbol('baseColorTexture');\nconst $metallicRoughnessTexture = Symbol('metallicRoughnessTexture');\n/**\n * PBR material properties facade implementation for Three.js materials\n */\nexport class PBRMetallicRoughness extends ThreeDOMElement {\n get [$threeMaterials]() {\n return this[$correlatedObjects];\n }\n get [$threeMaterial]() {\n var _a;\n return (_a = this[$correlatedObjects]) === null || _a === void 0 ? void 0 : _a.values().next().value;\n }\n constructor(onUpdate, correlatedMaterials) {\n super(onUpdate, correlatedMaterials);\n const { map, metalnessMap } = correlatedMaterials.values().next().value;\n this[$baseColorTexture] =\n new TextureInfo(onUpdate, TextureUsage.Base, map, correlatedMaterials);\n this[$metallicRoughnessTexture] = new TextureInfo(onUpdate, TextureUsage.MetallicRoughness, metalnessMap, correlatedMaterials);\n }\n get baseColorFactor() {\n const rgba = [0, 0, 0, this[$threeMaterial].opacity];\n this[$threeMaterial].color.toArray(rgba);\n return rgba;\n }\n get metallicFactor() {\n return this[$threeMaterial].metalness;\n }\n get roughnessFactor() {\n return this[$threeMaterial].roughness;\n }\n get baseColorTexture() {\n return this[$baseColorTexture];\n }\n get metallicRoughnessTexture() {\n return this[$metallicRoughnessTexture];\n }\n setBaseColorFactor(rgba) {\n const color = new Color();\n if (rgba instanceof Array) {\n color.fromArray(rgba);\n }\n else {\n color.set(rgba);\n }\n for (const material of this[$threeMaterials]) {\n material.color.set(color);\n if (rgba instanceof Array && rgba.length > 3) {\n material.opacity = rgba[3];\n }\n else {\n rgba = [0, 0, 0, material.opacity];\n color.toArray(rgba);\n }\n }\n this[$onUpdate]();\n }\n setMetallicFactor(value) {\n for (const material of this[$threeMaterials]) {\n material.metalness = value;\n }\n this[$onUpdate]();\n }\n setRoughnessFactor(value) {\n for (const material of this[$threeMaterials]) {\n material.roughness = value;\n }\n this[$onUpdate]();\n }\n}\n//# sourceMappingURL=pbr-metallic-roughness.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b;\nimport { Color, DoubleSide, FrontSide, Vector2 } from 'three';\nimport { PBRMetallicRoughness } from './pbr-metallic-roughness.js';\nimport { TextureInfo, TextureUsage } from './texture-info.js';\nimport { $correlatedObjects, $onUpdate, ThreeDOMElement } from './three-dom-element.js';\nconst $pbrMetallicRoughness = Symbol('pbrMetallicRoughness');\nconst $normalTexture = Symbol('normalTexture');\nconst $occlusionTexture = Symbol('occlusionTexture');\nconst $emissiveTexture = Symbol('emissiveTexture');\nconst $backingThreeMaterial = Symbol('backingThreeMaterial');\nconst $applyAlphaCutoff = Symbol('applyAlphaCutoff');\nconst $getAlphaMode = Symbol('getAlphaMode');\nexport const $lazyLoadGLTFInfo = Symbol('lazyLoadGLTFInfo');\nconst $initialize = Symbol('initialize');\nexport const $getLoadedMaterial = Symbol('getLoadedMaterial');\nexport const $ensureMaterialIsLoaded = Symbol('ensureMaterialIsLoaded');\nexport const $gltfIndex = Symbol('gltfIndex');\nexport const $setActive = Symbol('setActive');\nexport const $variantIndices = Symbol('variantIndices');\nconst $isActive = Symbol('isActive');\nconst $modelVariants = Symbol('modelVariants');\nconst $name = Symbol('name');\nconst $pbrTextures = Symbol('pbrTextures');\n/**\n * Material facade implementation for Three.js materials\n */\nexport class Material extends ThreeDOMElement {\n get [(_a = $variantIndices, _b = $pbrTextures, $backingThreeMaterial)]() {\n return this[$correlatedObjects]\n .values()\n .next()\n .value;\n }\n constructor(onUpdate, gltfIndex, isActive, modelVariants, correlatedMaterials, name, lazyLoadInfo = undefined) {\n super(onUpdate, correlatedMaterials);\n this[_a] = new Set();\n this[_b] = new Map();\n this[$gltfIndex] = gltfIndex;\n this[$isActive] = isActive;\n this[$modelVariants] = modelVariants;\n this[$name] = name;\n if (lazyLoadInfo == null) {\n this[$initialize]();\n }\n else {\n this[$lazyLoadGLTFInfo] = lazyLoadInfo;\n }\n }\n [$initialize]() {\n const onUpdate = this[$onUpdate];\n const correlatedMaterials = this[$correlatedObjects];\n this[$pbrMetallicRoughness] =\n new PBRMetallicRoughness(onUpdate, correlatedMaterials);\n const { normalMap, aoMap, emissiveMap } = correlatedMaterials.values().next().value;\n this[$normalTexture] = new TextureInfo(onUpdate, TextureUsage.Normal, normalMap, correlatedMaterials);\n this[$occlusionTexture] = new TextureInfo(onUpdate, TextureUsage.Occlusion, aoMap, correlatedMaterials);\n this[$emissiveTexture] = new TextureInfo(onUpdate, TextureUsage.Emissive, emissiveMap, correlatedMaterials);\n const createTextureInfo = (usage) => {\n this[$pbrTextures].set(usage, new TextureInfo(onUpdate, usage, null, correlatedMaterials));\n };\n createTextureInfo(TextureUsage.Clearcoat);\n createTextureInfo(TextureUsage.ClearcoatRoughness);\n createTextureInfo(TextureUsage.ClearcoatNormal);\n createTextureInfo(TextureUsage.SheenColor);\n createTextureInfo(TextureUsage.SheenRoughness);\n createTextureInfo(TextureUsage.Transmission);\n createTextureInfo(TextureUsage.Thickness);\n createTextureInfo(TextureUsage.Specular);\n createTextureInfo(TextureUsage.SpecularColor);\n createTextureInfo(TextureUsage.Iridescence);\n createTextureInfo(TextureUsage.IridescenceThickness);\n createTextureInfo(TextureUsage.Anisotropy);\n }\n async [$getLoadedMaterial]() {\n if (this[$lazyLoadGLTFInfo] != null) {\n const material = await this[$lazyLoadGLTFInfo].doLazyLoad();\n this[$initialize]();\n // Releases lazy load info.\n this[$lazyLoadGLTFInfo] = undefined;\n // Redefines the method as a noop method.\n this.ensureLoaded = async () => { };\n return material;\n }\n return null;\n }\n colorFromRgb(rgb) {\n const color = new Color();\n if (rgb instanceof Array) {\n color.fromArray(rgb);\n }\n else {\n color.set(rgb);\n }\n return color;\n }\n [$ensureMaterialIsLoaded]() {\n if (this[$lazyLoadGLTFInfo] == null) {\n return;\n }\n throw new Error(`Material \"${this.name}\" has not been loaded, call 'await\n myMaterial.ensureLoaded()' before using an unloaded material.`);\n }\n async ensureLoaded() {\n await this[$getLoadedMaterial]();\n }\n get isLoaded() {\n return this[$lazyLoadGLTFInfo] == null;\n }\n get isActive() {\n return this[$isActive];\n }\n [$setActive](isActive) {\n this[$isActive] = isActive;\n }\n get name() {\n return this[$name] || '';\n }\n set name(name) {\n this[$name] = name;\n if (this[$correlatedObjects] != null) {\n for (const threeMaterial of this[$correlatedObjects]) {\n threeMaterial.name = name;\n }\n }\n }\n get pbrMetallicRoughness() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrMetallicRoughness];\n }\n get normalTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$normalTexture];\n }\n get occlusionTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$occlusionTexture];\n }\n get emissiveTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$emissiveTexture];\n }\n get emissiveFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].emissive.toArray();\n }\n get index() {\n return this[$gltfIndex];\n }\n hasVariant(name) {\n const variantData = this[$modelVariants].get(name);\n return variantData != null && this[$variantIndices].has(variantData.index);\n }\n setEmissiveFactor(rgb) {\n this[$ensureMaterialIsLoaded]();\n const color = this.colorFromRgb(rgb);\n for (const material of this[$correlatedObjects]) {\n material.emissive.set(color);\n }\n this[$onUpdate]();\n }\n [$getAlphaMode]() {\n // Follows implementation of GLTFExporter from three.js\n if (this[$backingThreeMaterial].transparent) {\n return 'BLEND';\n }\n else {\n if (this[$backingThreeMaterial].alphaTest > 0.0) {\n return 'MASK';\n }\n }\n return 'OPAQUE';\n }\n [$applyAlphaCutoff]() {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n if (this[$getAlphaMode]() === 'MASK') {\n if (material.alphaTest == undefined) {\n material.alphaTest = 0.5;\n }\n }\n else {\n material.alphaTest = undefined;\n }\n material.needsUpdate = true;\n }\n }\n setAlphaCutoff(cutoff) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.alphaTest = cutoff;\n material.needsUpdate = true;\n }\n // Set AlphaCutoff to undefined if AlphaMode is not MASK.\n this[$applyAlphaCutoff]();\n this[$onUpdate]();\n }\n getAlphaCutoff() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].alphaTest;\n }\n setDoubleSided(doubleSided) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n // When double-sided is disabled gltf spec dictates that Back-Face culling\n // must be disabled, in three.js parlance that would mean FrontSide\n // rendering only.\n // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#double-sided\n material.side = doubleSided ? DoubleSide : FrontSide;\n material.needsUpdate = true;\n }\n this[$onUpdate]();\n }\n getDoubleSided() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].side == DoubleSide;\n }\n setAlphaMode(alphaMode) {\n this[$ensureMaterialIsLoaded]();\n const enableTransparency = (material, enabled) => {\n material.transparent = enabled;\n material.depthWrite = !enabled;\n };\n for (const material of this[$correlatedObjects]) {\n enableTransparency(material, alphaMode === 'BLEND');\n if (alphaMode === 'MASK') {\n material.alphaTest = 0.5;\n }\n else {\n material.alphaTest = undefined;\n }\n material.needsUpdate = true;\n }\n this[$onUpdate]();\n }\n getAlphaMode() {\n this[$ensureMaterialIsLoaded]();\n return this[$getAlphaMode]();\n }\n /**\n * PBR Next properties.\n */\n // KHR_materials_emissive_strength\n get emissiveStrength() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].emissiveIntensity;\n }\n setEmissiveStrength(emissiveStrength) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.emissiveIntensity = emissiveStrength;\n }\n this[$onUpdate]();\n }\n // KHR_materials_clearcoat\n get clearcoatFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].clearcoat;\n }\n get clearcoatRoughnessFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].clearcoatRoughness;\n }\n get clearcoatTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Clearcoat);\n }\n get clearcoatRoughnessTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.ClearcoatRoughness);\n }\n get clearcoatNormalTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.ClearcoatNormal);\n }\n get clearcoatNormalScale() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].clearcoatNormalScale.x;\n }\n setClearcoatFactor(clearcoatFactor) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.clearcoat = clearcoatFactor;\n }\n this[$onUpdate]();\n }\n setClearcoatRoughnessFactor(clearcoatRoughnessFactor) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.clearcoatRoughness = clearcoatRoughnessFactor;\n }\n this[$onUpdate]();\n }\n setClearcoatNormalScale(clearcoatNormalScale) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.clearcoatNormalScale =\n new Vector2(clearcoatNormalScale, clearcoatNormalScale);\n }\n this[$onUpdate]();\n }\n // KHR_materials_ior\n get ior() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].ior;\n }\n setIor(ior) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.ior = ior;\n }\n this[$onUpdate]();\n }\n // KHR_materials_sheen\n get sheenColorFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].sheenColor.toArray();\n }\n get sheenColorTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.SheenColor);\n }\n get sheenRoughnessFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].sheenRoughness;\n }\n get sheenRoughnessTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.SheenRoughness);\n }\n setSheenColorFactor(rgb) {\n this[$ensureMaterialIsLoaded]();\n const color = this.colorFromRgb(rgb);\n for (const material of this[$correlatedObjects]) {\n material.sheenColor.set(color);\n // Three.js GLTFExporter checks for internal sheen value.\n material.sheen = 1;\n }\n this[$onUpdate]();\n }\n setSheenRoughnessFactor(roughness) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.sheenRoughness = roughness;\n // Three.js GLTFExporter checks for internal sheen value.\n material.sheen = 1;\n }\n this[$onUpdate]();\n }\n // KHR_materials_transmission\n get transmissionFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].transmission;\n }\n get transmissionTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Transmission);\n }\n setTransmissionFactor(transmission) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.transmission = transmission;\n }\n this[$onUpdate]();\n }\n // KHR_materials_volume\n get thicknessFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].thickness;\n }\n get thicknessTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Thickness);\n }\n get attenuationDistance() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].attenuationDistance;\n }\n get attenuationColor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].attenuationColor.toArray();\n }\n setThicknessFactor(thickness) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.thickness = thickness;\n }\n this[$onUpdate]();\n }\n setAttenuationDistance(attenuationDistance) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.attenuationDistance = attenuationDistance;\n }\n this[$onUpdate]();\n }\n setAttenuationColor(rgb) {\n this[$ensureMaterialIsLoaded]();\n const color = this.colorFromRgb(rgb);\n for (const material of this[$correlatedObjects]) {\n material.attenuationColor.set(color);\n }\n this[$onUpdate]();\n }\n // KHR_materials_specular\n get specularFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].specularIntensity;\n }\n get specularTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Specular);\n }\n get specularColorFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].specularColor.toArray();\n }\n get specularColorTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.SheenColor);\n }\n setSpecularFactor(specularFactor) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.specularIntensity = specularFactor;\n }\n this[$onUpdate]();\n }\n setSpecularColorFactor(rgb) {\n this[$ensureMaterialIsLoaded]();\n const color = this.colorFromRgb(rgb);\n for (const material of this[$correlatedObjects]) {\n material.specularColor.set(color);\n }\n this[$onUpdate]();\n }\n // KHR_materials_iridescence\n get iridescenceFactor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].iridescence;\n }\n get iridescenceTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Iridescence);\n }\n get iridescenceIor() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].iridescenceIOR;\n }\n get iridescenceThicknessMinimum() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].iridescenceThicknessRange[0];\n }\n get iridescenceThicknessMaximum() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].iridescenceThicknessRange[1];\n }\n get iridescenceThicknessTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.IridescenceThickness);\n }\n setIridescenceFactor(iridescence) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.iridescence = iridescence;\n }\n this[$onUpdate]();\n }\n setIridescenceIor(ior) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.iridescenceIOR = ior;\n }\n this[$onUpdate]();\n }\n setIridescenceThicknessMinimum(thicknessMin) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.iridescenceThicknessRange[0] = thicknessMin;\n }\n this[$onUpdate]();\n }\n setIridescenceThicknessMaximum(thicknessMax) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.iridescenceThicknessRange[1] = thicknessMax;\n }\n this[$onUpdate]();\n }\n // KHR_materials_anisotropy\n get anisotropyStrength() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].anisotropy;\n }\n get anisotropyRotation() {\n this[$ensureMaterialIsLoaded]();\n return this[$backingThreeMaterial].anisotropyRotation;\n }\n get anisotropyTexture() {\n this[$ensureMaterialIsLoaded]();\n return this[$pbrTextures].get(TextureUsage.Anisotropy);\n }\n setAnisotropyStrength(strength) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.anisotropy = strength;\n }\n this[$onUpdate]();\n }\n setAnisotropyRotation(rotation) {\n this[$ensureMaterialIsLoaded]();\n for (const material of this[$correlatedObjects]) {\n material.anisotropyRotation = rotation;\n }\n this[$onUpdate]();\n }\n}\n//# sourceMappingURL=material.js.map","import { $getLoadedMaterial, $variantIndices } from '../material.js';\nimport { $correlatedObjects } from '../three-dom-element.js';\n// Defines the base level node methods and data.\nexport class Node {\n constructor(name) {\n this.name = '';\n this.children = new Array();\n this.name = name;\n }\n}\n// Represents a primitive in a glTF mesh.\nexport class PrimitiveNode extends Node {\n constructor(mesh, mvMaterials, modelVariants, correlatedSceneGraph) {\n super(mesh.name);\n // Maps glTF material index number to a material that this primitive supports.\n this.materials = new Map();\n // Maps variant index to material.\n this.variantToMaterialMap = new Map();\n this.initialMaterialIdx = 0;\n this.activeMaterialIdx = 0;\n this.mesh = mesh;\n const { gltf, threeGLTF, threeObjectMap } = correlatedSceneGraph;\n this.parser = threeGLTF.parser;\n this.modelVariants = modelVariants;\n this.mesh.userData.variantData = modelVariants;\n // Captures the primitive's initial material.\n const materialMappings = threeObjectMap.get(mesh.material);\n if (materialMappings.materials != null) {\n this.initialMaterialIdx = this.activeMaterialIdx =\n materialMappings.materials;\n }\n else {\n console.error(`Primitive (${mesh.name}) missing initial material reference.`);\n }\n // Gets the mesh index from the node.\n const associations = mesh.userData.associations ||\n {};\n if (associations.meshes == null) {\n console.error('Mesh is missing primitive index association');\n return;\n }\n // The gltf mesh array to sample from.\n const meshElementArray = gltf['meshes'] || [];\n // List of primitives under the mesh.\n const gltfPrimitives = (meshElementArray[associations.meshes].primitives || []);\n const gltfPrimitive = gltfPrimitives[associations.primitives];\n if (gltfPrimitive == null) {\n console.error('Mesh primitive definition is missing.');\n return;\n }\n // Maps the gltfPrimitive default to a material.\n if (gltfPrimitive.material != null) {\n this.materials.set(gltfPrimitive.material, mvMaterials[gltfPrimitive.material]);\n }\n else {\n const defaultIdx = mvMaterials.findIndex((mat) => {\n return mat.name === 'Default';\n });\n if (defaultIdx >= 0) {\n this.materials.set(defaultIdx, mvMaterials[defaultIdx]);\n }\n else {\n console.warn('gltfPrimitive has no material!');\n }\n }\n if (gltfPrimitive.extensions &&\n gltfPrimitive.extensions['KHR_materials_variants']) {\n const variantsExtension = gltfPrimitive.extensions['KHR_materials_variants'];\n const extensions = threeGLTF.parser.json.extensions;\n const variantNames = extensions['KHR_materials_variants'].variants;\n // Provides definition now that we know there are variants to\n // support.\n for (const mapping of variantsExtension.mappings) {\n const mvMaterial = mvMaterials[mapping.material];\n // Maps variant indices to Materials.\n this.materials.set(mapping.material, mvMaterial);\n for (const variant of mapping.variants) {\n const { name } = variantNames[variant];\n this.variantToMaterialMap.set(variant, mvMaterial);\n // Provides variant info for material self lookup.\n mvMaterial[$variantIndices].add(variant);\n // Updates the models variant data.\n if (!modelVariants.has(name)) {\n modelVariants.set(name, { name, index: variant });\n }\n }\n }\n }\n }\n async setActiveMaterial(material) {\n const mvMaterial = this.materials.get(material);\n if (material !== this.activeMaterialIdx) {\n const backingMaterials = mvMaterial[$correlatedObjects];\n const baseMaterial = await mvMaterial[$getLoadedMaterial]();\n if (baseMaterial != null) {\n this.mesh.material = baseMaterial;\n }\n else {\n this.mesh.material = backingMaterials.values().next().value;\n }\n this.parser.assignFinalMaterial(this.mesh);\n backingMaterials.add(this.mesh.material);\n this.activeMaterialIdx = material;\n }\n return this.mesh.material;\n }\n getActiveMaterial() {\n return this.materials.get(this.activeMaterialIdx);\n }\n getMaterial(index) {\n return this.materials.get(index);\n }\n async enableVariant(name) {\n if (name == null) {\n return this.setActiveMaterial(this.initialMaterialIdx);\n }\n if (this.variantToMaterialMap != null && this.modelVariants.has(name)) {\n const modelVariants = this.modelVariants.get(name);\n return this.enableVariantHelper(modelVariants.index);\n }\n return null;\n }\n async enableVariantHelper(index) {\n if (this.variantToMaterialMap != null && index != null) {\n const material = this.variantToMaterialMap.get(index);\n if (material != null) {\n return this.setActiveMaterial(material.index);\n }\n }\n return null;\n }\n async instantiateVariants() {\n if (this.variantToMaterialMap == null) {\n return;\n }\n for (const index of this.variantToMaterialMap.keys()) {\n const variantMaterial = this.mesh.userData.variantMaterials.get(index);\n if (variantMaterial.material != null) {\n continue;\n }\n const threeMaterial = await this.enableVariantHelper(index);\n if (threeMaterial != null) {\n variantMaterial.material = threeMaterial;\n }\n }\n }\n get variantInfo() {\n return this.variantToMaterialMap;\n }\n addVariant(materialVariant, variantName) {\n if (!this.ensureVariantIsUnused(variantName)) {\n return false;\n }\n // Adds the variant to the model variants if needed.\n if (!this.modelVariants.has(variantName)) {\n this.modelVariants.set(variantName, { name: variantName, index: this.modelVariants.size });\n }\n const modelVariantData = this.modelVariants.get(variantName);\n const variantIndex = modelVariantData.index;\n // Updates materials mapped to the variant.\n materialVariant[$variantIndices].add(variantIndex);\n // Updates internal mappings.\n this.variantToMaterialMap.set(variantIndex, materialVariant);\n this.materials.set(materialVariant.index, materialVariant);\n this.updateVariantUserData(variantIndex, materialVariant);\n return true;\n }\n deleteVariant(variantIndex) {\n if (this.variantInfo.has(variantIndex)) {\n this.variantInfo.delete(variantIndex);\n const userDataMap = this.mesh.userData.variantMaterials;\n if (userDataMap != null) {\n userDataMap.delete(variantIndex);\n }\n }\n }\n updateVariantUserData(variantIndex, materialVariant) {\n // Adds variants name to material variants set.\n materialVariant[$variantIndices].add(variantIndex);\n this.mesh.userData.variantData = this.modelVariants;\n // Updates import data (see VariantMaterialLoaderPlugin.ts).\n this.mesh.userData.variantMaterials = this.mesh.userData.variantMaterials ||\n new Map();\n const map = this.mesh.userData.variantMaterials;\n map.set(variantIndex, {\n material: materialVariant[$correlatedObjects].values().next().value,\n gltfMaterialIndex: materialVariant.index,\n });\n }\n ensureVariantIsUnused(variantName) {\n const modelVariants = this.modelVariants.get(variantName);\n if (modelVariants != null && this.variantInfo.has(modelVariants.index)) {\n console.warn(`Primitive cannot add variant '${variantName}' for this material, it already exists.`);\n return false;\n }\n return true;\n }\n}\n//# sourceMappingURL=primitive-node.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar _a, _b, _c, _d, _e, _f;\nimport { Mesh } from 'three';\nimport { $setActive, $variantIndices, Material } from './material.js';\nimport { Node, PrimitiveNode } from './nodes/primitive-node.js';\nimport { $correlatedObjects } from './three-dom-element.js';\nexport const $materials = Symbol('materials');\nconst $hierarchy = Symbol('hierarchy');\nconst $roots = Symbol('roots');\nexport const $primitivesList = Symbol('primitives');\nexport const $loadVariant = Symbol('loadVariant');\nexport const $prepareVariantsForExport = Symbol('prepareVariantsForExport');\nexport const $switchVariant = Symbol('switchVariant');\nexport const $materialFromPoint = Symbol('materialFromPoint');\nexport const $nodeFromPoint = Symbol('nodeFromPoint');\nexport const $nodeFromIndex = Symbol('nodeFromIndex');\nexport const $variantData = Symbol('variantData');\nexport const $availableVariants = Symbol('availableVariants');\nconst $modelOnUpdate = Symbol('modelOnUpdate');\nconst $cloneMaterial = Symbol('cloneMaterial');\n// Holds onto temporary scene context information needed to perform lazy loading\n// of a resource.\nexport class LazyLoader {\n constructor(gltf, gltfElementMap, mapKey, doLazyLoad) {\n this.gltf = gltf;\n this.gltfElementMap = gltfElementMap;\n this.mapKey = mapKey;\n this.doLazyLoad = doLazyLoad;\n }\n}\n/**\n * A Model facades the top-level GLTF object returned by Three.js' GLTFLoader.\n * Currently, the model only bothers itself with the materials in the Three.js\n * scene graph.\n */\nexport class Model {\n constructor(correlatedSceneGraph, onUpdate = () => { }) {\n this[_a] = new Array();\n this[_b] = new Array();\n this[_c] = new Array();\n this[_d] = new Array();\n this[_e] = () => { };\n this[_f] = new Map();\n this[$modelOnUpdate] = onUpdate;\n const { gltf, threeGLTF, gltfElementMap } = correlatedSceneGraph;\n for (const [i, material] of gltf.materials.entries()) {\n const correlatedMaterial = gltfElementMap.get(material);\n if (correlatedMaterial != null) {\n this[$materials].push(new Material(onUpdate, i, true, this[$variantData], correlatedMaterial, material.name));\n }\n else {\n const elementArray = gltf['materials'] || [];\n const gltfMaterialDef = elementArray[i];\n const threeMaterialSet = new Set();\n gltfElementMap.set(gltfMaterialDef, threeMaterialSet);\n const materialLoadCallback = async () => {\n const threeMaterial = await threeGLTF.parser.getDependency('material', i);\n threeMaterialSet.add(threeMaterial);\n return threeMaterial;\n };\n // Configures the material for lazy loading.\n this[$materials].push(new Material(onUpdate, i, false, this[$variantData], threeMaterialSet, material.name, new LazyLoader(gltf, gltfElementMap, gltfMaterialDef, materialLoadCallback)));\n }\n }\n // Creates a hierarchy of Nodes. Allows not just for switching which\n // material is applied to a mesh but also exposes a way to provide API\n // for switching materials and general assignment/modification.\n // Prepares for scene iteration.\n const parentMap = new Map();\n const nodeStack = new Array();\n for (const object of threeGLTF.scene.children) {\n nodeStack.push(object);\n }\n // Walks the hierarchy and creates a node tree.\n while (nodeStack.length > 0) {\n const object = nodeStack.pop();\n let node = null;\n if (object instanceof Mesh) {\n node = new PrimitiveNode(object, this.materials, this[$variantData], correlatedSceneGraph);\n this[$primitivesList].push(node);\n }\n else {\n node = new Node(object.name);\n }\n const parent = parentMap.get(object);\n if (parent != null) {\n parent.children.push(node);\n }\n else {\n this[$roots].push(node);\n }\n this[$hierarchy].push(node);\n for (const child of object.children) {\n nodeStack.push(child);\n parentMap.set(object, node);\n }\n }\n }\n /**\n * Materials are listed in the order of the GLTF materials array, plus a\n * default material at the end if one is used.\n *\n * TODO(#1003): How do we handle non-active scenes?\n */\n get materials() {\n return this[$materials];\n }\n [(_a = $materials, _b = $hierarchy, _c = $roots, _d = $primitivesList, _e = $modelOnUpdate, _f = $variantData, $availableVariants)]() {\n const variants = Array.from(this[$variantData].values());\n variants.sort((a, b) => {\n return a.index - b.index;\n });\n return variants.map((data) => {\n return data.name;\n });\n }\n getMaterialByName(name) {\n const matches = this[$materials].filter(material => {\n return material.name === name;\n });\n if (matches.length > 0) {\n return matches[0];\n }\n return null;\n }\n [$nodeFromIndex](mesh, primitive) {\n const found = this[$hierarchy].find((node) => {\n if (node instanceof PrimitiveNode) {\n const { meshes, primitives } = node.mesh.userData.associations;\n if (meshes == mesh && primitives == primitive) {\n return true;\n }\n }\n return false;\n });\n return found == null ? null : found;\n }\n [$nodeFromPoint](hit) {\n return this[$hierarchy].find((node) => {\n if (node instanceof PrimitiveNode) {\n const primitive = node;\n if (primitive.mesh === hit.object) {\n return true;\n }\n }\n return false;\n });\n }\n /**\n * Intersects a ray with the Model and returns the first material whose\n * object was intersected.\n */\n [$materialFromPoint](hit) {\n return this[$nodeFromPoint](hit).getActiveMaterial();\n }\n /**\n * Switches model variant to the variant name provided, or switches to\n * default/initial materials if 'null' is provided.\n */\n async [$switchVariant](variantName) {\n for (const primitive of this[$primitivesList]) {\n await primitive.enableVariant(variantName);\n }\n for (const material of this.materials) {\n material[$setActive](false);\n }\n // Marks the materials that are now in use after the variant switch.\n for (const primitive of this[$primitivesList]) {\n this.materials[primitive.getActiveMaterial().index][$setActive](true);\n }\n }\n async [$prepareVariantsForExport]() {\n const promises = new Array();\n for (const primitive of this[$primitivesList]) {\n promises.push(primitive.instantiateVariants());\n }\n await Promise.all(promises);\n }\n [$cloneMaterial](index, newMaterialName) {\n const material = this.materials[index];\n if (!material.isLoaded) {\n console.error(`Cloning an unloaded material,\n call 'material.ensureLoaded() before cloning the material.`);\n }\n const threeMaterialSet = material[$correlatedObjects];\n const clonedSet = new Set();\n for (const [i, threeMaterial] of threeMaterialSet.entries()) {\n const clone = threeMaterial.clone();\n clone.name =\n newMaterialName + (threeMaterialSet.size > 1 ? '_inst' + i : '');\n clonedSet.add(clone);\n }\n const clonedMaterial = new Material(this[$modelOnUpdate], this[$materials].length, false, // Cloned as inactive.\n this[$variantData], clonedSet, newMaterialName);\n this[$materials].push(clonedMaterial);\n return clonedMaterial;\n }\n createMaterialInstanceForVariant(originalMaterialIndex, newMaterialName, variantName, activateVariant = true) {\n let variantMaterialInstance = null;\n for (const primitive of this[$primitivesList]) {\n const variantData = this[$variantData].get(variantName);\n // Skips the primitive if the variant already exists.\n if (variantData != null && primitive.variantInfo.has(variantData.index)) {\n continue;\n }\n // Skips the primitive if the source/original material does not exist.\n if (primitive.getMaterial(originalMaterialIndex) == null) {\n continue;\n }\n if (!this.hasVariant(variantName)) {\n this.createVariant(variantName);\n }\n if (variantMaterialInstance == null) {\n variantMaterialInstance =\n this[$cloneMaterial](originalMaterialIndex, newMaterialName);\n }\n primitive.addVariant(variantMaterialInstance, variantName);\n }\n if (activateVariant && variantMaterialInstance != null) {\n variantMaterialInstance[$setActive](true);\n this.materials[originalMaterialIndex][$setActive](false);\n for (const primitive of this[$primitivesList]) {\n primitive.enableVariant(variantName);\n }\n }\n return variantMaterialInstance;\n }\n createVariant(variantName) {\n if (!this[$variantData].has(variantName)) {\n // Adds the name if it's not already in the list.\n this[$variantData].set(variantName, { name: variantName, index: this[$variantData].size });\n }\n else {\n console.warn(`Variant '${variantName}'' already exists`);\n }\n }\n hasVariant(variantName) {\n return this[$variantData].has(variantName);\n }\n setMaterialToVariant(materialIndex, targetVariantName) {\n if (this[$availableVariants]().find(name => name === targetVariantName) ==\n null) {\n console.warn(`Can't add material to '${targetVariantName}', the variant does not exist.'`);\n return;\n }\n if (materialIndex < 0 || materialIndex >= this.materials.length) {\n console.error(`setMaterialToVariant(): materialIndex is out of bounds.`);\n return;\n }\n for (const primitive of this[$primitivesList]) {\n const material = primitive.getMaterial(materialIndex);\n // Ensures the material exists on the primitive before setting it to a\n // variant.\n if (material != null) {\n primitive.addVariant(material, targetVariantName);\n }\n }\n }\n updateVariantName(currentName, newName) {\n const variantData = this[$variantData].get(currentName);\n if (variantData == null) {\n return;\n }\n variantData.name = newName;\n this[$variantData].set(newName, variantData);\n this[$variantData].delete(currentName);\n }\n deleteVariant(variantName) {\n const variant = this[$variantData].get(variantName);\n if (variant == null) {\n return;\n }\n for (const material of this.materials) {\n if (material.hasVariant(variantName)) {\n material[$variantIndices].delete(variant.index);\n }\n }\n for (const primitive of this[$primitivesList]) {\n primitive.deleteVariant(variant.index);\n }\n this[$variantData].delete(variantName);\n }\n}\n//# sourceMappingURL=model.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { CanvasTexture, RepeatWrapping, SRGBColorSpace, VideoTexture } from 'three';\nimport { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';\nimport { $needsRender, $onModelLoad, $progressTracker, $renderer, $scene } from '../model-viewer-base.js';\nimport GLTFExporterMaterialsVariantsExtension from '../three-components/gltf-instance/VariantMaterialExporterPlugin.js';\nimport { $availableVariants, $materialFromPoint, $prepareVariantsForExport, $switchVariant, Model } from './scene-graph/model.js';\nimport { Texture as ModelViewerTexture } from './scene-graph/texture.js';\nexport const $currentGLTF = Symbol('currentGLTF');\nexport const $originalGltfJson = Symbol('originalGltfJson');\nexport const $model = Symbol('model');\nconst $getOnUpdateMethod = Symbol('getOnUpdateMethod');\nconst $buildTexture = Symbol('buildTexture');\n/**\n * SceneGraphMixin manages exposes a model API in order to support operations on\n * the scene graph.\n */\nexport const SceneGraphMixin = (ModelViewerElement) => {\n var _a, _b, _c;\n class SceneGraphModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this[_a] = undefined;\n this[_b] = null;\n this[_c] = null;\n this.variantName = null;\n this.orientation = '0 0 0';\n this.scale = '1 1 1';\n }\n // Scene-graph API:\n /** @export */\n get model() {\n return this[$model];\n }\n get availableVariants() {\n return this.model ? this.model[$availableVariants]() : [];\n }\n /**\n * Returns a deep copy of the gltf JSON as loaded. It will not reflect\n * changes to the scene-graph, nor will editing it have any effect.\n */\n get originalGltfJson() {\n return this[$originalGltfJson];\n }\n [(_a = $model, _b = $currentGLTF, _c = $originalGltfJson, $getOnUpdateMethod)]() {\n return () => {\n this[$needsRender]();\n };\n }\n [$buildTexture](texture) {\n // Applies glTF default settings.\n texture.colorSpace = SRGBColorSpace;\n texture.wrapS = RepeatWrapping;\n texture.wrapT = RepeatWrapping;\n return new ModelViewerTexture(this[$getOnUpdateMethod](), texture);\n }\n async createTexture(uri, type = 'image/png') {\n const { textureUtils } = this[$renderer];\n const texture = await textureUtils.loadImage(uri, this.withCredentials);\n texture.userData.mimeType = type;\n return this[$buildTexture](texture);\n }\n async createLottieTexture(uri, quality = 1) {\n const { textureUtils } = this[$renderer];\n const texture = await textureUtils.loadLottie(uri, quality, this.withCredentials);\n return this[$buildTexture](texture);\n }\n createVideoTexture(uri) {\n const video = document.createElement('video');\n video.crossOrigin =\n this.withCredentials ? 'use-credentials' : 'anonymous';\n video.src = uri;\n video.muted = true;\n video.playsInline = true;\n video.loop = true;\n video.play();\n const texture = new VideoTexture(video);\n return this[$buildTexture](texture);\n }\n createCanvasTexture() {\n const canvas = document.createElement('canvas');\n const texture = new CanvasTexture(canvas);\n return this[$buildTexture](texture);\n }\n async updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('variantName')) {\n const updateVariantProgress = this[$progressTracker].beginActivity('variant-update');\n updateVariantProgress(0.1);\n const model = this[$model];\n const { variantName } = this;\n if (model != null) {\n await model[$switchVariant](variantName);\n this[$needsRender]();\n this.dispatchEvent(new CustomEvent('variant-applied'));\n }\n updateVariantProgress(1.0);\n }\n if (changedProperties.has('orientation') ||\n changedProperties.has('scale')) {\n if (!this.loaded) {\n return;\n }\n const scene = this[$scene];\n scene.applyTransform();\n scene.updateBoundingBox();\n scene.updateShadow();\n this[$renderer].arRenderer.onUpdateScene();\n this[$needsRender]();\n }\n }\n [$onModelLoad]() {\n super[$onModelLoad]();\n const { currentGLTF } = this[$scene];\n if (currentGLTF != null) {\n const { correlatedSceneGraph } = currentGLTF;\n if (correlatedSceneGraph != null &&\n currentGLTF !== this[$currentGLTF]) {\n this[$model] =\n new Model(correlatedSceneGraph, this[$getOnUpdateMethod]());\n this[$originalGltfJson] =\n JSON.parse(JSON.stringify(correlatedSceneGraph.gltf));\n }\n // KHR_materials_variants extension spec:\n // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_variants\n if ('variants' in currentGLTF.userData) {\n this.requestUpdate('variantName');\n }\n }\n this[$currentGLTF] = currentGLTF;\n }\n /** @export */\n async exportScene(options) {\n const scene = this[$scene];\n return new Promise(async (resolve, reject) => {\n // Defaults\n const opts = {\n binary: true,\n onlyVisible: true,\n maxTextureSize: Infinity,\n includeCustomExtensions: false,\n forceIndices: false\n };\n Object.assign(opts, options);\n // Not configurable\n opts.animations = scene.animations;\n opts.truncateDrawRange = true;\n const shadow = scene.shadow;\n let visible = false;\n // Remove shadow from export\n if (shadow != null) {\n visible = shadow.visible;\n shadow.visible = false;\n }\n await this[$model][$prepareVariantsForExport]();\n const exporter = new GLTFExporter()\n .register((writer) => new GLTFExporterMaterialsVariantsExtension(writer));\n exporter.parse(scene.model, (gltf) => {\n return resolve(new Blob([opts.binary ? gltf : JSON.stringify(gltf)], {\n type: opts.binary ? 'application/octet-stream' :\n 'application/json'\n }));\n }, () => {\n return reject('glTF export failed');\n }, opts);\n if (shadow != null) {\n shadow.visible = visible;\n }\n });\n }\n materialFromPoint(pixelX, pixelY) {\n const model = this[$model];\n if (model == null) {\n return null;\n }\n const scene = this[$scene];\n const ndcCoords = scene.getNDC(pixelX, pixelY);\n const hit = scene.hitFromPoint(ndcCoords);\n if (hit == null || hit.face == null) {\n return null;\n }\n return model[$materialFromPoint](hit);\n }\n }\n __decorate([\n property({ type: String, attribute: 'variant-name' })\n ], SceneGraphModelViewerElement.prototype, \"variantName\", void 0);\n __decorate([\n property({ type: String, attribute: 'orientation' })\n ], SceneGraphModelViewerElement.prototype, \"orientation\", void 0);\n __decorate([\n property({ type: String, attribute: 'scale' })\n ], SceneGraphModelViewerElement.prototype, \"scale\", void 0);\n return SceneGraphModelViewerElement;\n};\n//# sourceMappingURL=scene-graph.js.map","/* @license\n * Copyright 2023 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Mesh, MeshBasicMaterial, SphereGeometry, Vector3 } from 'three';\nexport class GroundedSkybox extends Mesh {\n constructor() {\n super(undefined, new MeshBasicMaterial({ depthWrite: false }));\n this.height = 0;\n this.radius = 0;\n this.resolution = 0;\n this.userData.noHit = true;\n }\n get map() {\n return this.material.map;\n }\n set map(skybox) {\n this.material.map = skybox;\n }\n isUsable() {\n return this.height > 0 && this.radius > 0 && this.geometry != null &&\n this.map != null;\n }\n updateGeometry(height = this.height, radius = this.radius, resolution = 128) {\n if (height != this.height || radius != this.radius ||\n resolution != this.resolution) {\n this.height = height;\n this.radius = radius;\n this.resolution = resolution;\n if (height > 0 && radius > 0) {\n this.geometry.dispose();\n this.geometry = makeGeometry(height, radius, resolution);\n }\n }\n }\n}\nfunction makeGeometry(height, radius, resolution) {\n const geometry = new SphereGeometry(radius, 2 * resolution, resolution);\n geometry.scale(1, 1, -1);\n const pos = geometry.getAttribute('position');\n const tmp = new Vector3();\n for (let i = 0; i < pos.count; ++i) {\n tmp.fromBufferAttribute(pos, i);\n if (tmp.y < 0) {\n // Smooth out the transition from flat floor to sphere:\n const y1 = -height * 3 / 2;\n const f = tmp.y < y1 ? -height / tmp.y : (1 - tmp.y * tmp.y / (3 * y1 * y1));\n tmp.multiplyScalar(f);\n tmp.toArray(pos.array, 3 * i);\n }\n }\n pos.needsUpdate = true;\n return geometry;\n}\n//# sourceMappingURL=GroundedSkybox.js.map","/* @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Matrix3, Quaternion, Triangle, Vector3 } from 'three';\nimport { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\nimport { normalizeUnit } from '../styles/conversions.js';\nimport { parseExpressions } from '../styles/parsers.js';\nconst a = new Vector3();\nconst b = new Vector3();\nconst c = new Vector3();\nconst mat = new Matrix3();\nconst triangle = new Triangle();\nconst quat = new Quaternion();\n/**\n * The Hotspot object is a reference-counted slot. If decrement() returns true,\n * it should be removed from the tree so it can be garbage-collected.\n */\nexport class Hotspot extends CSS2DObject {\n constructor(config) {\n super(document.createElement('div'));\n this.normal = new Vector3(0, 1, 0);\n this.initialized = false;\n this.referenceCount = 1;\n this.pivot = document.createElement('div');\n this.slot = document.createElement('slot');\n this.element.classList.add('annotation-wrapper');\n this.slot.name = config.name;\n this.element.appendChild(this.pivot);\n this.pivot.appendChild(this.slot);\n this.updatePosition(config.position);\n this.updateNormal(config.normal);\n this.surface = config.surface;\n }\n get facingCamera() {\n return !this.element.classList.contains('hide');\n }\n /**\n * Sets the hotspot to be in the highly visible foreground state.\n */\n show() {\n if (!this.facingCamera || !this.initialized) {\n this.updateVisibility(true);\n }\n }\n /**\n * Sets the hotspot to be in the diminished background state.\n */\n hide() {\n if (this.facingCamera || !this.initialized) {\n this.updateVisibility(false);\n }\n }\n /**\n * Call this when adding elements to the same slot to keep track.\n */\n increment() {\n this.referenceCount++;\n }\n /**\n * Call this when removing elements from the slot; returns true when the slot\n * is unused.\n */\n decrement() {\n if (this.referenceCount > 0) {\n --this.referenceCount;\n }\n return this.referenceCount === 0;\n }\n /**\n * Change the position of the hotspot to the input string, in the same format\n * as the data-position attribute.\n */\n updatePosition(position) {\n if (position == null)\n return;\n const positionNodes = parseExpressions(position)[0].terms;\n for (let i = 0; i < 3; ++i) {\n this.position.setComponent(i, normalizeUnit(positionNodes[i]).number);\n }\n this.updateMatrixWorld();\n }\n /**\n * Change the hotspot's normal to the input string, in the same format as the\n * data-normal attribute.\n */\n updateNormal(normal) {\n if (normal == null)\n return;\n const normalNodes = parseExpressions(normal)[0].terms;\n for (let i = 0; i < 3; ++i) {\n this.normal.setComponent(i, normalNodes[i].number);\n }\n }\n updateSurface() {\n const { mesh, tri, bary } = this;\n if (mesh == null || tri == null || bary == null) {\n return;\n }\n mesh.getVertexPosition(tri.x, a);\n mesh.getVertexPosition(tri.y, b);\n mesh.getVertexPosition(tri.z, c);\n a.toArray(mat.elements, 0);\n b.toArray(mat.elements, 3);\n c.toArray(mat.elements, 6);\n this.position.copy(bary).applyMatrix3(mat);\n const target = this.parent;\n target.worldToLocal(mesh.localToWorld(this.position));\n triangle.set(a, b, c);\n triangle.getNormal(this.normal).transformDirection(mesh.matrixWorld);\n const pivot = target.parent;\n quat.setFromAxisAngle(a.set(0, 1, 0), -pivot.rotation.y);\n this.normal.applyQuaternion(quat);\n }\n orient(radians) {\n this.pivot.style.transform = `rotate(${radians}rad)`;\n }\n updateVisibility(show) {\n this.element.classList.toggle('hide', !show);\n // NOTE: ShadyDOM doesn't support slot.assignedElements, otherwise we could\n // use that here.\n this.slot.assignedNodes().forEach((node) => {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return;\n }\n const element = node;\n // Visibility attribute can be configured per-node in the hotspot:\n const visibilityAttribute = element.dataset.visibilityAttribute;\n if (visibilityAttribute != null) {\n const attributeName = `data-${visibilityAttribute}`;\n element.toggleAttribute(attributeName, show);\n }\n element.dispatchEvent(new CustomEvent('hotspot-visibility', {\n detail: {\n visible: show,\n },\n }));\n });\n this.initialized = true;\n }\n}\n//# sourceMappingURL=Hotspot.js.map","/**\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders)\n * - see http://www.cake23.de/traveling-wavefronts-lit-up.html\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n */\n\nconst HorizontalBlurShader = {\n\n\tname: 'HorizontalBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'h': { value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float h;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { HorizontalBlurShader };\n","/**\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders)\n * - see http://www.cake23.de/traveling-wavefronts-lit-up.html\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n */\n\nconst VerticalBlurShader = {\n\n\tname: 'VerticalBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'v': { value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float v;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { VerticalBlurShader };\n","const _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID]{@link https://en.wikipedia.org/wiki/Universally_unique_identifier}\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `` to range ``\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp]{@link http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/}.\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep]{@link http://en.wikipedia.org/wiki/Smoothstep} for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep]{@link https://en.wikipedia.org/wiki/Smoothstep#Variations}\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles]{@link https://en.wikipedia.org/wiki/Euler_angles}\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, - 1.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n\tnormalize,\n\tdenormalize,\n\tMathUtils\n};\n","/* @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { BackSide, DoubleSide, Box3, Mesh, MeshBasicMaterial, MeshDepthMaterial, Object3D, OrthographicCamera, PlaneGeometry, RGBAFormat, ShaderMaterial, Vector3, WebGLRenderTarget } from 'three';\nimport { HorizontalBlurShader } from 'three/examples/jsm/shaders/HorizontalBlurShader.js';\nimport { VerticalBlurShader } from 'three/examples/jsm/shaders/VerticalBlurShader.js';\nimport { lerp } from 'three/src/math/MathUtils.js';\n// The softness [0, 1] of the shadow is mapped to a resolution between\n// 2^LOG_MAX_RESOLUTION and 2^LOG_MIN_RESOLUTION.\nconst LOG_MAX_RESOLUTION = 9;\nconst LOG_MIN_RESOLUTION = 6;\n// Animated models are not in general contained in their bounding box, as this\n// is calculated only for their resting pose. We create a cubic shadow volume\n// for animated models sized to their largest bounding box dimension multiplied\n// by this scale factor.\nconst ANIMATION_SCALING = 2;\n// Since hard shadows are not lightened by blurring and depth, set a lower\n// default intensity to make them more perceptually similar to the intensity of\n// the soft shadows.\nconst DEFAULT_HARD_INTENSITY = 0.3;\n/**\n * The Shadow class creates a shadow that fits a given scene and follows a\n * target. This shadow will follow the scene without any updates needed so long\n * as the shadow and scene are both parented to the same object (call it the\n * scene) and this scene is passed as the target parameter to the shadow's\n * constructor. We also must constrain the scene to motion within the horizontal\n * plane and call the setRotation() method whenever the scene's Y-axis rotation\n * changes. For motion outside of the horizontal plane, this.needsUpdate must be\n * set to true.\n *\n * The softness of the shadow is controlled by changing its resolution, making\n * softer shadows faster, but less precise.\n */\nexport class Shadow extends Object3D {\n constructor(scene, softness, side) {\n super();\n this.camera = new OrthographicCamera();\n // private cameraHelper = new CameraHelper(this.camera);\n this.renderTarget = null;\n this.renderTargetBlur = null;\n this.depthMaterial = new MeshDepthMaterial();\n this.horizontalBlurMaterial = new ShaderMaterial(HorizontalBlurShader);\n this.verticalBlurMaterial = new ShaderMaterial(VerticalBlurShader);\n this.intensity = 0;\n this.softness = 1;\n this.boundingBox = new Box3;\n this.size = new Vector3;\n this.maxDimension = 0;\n this.isAnimated = false;\n this.needsUpdate = false;\n const { camera } = this;\n camera.rotation.x = Math.PI / 2;\n camera.left = -0.5;\n camera.right = 0.5;\n camera.bottom = -0.5;\n camera.top = 0.5;\n this.add(camera);\n // this.add(this.cameraHelper);\n // this.cameraHelper.updateMatrixWorld = function() {\n // this.matrixWorld = this.camera.matrixWorld;\n // };\n const plane = new PlaneGeometry();\n const shadowMaterial = new MeshBasicMaterial({\n // color: new Color(1, 0, 0),\n opacity: 1,\n transparent: true,\n side: BackSide,\n });\n this.floor = new Mesh(plane, shadowMaterial);\n this.floor.userData.noHit = true;\n camera.add(this.floor);\n // the plane onto which to blur the texture\n this.blurPlane = new Mesh(plane);\n this.blurPlane.visible = false;\n camera.add(this.blurPlane);\n scene.target.add(this);\n // like MeshDepthMaterial, but goes from black to transparent\n this.depthMaterial.onBeforeCompile = function (shader) {\n shader.fragmentShader = shader.fragmentShader.replace('gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );', 'gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * opacity );');\n };\n // Render both sides, back sides face the light source and\n // front sides supply depth information for soft shadows\n this.depthMaterial.side = DoubleSide;\n this.horizontalBlurMaterial.depthTest = false;\n this.verticalBlurMaterial.depthTest = false;\n this.setScene(scene, softness, side);\n }\n /**\n * Update the shadow's size and position for a new scene. Softness is also\n * needed, as this controls the shadow's resolution.\n */\n setScene(scene, softness, side) {\n const { boundingBox, size, rotation, position } = this;\n this.isAnimated = scene.animationNames.length > 0;\n this.boundingBox.copy(scene.boundingBox);\n this.size.copy(scene.size);\n this.maxDimension = Math.max(size.x, size.y, size.z) *\n (this.isAnimated ? ANIMATION_SCALING : 1);\n this.boundingBox.getCenter(position);\n if (side === 'back') {\n const { min, max } = boundingBox;\n [min.y, min.z] = [min.z, min.y];\n [max.y, max.z] = [max.z, max.y];\n [size.y, size.z] = [size.z, size.y];\n rotation.x = Math.PI / 2;\n rotation.y = Math.PI;\n }\n else {\n rotation.x = 0;\n rotation.y = 0;\n }\n if (this.isAnimated) {\n const minY = boundingBox.min.y;\n const maxY = boundingBox.max.y;\n size.y = this.maxDimension;\n boundingBox.expandByVector(size.subScalar(this.maxDimension).multiplyScalar(-0.5));\n boundingBox.min.y = minY;\n boundingBox.max.y = maxY;\n size.set(this.maxDimension, maxY - minY, this.maxDimension);\n }\n if (side === 'bottom') {\n position.y = boundingBox.min.y;\n }\n else {\n position.z = boundingBox.min.y;\n }\n this.setSoftness(softness);\n }\n /**\n * Update the shadow's resolution based on softness (between 0 and 1). Should\n * not be called frequently, as this results in reallocation.\n */\n setSoftness(softness) {\n this.softness = softness;\n const { size, camera } = this;\n const scaleY = (this.isAnimated ? ANIMATION_SCALING : 1);\n const resolution = scaleY *\n Math.pow(2, LOG_MAX_RESOLUTION -\n softness * (LOG_MAX_RESOLUTION - LOG_MIN_RESOLUTION));\n this.setMapSize(resolution);\n const softFar = size.y / 2;\n const hardFar = size.y * scaleY;\n camera.near = 0;\n camera.far = lerp(hardFar, softFar, softness);\n // we have co-opted opacity to scale the depth to clip\n this.depthMaterial.opacity = 1.0 / softness;\n camera.updateProjectionMatrix();\n // this.cameraHelper.update();\n this.setIntensity(this.intensity);\n this.setOffset(0);\n }\n /**\n * Lower-level version of the above function.\n */\n setMapSize(maxMapSize) {\n const { size } = this;\n if (this.isAnimated) {\n maxMapSize *= ANIMATION_SCALING;\n }\n const baseWidth = Math.floor(size.x > size.z ? maxMapSize : maxMapSize * size.x / size.z);\n const baseHeight = Math.floor(size.x > size.z ? maxMapSize * size.z / size.x : maxMapSize);\n // width of blur filter in pixels (not adjustable)\n const TAP_WIDTH = 10;\n const width = TAP_WIDTH + baseWidth;\n const height = TAP_WIDTH + baseHeight;\n if (this.renderTarget != null &&\n (this.renderTarget.width !== width ||\n this.renderTarget.height !== height)) {\n this.renderTarget.dispose();\n this.renderTarget = null;\n this.renderTargetBlur.dispose();\n this.renderTargetBlur = null;\n }\n if (this.renderTarget == null) {\n const params = { format: RGBAFormat };\n this.renderTarget = new WebGLRenderTarget(width, height, params);\n this.renderTargetBlur = new WebGLRenderTarget(width, height, params);\n this.floor.material.map =\n this.renderTarget.texture;\n }\n // These pads account for the softening radius around the shadow.\n this.camera.scale.set(size.x * (1 + TAP_WIDTH / baseWidth), size.z * (1 + TAP_WIDTH / baseHeight), 1);\n this.needsUpdate = true;\n }\n /**\n * Set the shadow's intensity (0 to 1), which is just its opacity. Turns off\n * shadow rendering if zero.\n */\n setIntensity(intensity) {\n this.intensity = intensity;\n if (intensity > 0) {\n this.visible = true;\n this.floor.visible = true;\n this.floor.material.opacity = intensity *\n lerp(DEFAULT_HARD_INTENSITY, 1, this.softness * this.softness);\n }\n else {\n this.visible = false;\n this.floor.visible = false;\n }\n }\n getIntensity() {\n return this.intensity;\n }\n /**\n * An offset can be specified to move the\n * shadow vertically relative to the bottom of the scene. Positive is up, so\n * values are generally negative. A small offset keeps our shadow from\n * z-fighting with any baked-in shadow plane.\n */\n setOffset(offset) {\n this.floor.position.z = -offset + this.gap();\n }\n gap() {\n return 0.001 * this.maxDimension;\n }\n render(renderer, scene) {\n // this.cameraHelper.visible = false;\n // force the depthMaterial to everything\n scene.overrideMaterial = this.depthMaterial;\n // set renderer clear alpha\n const initialClearAlpha = renderer.getClearAlpha();\n renderer.setClearAlpha(0);\n this.floor.visible = false;\n // disable XR for offscreen rendering\n const xrEnabled = renderer.xr.enabled;\n renderer.xr.enabled = false;\n // render to the render target to get the depths\n const oldRenderTarget = renderer.getRenderTarget();\n renderer.setRenderTarget(this.renderTarget);\n renderer.render(scene, this.camera);\n // and reset the override material\n scene.overrideMaterial = null;\n this.floor.visible = true;\n this.blurShadow(renderer);\n // reset and render the normal scene\n renderer.xr.enabled = xrEnabled;\n renderer.setRenderTarget(oldRenderTarget);\n renderer.setClearAlpha(initialClearAlpha);\n // this.cameraHelper.visible = true;\n }\n blurShadow(renderer) {\n const { camera, horizontalBlurMaterial, verticalBlurMaterial, renderTarget, renderTargetBlur, blurPlane } = this;\n blurPlane.visible = true;\n // blur horizontally and draw in the renderTargetBlur\n blurPlane.material = horizontalBlurMaterial;\n horizontalBlurMaterial.uniforms.h.value = 1 / this.renderTarget.width;\n horizontalBlurMaterial.uniforms.tDiffuse.value = this.renderTarget.texture;\n renderer.setRenderTarget(renderTargetBlur);\n renderer.render(blurPlane, camera);\n // blur vertically and draw in the main renderTarget\n blurPlane.material = verticalBlurMaterial;\n verticalBlurMaterial.uniforms.v.value = 1 / this.renderTarget.height;\n verticalBlurMaterial.uniforms.tDiffuse.value =\n this.renderTargetBlur.texture;\n renderer.setRenderTarget(renderTarget);\n renderer.render(blurPlane, camera);\n blurPlane.visible = false;\n }\n dispose() {\n if (this.renderTarget != null) {\n this.renderTarget.dispose();\n }\n if (this.renderTargetBlur != null) {\n this.renderTargetBlur.dispose();\n }\n this.depthMaterial.dispose();\n this.horizontalBlurMaterial.dispose();\n this.verticalBlurMaterial.dispose();\n this.floor.material.dispose();\n this.floor.geometry.dispose();\n this.blurPlane.geometry.dispose();\n this.removeFromParent();\n }\n}\n//# sourceMappingURL=Shadow.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { AnimationMixer, Box3, Euler, LoopOnce, LoopPingPong, LoopRepeat, Matrix3, NeutralToneMapping, Object3D, PerspectiveCamera, Raycaster, Scene, Sphere, Triangle, Vector2, Vector3 } from 'three';\nimport { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\nimport { reduceVertices } from 'three/examples/jsm/utils/SceneUtils.js';\nimport { $currentGLTF, $model, $originalGltfJson } from '../features/scene-graph.js';\nimport { $nodeFromIndex, $nodeFromPoint } from '../features/scene-graph/model.js';\nimport { $renderer, $scene } from '../model-viewer-base.js';\nimport { normalizeUnit } from '../styles/conversions.js';\nimport { parseExpressions } from '../styles/parsers.js';\nimport { Damper, SETTLING_TIME } from './Damper.js';\nimport { GroundedSkybox } from './GroundedSkybox.js';\nimport { Hotspot } from './Hotspot.js';\nimport { Shadow } from './Shadow.js';\nexport const GROUNDED_SKYBOX_SIZE = 10;\nconst MIN_SHADOW_RATIO = 100;\nexport const IlluminationRole = {\n Primary: 'primary',\n Secondary: 'secondary'\n};\nconst view = new Vector3();\nconst target = new Vector3();\nconst normalWorld = new Vector3();\nconst raycaster = new Raycaster();\nconst vector3 = new Vector3();\nconst ndc = new Vector2();\n/**\n * A THREE.Scene object that takes a Model and CanvasHTMLElement and\n * constructs a framed scene based off of the canvas dimensions.\n * Provides lights and cameras to be used in a renderer.\n */\nexport class ModelScene extends Scene {\n constructor({ canvas, element, width, height }) {\n super();\n this.annotationRenderer = new CSS2DRenderer();\n this.effectRenderer = null;\n this.schemaElement = document.createElement('script');\n this.width = 1;\n this.height = 1;\n this.aspect = 1;\n this.scaleStep = 0;\n this.renderCount = 0;\n this.externalRenderer = null;\n this.appendedAnimations = [];\n this.markedAnimations = [];\n // These default camera values are never used, as they are reset once the\n // model is loaded and framing is computed.\n this.camera = new PerspectiveCamera(45, 1, 0.1, 100);\n this.xrCamera = null;\n this.url = null;\n this.pivot = new Object3D();\n this.target = new Object3D();\n this.animationNames = [];\n this.boundingBox = new Box3();\n this.boundingSphere = new Sphere();\n this.size = new Vector3();\n this.idealAspect = 0;\n this.framedFoVDeg = 0;\n this.shadow = null;\n this.shadowIntensity = 0;\n this.shadowSoftness = 1;\n this.bakedShadows = new Set();\n this.exposure = 1;\n this.toneMapping = NeutralToneMapping;\n this.canScale = true;\n this.isDirty = false;\n this.goalTarget = new Vector3();\n this.targetDamperX = new Damper();\n this.targetDamperY = new Damper();\n this.targetDamperZ = new Damper();\n this._currentGLTF = null;\n this._model = null;\n this.cancelPendingSourceChange = null;\n this.animationsByName = new Map();\n this.currentAnimationAction = null;\n this.groundedSkybox = new GroundedSkybox();\n this.name = 'ModelScene';\n this.element = element;\n this.canvas = canvas;\n // These default camera values are never used, as they are reset once the\n // model is loaded and framing is computed.\n this.camera = new PerspectiveCamera(45, 1, 0.1, 100);\n this.camera.name = 'MainCamera';\n this.add(this.pivot);\n this.pivot.name = 'Pivot';\n this.pivot.add(this.target);\n this.setSize(width, height);\n this.target.name = 'Target';\n this.mixer = new AnimationMixer(this.target);\n const { domElement } = this.annotationRenderer;\n const { style } = domElement;\n style.display = 'none';\n style.pointerEvents = 'none';\n style.position = 'absolute';\n style.top = '0';\n this.element.shadowRoot.querySelector('.default').appendChild(domElement);\n this.schemaElement.setAttribute('type', 'application/ld+json');\n }\n /**\n * Function to create the context lazily, as when there is only one\n * element, the renderer's 3D context can be displayed\n * directly. This extra context is necessary to copy the renderings into when\n * there are more than one.\n */\n get context() {\n return this.canvas.getContext('2d');\n }\n getCamera() {\n return this.xrCamera != null ? this.xrCamera : this.camera;\n }\n queueRender() {\n this.isDirty = true;\n }\n shouldRender() {\n return this.isDirty;\n }\n hasRendered() {\n this.isDirty = false;\n }\n forceRescale() {\n this.scaleStep = -1;\n this.queueRender();\n }\n /**\n * Pass in a THREE.Object3D to be controlled\n * by this model.\n */\n async setObject(model) {\n this.reset();\n this._model = model;\n this.target.add(model);\n await this.setupScene();\n }\n /**\n * Sets the model via URL.\n */\n async setSource(url, progressCallback = () => { }) {\n if (!url || url === this.url) {\n progressCallback(1);\n return;\n }\n this.reset();\n this.url = url;\n if (this.externalRenderer != null) {\n const framingInfo = await this.externalRenderer.load(progressCallback);\n this.boundingSphere.radius = framingInfo.framedRadius;\n this.idealAspect = framingInfo.fieldOfViewAspect;\n return;\n }\n // If we have pending work due to a previous source change in progress,\n // cancel it so that we do not incur a race condition:\n if (this.cancelPendingSourceChange != null) {\n this.cancelPendingSourceChange();\n this.cancelPendingSourceChange = null;\n }\n let gltf;\n try {\n gltf = await new Promise(async (resolve, reject) => {\n this.cancelPendingSourceChange = () => reject();\n try {\n const result = await this.element[$renderer].loader.load(url, this.element, progressCallback);\n resolve(result);\n }\n catch (error) {\n reject(error);\n }\n });\n }\n catch (error) {\n if (error == null) {\n // Loading was cancelled, so silently return\n return;\n }\n throw error;\n }\n this.cancelPendingSourceChange = null;\n this.reset();\n this.url = url;\n this._currentGLTF = gltf;\n if (gltf != null) {\n this._model = gltf.scene;\n this.target.add(gltf.scene);\n }\n const { animations } = gltf;\n const animationsByName = new Map();\n const animationNames = [];\n for (const animation of animations) {\n animationsByName.set(animation.name, animation);\n animationNames.push(animation.name);\n }\n this.animations = animations;\n this.animationsByName = animationsByName;\n this.animationNames = animationNames;\n await this.setupScene();\n }\n async setupScene() {\n this.applyTransform();\n this.updateBoundingBox();\n await this.updateFraming();\n this.updateShadow();\n this.setShadowIntensity(this.shadowIntensity);\n this.setGroundedSkybox();\n }\n reset() {\n this.url = null;\n this.renderCount = 0;\n this.queueRender();\n if (this.shadow != null) {\n this.shadow.setIntensity(0);\n }\n this.bakedShadows.clear();\n const { _model } = this;\n if (_model != null) {\n _model.removeFromParent();\n this._model = null;\n }\n const gltf = this._currentGLTF;\n if (gltf != null) {\n gltf.dispose();\n this._currentGLTF = null;\n }\n if (this.currentAnimationAction != null) {\n this.currentAnimationAction.stop();\n this.currentAnimationAction = null;\n }\n this.mixer.stopAllAction();\n this.mixer.uncacheRoot(this);\n }\n dispose() {\n this.reset();\n if (this.shadow != null) {\n this.shadow.dispose();\n this.shadow = null;\n }\n this.element[$currentGLTF] = null;\n this.element[$originalGltfJson] = null;\n this.element[$model] = null;\n }\n get currentGLTF() {\n return this._currentGLTF;\n }\n /**\n * Updates the ModelScene for a new container size in CSS pixels.\n */\n setSize(width, height) {\n if (this.width === width && this.height === height) {\n return;\n }\n this.width = Math.max(width, 1);\n this.height = Math.max(height, 1);\n this.annotationRenderer.setSize(width, height);\n this.aspect = this.width / this.height;\n if (this.externalRenderer != null) {\n const dpr = window.devicePixelRatio;\n this.externalRenderer.resize(width * dpr, height * dpr);\n }\n this.queueRender();\n }\n markBakedShadow(mesh) {\n mesh.userData.noHit = true;\n this.bakedShadows.add(mesh);\n }\n unmarkBakedShadow(mesh) {\n mesh.userData.noHit = false;\n mesh.visible = true;\n this.bakedShadows.delete(mesh);\n this.boundingBox.expandByObject(mesh);\n }\n findBakedShadows(group) {\n const boundingBox = new Box3();\n group.traverse((object) => {\n const mesh = object;\n if (!mesh.material) {\n return;\n }\n const material = mesh.material;\n if (!material.transparent) {\n return;\n }\n boundingBox.setFromObject(mesh);\n const size = boundingBox.getSize(vector3);\n const minDim = Math.min(size.x, size.y, size.z);\n const maxDim = Math.max(size.x, size.y, size.z);\n if (maxDim < MIN_SHADOW_RATIO * minDim) {\n return;\n }\n this.markBakedShadow(mesh);\n });\n }\n checkBakedShadows() {\n const { min, max } = this.boundingBox;\n const shadowBox = new Box3();\n this.boundingBox.getSize(this.size);\n for (const mesh of this.bakedShadows) {\n shadowBox.setFromObject(mesh);\n if (shadowBox.min.y < min.y + this.size.y / MIN_SHADOW_RATIO &&\n shadowBox.min.x <= min.x && shadowBox.max.x >= max.x &&\n shadowBox.min.z <= min.z && shadowBox.max.z >= max.z) {\n // floor shadow\n continue;\n }\n if (shadowBox.min.z < min.z + this.size.z / MIN_SHADOW_RATIO &&\n shadowBox.min.x <= min.x && shadowBox.max.x >= max.x &&\n shadowBox.min.y <= min.y && shadowBox.max.y >= max.y) {\n // wall shadow\n continue;\n }\n this.unmarkBakedShadow(mesh);\n }\n }\n applyTransform() {\n const { model } = this;\n if (model == null) {\n return;\n }\n const orientation = parseExpressions(this.element.orientation)[0]\n .terms;\n const roll = normalizeUnit(orientation[0]).number;\n const pitch = normalizeUnit(orientation[1]).number;\n const yaw = normalizeUnit(orientation[2]).number;\n model.quaternion.setFromEuler(new Euler(pitch, yaw, roll, 'YXZ'));\n const scale = parseExpressions(this.element.scale)[0]\n .terms;\n model.scale.set(scale[0].number, scale[1].number, scale[2].number);\n }\n updateBoundingBox() {\n const { model } = this;\n if (model == null) {\n return;\n }\n this.target.remove(model);\n this.findBakedShadows(model);\n const bound = (box, vertex) => {\n return box.expandByPoint(vertex);\n };\n this.setBakedShadowVisibility(false);\n this.boundingBox = reduceVertices(model, bound, new Box3());\n // If there's nothing but the baked shadow, then it's not a baked shadow.\n if (this.boundingBox.isEmpty()) {\n this.setBakedShadowVisibility(true);\n this.bakedShadows.forEach((mesh) => this.unmarkBakedShadow(mesh));\n this.boundingBox = reduceVertices(model, bound, new Box3());\n }\n this.checkBakedShadows();\n this.setBakedShadowVisibility();\n this.boundingBox.getSize(this.size);\n this.target.add(model);\n }\n /**\n * Calculates the boundingSphere and idealAspect that allows the 3D\n * object to be framed tightly in a 2D window of any aspect ratio without\n * clipping at any camera orbit. The camera's center target point can be\n * optionally specified. If no center is specified, it defaults to the center\n * of the bounding box, which means asymmetric models will tend to be tight on\n * one side instead of both. Proper choice of center can correct this.\n */\n async updateFraming() {\n const { model } = this;\n if (model == null) {\n return;\n }\n this.target.remove(model);\n this.setBakedShadowVisibility(false);\n const { center } = this.boundingSphere;\n this.element.requestUpdate('cameraTarget');\n await this.element.updateComplete;\n center.copy(this.getTarget());\n const radiusSquared = (value, vertex) => {\n return Math.max(value, center.distanceToSquared(vertex));\n };\n this.boundingSphere.radius =\n Math.sqrt(reduceVertices(model, radiusSquared, 0));\n const horizontalTanFov = (value, vertex) => {\n vertex.sub(center);\n const radiusXZ = Math.sqrt(vertex.x * vertex.x + vertex.z * vertex.z);\n return Math.max(value, radiusXZ / (this.idealCameraDistance() - Math.abs(vertex.y)));\n };\n this.idealAspect = reduceVertices(model, horizontalTanFov, 0) /\n Math.tan((this.framedFoVDeg / 2) * Math.PI / 180);\n this.setBakedShadowVisibility();\n this.target.add(model);\n }\n setBakedShadowVisibility(visible = this.shadowIntensity <= 0) {\n for (const shadow of this.bakedShadows) {\n shadow.visible = visible;\n }\n }\n idealCameraDistance() {\n const halfFovRad = (this.framedFoVDeg / 2) * Math.PI / 180;\n return this.boundingSphere.radius / Math.sin(halfFovRad);\n }\n /**\n * Set's the framedFieldOfView based on the aspect ratio of the window in\n * order to keep the model fully visible at any camera orientation.\n */\n adjustedFoV(fovDeg) {\n const vertical = Math.tan((fovDeg / 2) * Math.PI / 180) *\n Math.max(1, this.idealAspect / this.aspect);\n return 2 * Math.atan(vertical) * 180 / Math.PI;\n }\n getNDC(clientX, clientY) {\n if (this.xrCamera != null) {\n ndc.set(clientX / window.screen.width, clientY / window.screen.height);\n }\n else {\n const rect = this.element.getBoundingClientRect();\n ndc.set((clientX - rect.x) / this.width, (clientY - rect.y) / this.height);\n }\n ndc.multiplyScalar(2).subScalar(1);\n ndc.y *= -1;\n return ndc;\n }\n /**\n * Returns the size of the corresponding canvas element.\n */\n getSize() {\n return { width: this.width, height: this.height };\n }\n setEnvironmentAndSkybox(environment, skybox) {\n if (this.element[$renderer].arRenderer.presentedScene === this) {\n return;\n }\n this.environment = environment;\n this.setBackground(skybox);\n this.queueRender();\n }\n setBackground(skybox) {\n this.groundedSkybox.map = skybox;\n if (this.groundedSkybox.isUsable()) {\n this.target.add(this.groundedSkybox);\n this.background = null;\n }\n else {\n this.target.remove(this.groundedSkybox);\n this.background = skybox;\n }\n }\n farRadius() {\n return this.boundingSphere.radius *\n (this.groundedSkybox.parent != null ? GROUNDED_SKYBOX_SIZE : 1);\n }\n setGroundedSkybox() {\n const heightNode = parseExpressions(this.element.skyboxHeight)[0].terms[0];\n const height = normalizeUnit(heightNode).number;\n const radius = GROUNDED_SKYBOX_SIZE * this.boundingSphere.radius;\n this.groundedSkybox.updateGeometry(height, radius);\n this.groundedSkybox.position.y =\n height - (this.shadow ? 2 * this.shadow.gap() : 0);\n this.setBackground(this.groundedSkybox.map);\n }\n /**\n * Sets the point in model coordinates the model should orbit/pivot around.\n */\n setTarget(modelX, modelY, modelZ) {\n this.goalTarget.set(-modelX, -modelY, -modelZ);\n }\n /**\n * Set the decay time of, affects the speed of target transitions.\n */\n setTargetDamperDecayTime(decayMilliseconds) {\n this.targetDamperX.setDecayTime(decayMilliseconds);\n this.targetDamperY.setDecayTime(decayMilliseconds);\n this.targetDamperZ.setDecayTime(decayMilliseconds);\n }\n /**\n * Gets the point in model coordinates the model should orbit/pivot around.\n */\n getTarget() {\n return this.goalTarget.clone().multiplyScalar(-1);\n }\n /**\n * Gets the current target point, which may not equal the goal returned by\n * getTarget() due to finite input decay smoothing.\n */\n getDynamicTarget() {\n return this.target.position.clone().multiplyScalar(-1);\n }\n /**\n * Shifts the model to the target point immediately instead of easing in.\n */\n jumpToGoal() {\n this.updateTarget(SETTLING_TIME);\n }\n /**\n * This should be called every frame with the frame delta to cause the target\n * to transition to its set point.\n */\n updateTarget(delta) {\n const goal = this.goalTarget;\n const target = this.target.position;\n if (!goal.equals(target)) {\n const normalization = this.boundingSphere.radius / 10;\n let { x, y, z } = target;\n x = this.targetDamperX.update(x, goal.x, delta, normalization);\n y = this.targetDamperY.update(y, goal.y, delta, normalization);\n z = this.targetDamperZ.update(z, goal.z, delta, normalization);\n this.groundedSkybox.position.x = -x;\n this.groundedSkybox.position.z = -z;\n this.target.position.set(x, y, z);\n this.target.updateMatrixWorld();\n this.queueRender();\n return true;\n }\n else {\n return false;\n }\n }\n /**\n * Yaw the +z (front) of the model toward the indicated world coordinates.\n */\n pointTowards(worldX, worldZ) {\n const { x, z } = this.position;\n this.yaw = Math.atan2(worldX - x, worldZ - z);\n }\n get model() {\n return this._model;\n }\n /**\n * Yaw is the scene's orientation about the y-axis, around the rotation\n * center.\n */\n set yaw(radiansY) {\n this.pivot.rotation.y = radiansY;\n this.groundedSkybox.rotation.y = -radiansY;\n this.queueRender();\n }\n get yaw() {\n return this.pivot.rotation.y;\n }\n set animationTime(value) {\n this.mixer.setTime(value);\n this.queueShadowRender();\n }\n get animationTime() {\n if (this.currentAnimationAction != null) {\n const loopCount = Math.max(this.currentAnimationAction._loopCount, 0);\n if (this.currentAnimationAction.loop === LoopPingPong &&\n (loopCount & 1) === 1) {\n return this.duration - this.currentAnimationAction.time;\n }\n else {\n return this.currentAnimationAction.time;\n }\n }\n return 0;\n }\n set animationTimeScale(value) {\n this.mixer.timeScale = value;\n }\n get animationTimeScale() {\n return this.mixer.timeScale;\n }\n get duration() {\n if (this.currentAnimationAction != null &&\n this.currentAnimationAction.getClip()) {\n return this.currentAnimationAction.getClip().duration;\n }\n return 0;\n }\n get hasActiveAnimation() {\n return this.currentAnimationAction != null;\n }\n /**\n * Plays an animation if there are any associated with the current model.\n * Accepts an optional string name of an animation to play. If no name is\n * provided, or if no animation is found by the given name, always falls back\n * to playing the first animation.\n */\n playAnimation(name = null, crossfadeTime = 0, loopMode = LoopRepeat, repetitionCount = Infinity) {\n if (this._currentGLTF == null) {\n return;\n }\n const { animations } = this;\n if (animations == null || animations.length === 0) {\n return;\n }\n let animationClip = null;\n if (name != null) {\n animationClip = this.animationsByName.get(name);\n if (animationClip == null) {\n const parsedAnimationIndex = parseInt(name);\n if (!isNaN(parsedAnimationIndex) && parsedAnimationIndex >= 0 &&\n parsedAnimationIndex < animations.length) {\n animationClip = animations[parsedAnimationIndex];\n }\n }\n }\n if (animationClip == null) {\n animationClip = animations[0];\n }\n try {\n const { currentAnimationAction: lastAnimationAction } = this;\n const action = this.mixer.clipAction(animationClip, this);\n // Reset animationAction timeScale\n if (action.timeScale != this.element.timeScale) {\n action.timeScale = this.element.timeScale;\n }\n this.currentAnimationAction = action;\n if (this.element.paused) {\n this.mixer.stopAllAction();\n }\n else {\n action.paused = false;\n if (lastAnimationAction != null && action !== lastAnimationAction) {\n action.crossFadeFrom(lastAnimationAction, crossfadeTime, false);\n }\n else if (this.animationTimeScale > 0 &&\n this.animationTime == this.duration) {\n // This is a workaround for what I believe is a three.js bug.\n this.animationTime = 0;\n }\n }\n action.setLoop(loopMode, repetitionCount);\n action.enabled = true;\n action.clampWhenFinished = true;\n action.play();\n }\n catch (error) {\n console.error(error);\n }\n }\n appendAnimation(name = '', loopMode = LoopRepeat, repetitionCount = Infinity, weight = 1, timeScale = 1, fade = false, warp = false, relativeWarp = true, time = null, needsToStop = false) {\n if (this._currentGLTF == null || name === this.element.animationName) {\n return;\n }\n const { animations } = this;\n if (animations == null || animations.length === 0) {\n return;\n }\n let animationClip = null;\n const defaultFade = 1.25;\n if (name) {\n animationClip = this.animationsByName.get(name);\n }\n if (animationClip == null) {\n return;\n }\n // validate function parameters\n if (typeof repetitionCount === 'string') {\n if (!isNaN(repetitionCount)) {\n repetitionCount = Math.max(parseInt(repetitionCount), 1);\n }\n else {\n repetitionCount = Infinity;\n console.warn('Invalid repetitionCount value, repetitionCount is set to Infinity');\n }\n }\n else if (typeof repetitionCount === 'number' && repetitionCount < 1) {\n repetitionCount = 1;\n }\n if (repetitionCount === 1 && loopMode !== LoopOnce) {\n loopMode = LoopOnce;\n }\n if (typeof weight === 'string') {\n if (!isNaN(weight)) {\n weight = parseFloat(weight);\n }\n else {\n weight = 1;\n console.warn('Invalid weight value, weight is set to 1');\n }\n }\n if (typeof timeScale === 'string') {\n if (!isNaN(timeScale)) {\n timeScale = parseFloat(timeScale);\n }\n else {\n timeScale = 1;\n console.warn('Invalid timeScale value, timeScale is set to 1');\n }\n }\n if (typeof fade === 'string') {\n // @ts-ignore: Unreachable code error\n if (fade.toLowerCase().trim() === 'true') {\n fade = true;\n // @ts-ignore: Unreachable code error\n }\n else if (fade.toLowerCase().trim() === 'false') {\n fade = false;\n }\n else if (!isNaN(fade)) {\n fade = parseFloat(fade);\n }\n else {\n fade = false;\n console.warn('Invalid fade value, fade is set to false');\n }\n }\n if (typeof warp === 'string') {\n // @ts-ignore: Unreachable code error\n if (warp.toLowerCase().trim() === 'true') {\n warp = true;\n // @ts-ignore: Unreachable code error\n }\n else if (warp.toLowerCase().trim() === 'false') {\n warp = false;\n }\n else if (!isNaN(warp)) {\n warp = parseFloat(warp);\n }\n else {\n warp = false;\n console.warn('Invalid warp value, warp is set to false');\n }\n }\n if (typeof time === 'string') {\n if (!isNaN(time)) {\n time = parseFloat(time);\n }\n }\n try {\n const action = this.mixer.existingAction(animationClip) ||\n this.mixer.clipAction(animationClip, this);\n const currentTimeScale = action.timeScale;\n if (needsToStop && this.appendedAnimations.includes(name)) {\n if (!this.markedAnimations.map(e => e.name).includes(name)) {\n this.markedAnimations.push({ name, loopMode, repetitionCount });\n }\n }\n if (typeof time === 'number') {\n action.time = Math.min(Math.max(time, 0), animationClip.duration);\n }\n if (typeof fade === 'boolean' && fade) {\n action.fadeIn(defaultFade);\n }\n else if (typeof fade === 'number') {\n action.fadeIn(Math.max(fade, 0));\n }\n else {\n if (weight >= 0) {\n action.weight = Math.min(Math.max(weight, 0), 1);\n }\n }\n if (typeof warp === 'boolean' && warp) {\n action.warp(relativeWarp ? currentTimeScale : 0, timeScale, defaultFade);\n }\n else if (typeof warp === 'number') {\n action.warp(relativeWarp ? currentTimeScale : 0, timeScale, Math.max(warp, 0));\n }\n else {\n action.timeScale = timeScale;\n }\n if (!action.isRunning()) {\n if (action.time == animationClip.duration) {\n action.stop();\n }\n action.setLoop(loopMode, repetitionCount);\n action.paused = false;\n action.enabled = true;\n action.clampWhenFinished = true;\n action.play();\n }\n if (!this.appendedAnimations.includes(name)) {\n this.element[$scene].appendedAnimations.push(name);\n }\n }\n catch (error) {\n console.error(error);\n }\n }\n detachAnimation(name = '', fade = true) {\n if (this._currentGLTF == null || name === this.element.animationName) {\n return;\n }\n const { animations } = this;\n if (animations == null || animations.length === 0) {\n return;\n }\n let animationClip = null;\n const defaultFade = 1.5;\n if (name) {\n animationClip = this.animationsByName.get(name);\n }\n if (animationClip == null) {\n return;\n }\n if (typeof fade === 'string') {\n // @ts-ignore: Unreachable code error\n if (fade.toLowerCase().trim() === 'true') {\n fade = true;\n // @ts-ignore: Unreachable code error\n }\n else if (fade.toLowerCase().trim() === 'false') {\n fade = false;\n }\n else if (!isNaN(fade)) {\n fade = parseFloat(fade);\n }\n else {\n fade = true;\n console.warn('Invalid fade value, fade is set to true');\n }\n }\n try {\n const action = this.mixer.existingAction(animationClip) ||\n this.mixer.clipAction(animationClip, this);\n if (typeof fade === 'boolean' && fade) {\n action.fadeOut(defaultFade);\n }\n else if (typeof fade === 'number') {\n action.fadeOut(Math.max(fade, 0));\n }\n else {\n action.stop();\n }\n const result = this.element[$scene].appendedAnimations.filter(i => i !== name);\n this.element[$scene].appendedAnimations = result;\n }\n catch (error) {\n console.error(error);\n }\n }\n updateAnimationLoop(name = '', loopMode = LoopRepeat, repetitionCount = Infinity) {\n if (this._currentGLTF == null || name === this.element.animationName) {\n return;\n }\n const { animations } = this;\n if (animations == null || animations.length === 0) {\n return;\n }\n let animationClip = null;\n if (name) {\n animationClip = this.animationsByName.get(name);\n }\n if (animationClip == null) {\n return;\n }\n try {\n const action = this.mixer.existingAction(animationClip) ||\n this.mixer.clipAction(animationClip, this);\n action.stop();\n action.setLoop(loopMode, repetitionCount);\n action.play();\n }\n catch (error) {\n console.error(error);\n }\n }\n stopAnimation() {\n this.currentAnimationAction = null;\n this.mixer.stopAllAction();\n }\n updateAnimation(step) {\n this.mixer.update(step);\n this.queueShadowRender();\n }\n subscribeMixerEvent(event, callback) {\n this.mixer.addEventListener(event, callback);\n }\n /**\n * Call if the object has been changed in such a way that the shadow's\n * shape has changed (not a rotation about the Y axis).\n */\n updateShadow() {\n const shadow = this.shadow;\n if (shadow != null) {\n const side = this.element.arPlacement === 'wall' ? 'back' :\n this.element.arPlacement === 'ceiling' ? 'top' : 'bottom';\n shadow.setScene(this, this.shadowSoftness, side);\n shadow.needsUpdate = true;\n }\n }\n renderShadow(renderer) {\n const shadow = this.shadow;\n if (shadow != null && shadow.needsUpdate == true) {\n shadow.render(renderer, this);\n shadow.needsUpdate = false;\n }\n }\n queueShadowRender() {\n if (this.shadow != null) {\n this.shadow.needsUpdate = true;\n }\n }\n /**\n * Sets the shadow's intensity, lazily creating the shadow as necessary.\n */\n setShadowIntensity(shadowIntensity) {\n this.shadowIntensity = shadowIntensity;\n if (this._currentGLTF == null) {\n return;\n }\n this.setBakedShadowVisibility();\n if (shadowIntensity <= 0 && this.shadow == null) {\n return;\n }\n if (this.shadow == null) {\n const side = this.element.arPlacement === 'wall' ? 'back' : 'bottom';\n this.shadow = new Shadow(this, this.shadowSoftness, side);\n }\n this.shadow.setIntensity(shadowIntensity);\n }\n /**\n * Sets the shadow's softness by mapping a [0, 1] softness parameter to\n * the shadow's resolution. This involves reallocation, so it should not\n * be changed frequently. Softer shadows are cheaper to render.\n */\n setShadowSoftness(softness) {\n this.shadowSoftness = softness;\n const shadow = this.shadow;\n if (shadow != null) {\n shadow.setSoftness(softness);\n }\n }\n /**\n * Shift the floor vertically from the bottom of the model's bounding box\n * by offset (should generally be negative).\n */\n setShadowOffset(offset) {\n const shadow = this.shadow;\n if (shadow != null) {\n shadow.setOffset(offset);\n }\n }\n getHit(object = this) {\n const hits = raycaster.intersectObject(object, true);\n return hits.find((hit) => hit.object.visible && !hit.object.userData.noHit);\n }\n hitFromController(controller, object = this) {\n raycaster.setFromXRController(controller);\n return this.getHit(object);\n }\n hitFromPoint(ndcPosition, object = this) {\n raycaster.setFromCamera(ndcPosition, this.getCamera());\n return this.getHit(object);\n }\n /**\n * This method returns the world position, model-space normal and texture\n * coordinate of the point on the mesh corresponding to the input pixel\n * coordinates given relative to the model-viewer element. If the mesh\n * is not hit, the result is null.\n */\n positionAndNormalFromPoint(ndcPosition, object = this) {\n var _a;\n const hit = this.hitFromPoint(ndcPosition, object);\n if (hit == null) {\n return null;\n }\n const position = hit.point;\n const normal = hit.face != null ?\n hit.face.normal.clone().applyNormalMatrix(new Matrix3().getNormalMatrix(hit.object.matrixWorld)) :\n raycaster.ray.direction.clone().multiplyScalar(-1);\n const uv = (_a = hit.uv) !== null && _a !== void 0 ? _a : null;\n return { position, normal, uv };\n }\n /**\n * This method returns a dynamic hotspot ID string of the point on the\n * mesh corresponding to the input pixel coordinates given relative to the\n * model-viewer element. The ID string can be used in the data-surface\n * attribute of the hotspot to make it follow this point on the surface\n * even as the model animates. If the mesh is not hit, the result is null.\n */\n surfaceFromPoint(ndcPosition, object = this) {\n const model = this.element.model;\n if (model == null) {\n return null;\n }\n const hit = this.hitFromPoint(ndcPosition, object);\n if (hit == null || hit.face == null) {\n return null;\n }\n const node = model[$nodeFromPoint](hit);\n const { meshes, primitives } = node.mesh.userData.associations;\n const va = new Vector3();\n const vb = new Vector3();\n const vc = new Vector3();\n const { a, b, c } = hit.face;\n const mesh = hit.object;\n mesh.getVertexPosition(a, va);\n mesh.getVertexPosition(b, vb);\n mesh.getVertexPosition(c, vc);\n const tri = new Triangle(va, vb, vc);\n const uvw = new Vector3();\n tri.getBarycoord(mesh.worldToLocal(hit.point), uvw);\n return `${meshes} ${primitives} ${a} ${b} ${c} ${uvw.x.toFixed(3)} ${uvw.y.toFixed(3)} ${uvw.z.toFixed(3)}`;\n }\n /**\n * The following methods are for operating on the set of Hotspot objects\n * attached to the scene. These come from DOM elements, provided to slots\n * by the Annotation Mixin.\n */\n addHotspot(hotspot) {\n this.target.add(hotspot);\n // This happens automatically in render(), but we do it early so that\n // the slots appear in the shadow DOM and the elements get attached,\n // allowing us to dispatch events on them.\n this.annotationRenderer.domElement.appendChild(hotspot.element);\n this.updateSurfaceHotspot(hotspot);\n }\n removeHotspot(hotspot) {\n this.target.remove(hotspot);\n }\n /**\n * Helper method to apply a function to all hotspots.\n */\n forHotspots(func) {\n const { children } = this.target;\n for (let i = 0, l = children.length; i < l; i++) {\n const hotspot = children[i];\n if (hotspot instanceof Hotspot) {\n func(hotspot);\n }\n }\n }\n /**\n * Lazy initializer for surface hotspots - will only run once.\n */\n updateSurfaceHotspot(hotspot) {\n if (hotspot.surface == null || this.element.model == null) {\n return;\n }\n const nodes = parseExpressions(hotspot.surface)[0].terms;\n if (nodes.length != 8) {\n console.warn(hotspot.surface + ' does not have exactly 8 numbers.');\n return;\n }\n const primitiveNode = this.element.model[$nodeFromIndex](nodes[0].number, nodes[1].number);\n if (primitiveNode == null) {\n console.warn(hotspot.surface +\n ' does not match a node/primitive in this glTF! Skipping this hotspot.');\n return;\n }\n const numVert = primitiveNode.mesh.geometry.attributes.position.count;\n const tri = new Vector3(nodes[2].number, nodes[3].number, nodes[4].number);\n if (tri.x >= numVert || tri.y >= numVert || tri.z >= numVert) {\n console.warn(hotspot.surface +\n ' vertex indices out of range in this glTF! Skipping this hotspot.');\n return;\n }\n const bary = new Vector3(nodes[5].number, nodes[6].number, nodes[7].number);\n hotspot.mesh = primitiveNode.mesh;\n hotspot.tri = tri;\n hotspot.bary = bary;\n hotspot.updateSurface();\n }\n /**\n * Update positions of surface hotspots to follow model animation.\n */\n animateSurfaceHotspots() {\n if (this.element.paused) {\n return;\n }\n this.forHotspots((hotspot) => {\n hotspot.updateSurface();\n });\n }\n /**\n * Update the CSS visibility of the hotspots based on whether their\n * normals point toward the camera.\n */\n updateHotspotsVisibility(viewerPosition) {\n this.forHotspots((hotspot) => {\n view.copy(viewerPosition);\n target.setFromMatrixPosition(hotspot.matrixWorld);\n view.sub(target);\n normalWorld.copy(hotspot.normal)\n .transformDirection(this.target.matrixWorld);\n if (view.dot(normalWorld) < 0) {\n hotspot.hide();\n }\n else {\n hotspot.show();\n }\n });\n }\n /**\n * Rotate all hotspots to an absolute orientation given by the input\n * number of radians. Zero returns them to upright.\n */\n orientHotspots(radians) {\n this.forHotspots((hotspot) => {\n hotspot.orient(radians);\n });\n }\n /**\n * Set the rendering visibility of all hotspots. This is used to hide them\n * during transitions and such.\n */\n setHotspotsVisibility(visible) {\n this.forHotspots((hotspot) => {\n hotspot.visible = visible;\n });\n }\n updateSchema(src) {\n var _a;\n const { schemaElement, element } = this;\n const { alt, poster, iosSrc } = element;\n if (src != null) {\n const encoding = [{\n '@type': 'MediaObject',\n contentUrl: src,\n encodingFormat: ((_a = src.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'gltf' ?\n 'model/gltf+json' :\n 'model/gltf-binary'\n }];\n if (iosSrc) {\n encoding.push({\n '@type': 'MediaObject',\n contentUrl: iosSrc,\n encodingFormat: 'model/vnd.usdz+zip'\n });\n }\n const structuredData = {\n '@context': 'http://schema.org/',\n '@type': '3DModel',\n image: poster !== null && poster !== void 0 ? poster : undefined,\n name: alt !== null && alt !== void 0 ? alt : undefined,\n encoding\n };\n schemaElement.textContent = JSON.stringify(structuredData);\n document.head.appendChild(schemaElement);\n }\n else if (schemaElement.parentElement != null) {\n schemaElement.parentElement.removeChild(schemaElement);\n }\n }\n}\n//# sourceMappingURL=ModelScene.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { clamp } from '../utilities.js';\n/**\n * ProgressTracker is an event emitter that helps to track the ongoing progress\n * of many simultaneous actions.\n *\n * ProgressTracker reports progress activity in the form of a progress event.\n * The event.detail.totalProgress value indicates the elapsed progress of all\n * activities being tracked by the ProgressTracker.\n *\n * The value of totalProgress is a number that progresses from 0 to 1. The\n * ProgressTracker allows for the lazy accumulation of tracked actions, so the\n * total progress represents an abstract, non-absolute progress towards the\n * completion of all currently tracked events.\n *\n * When all currently tracked activities are finished, the ProgressTracker\n * emits one final progress event and then resets the list of its currently\n * tracked activities. This means that from an observer's perspective,\n * ongoing activities will accumulate and collectively contribute to the notion\n * of total progress until all currently tracked ongoing activities have\n * completed.\n */\nexport class ProgressTracker extends EventTarget {\n constructor() {\n super(...arguments);\n this.ongoingActivities = new Set();\n this.totalProgress = 0;\n }\n /**\n * The total number of activities currently being tracked.\n */\n get ongoingActivityCount() {\n return this.ongoingActivities.size;\n }\n /**\n * Registers a new activity to be tracked by the progress tracker. The method\n * returns a special callback that should be invoked whenever new progress is\n * ready to be reported. The progress should be reported as a value between 0\n * and 1, where 0 would represent the beginning of the action and 1 would\n * represent its completion.\n *\n * There is no built-in notion of a time-out for ongoing activities, so once\n * an ongoing activity is begun, it is up to the consumer of this API to\n * update the progress until that activity is no longer ongoing.\n *\n * Progress is only allowed to move forward for any given activity. If a lower\n * progress is reported than the previously reported progress, it will be\n * ignored.\n */\n beginActivity(reason) {\n const activity = { progress: 0, completed: false };\n this.ongoingActivities.add(activity);\n if (this.ongoingActivityCount === 1) {\n // Announce the first progress event (which should always be 0 / 1\n // total progress):\n this.announceTotalProgress(activity, 0, reason);\n }\n return (progress) => {\n let nextProgress;\n nextProgress = Math.max(clamp(progress, 0, 1), activity.progress);\n if (nextProgress !== activity.progress) {\n this.announceTotalProgress(activity, nextProgress, reason);\n }\n return activity.progress;\n };\n }\n announceTotalProgress(updatedActivity, nextProgress, reason) {\n let progressLeft = 0;\n let completedActivities = 0;\n if (nextProgress == 1.0)\n updatedActivity.completed = true;\n for (const activity of this.ongoingActivities) {\n const { progress } = activity;\n progressLeft += 1.0 - progress;\n if (activity.completed) {\n completedActivities++;\n }\n }\n const lastProgress = updatedActivity.progress;\n updatedActivity.progress = nextProgress;\n // Advance the total progress by the fraction of total remaining progress\n // due to this activity.\n this.totalProgress += (nextProgress - lastProgress) *\n (1.0 - this.totalProgress) / progressLeft;\n const totalProgress = completedActivities === this.ongoingActivityCount ?\n 1.0 :\n this.totalProgress;\n this.dispatchEvent(new CustomEvent('progress', { detail: { totalProgress, reason } }));\n if (completedActivities === this.ongoingActivityCount) {\n this.totalProgress = 0.0;\n this.ongoingActivities.clear();\n }\n }\n}\n//# sourceMappingURL=progress-tracker.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;\nimport { ReactiveElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { HAS_INTERSECTION_OBSERVER, HAS_RESIZE_OBSERVER } from './constants.js';\nimport { $updateEnvironment } from './features/environment.js';\nimport { makeTemplate } from './template.js';\nimport { $evictionPolicy, CachingGLTFLoader } from './three-components/CachingGLTFLoader.js';\nimport { ModelScene } from './three-components/ModelScene.js';\nimport { Renderer } from './three-components/Renderer.js';\nimport { clamp, debounce } from './utilities.js';\nimport { ProgressTracker } from './utilities/progress-tracker.js';\nconst CLEAR_MODEL_TIMEOUT_MS = 10;\nconst FALLBACK_SIZE_UPDATE_THRESHOLD_MS = 50;\nconst ANNOUNCE_MODEL_VISIBILITY_DEBOUNCE_THRESHOLD = 0;\nconst UNSIZED_MEDIA_WIDTH = 300;\nconst UNSIZED_MEDIA_HEIGHT = 150;\nexport const blobCanvas = document.createElement('canvas');\nconst $fallbackResizeHandler = Symbol('fallbackResizeHandler');\nconst $defaultAriaLabel = Symbol('defaultAriaLabel');\nconst $resizeObserver = Symbol('resizeObserver');\nconst $clearModelTimeout = Symbol('clearModelTimeout');\nconst $onContextLost = Symbol('onContextLost');\nconst $loaded = Symbol('loaded');\nconst $status = Symbol('status');\nconst $onFocus = Symbol('onFocus');\nconst $onBlur = Symbol('onBlur');\nexport const $updateSize = Symbol('updateSize');\nexport const $intersectionObserver = Symbol('intersectionObserver');\nexport const $isElementInViewport = Symbol('isElementInViewport');\nexport const $announceModelVisibility = Symbol('announceModelVisibility');\nexport const $ariaLabel = Symbol('ariaLabel');\nexport const $altDefaulted = Symbol('altDefaulted');\nexport const $statusElement = Symbol('statusElement');\nexport const $updateStatus = Symbol('updateStatus');\nexport const $loadedTime = Symbol('loadedTime');\nexport const $updateSource = Symbol('updateSource');\nexport const $markLoaded = Symbol('markLoaded');\nexport const $container = Symbol('container');\nexport const $userInputElement = Symbol('input');\nexport const $canvas = Symbol('canvas');\nexport const $scene = Symbol('scene');\nexport const $needsRender = Symbol('needsRender');\nexport const $tick = Symbol('tick');\nexport const $onModelLoad = Symbol('onModelLoad');\nexport const $onResize = Symbol('onResize');\nexport const $renderer = Symbol('renderer');\nexport const $progressTracker = Symbol('progressTracker');\nexport const $getLoaded = Symbol('getLoaded');\nexport const $getModelIsVisible = Symbol('getModelIsVisible');\nexport const $shouldAttemptPreload = Symbol('shouldAttemptPreload');\nexport const toVector3D = (v) => {\n return {\n x: v.x,\n y: v.y,\n z: v.z,\n toString() {\n return `${this.x}m ${this.y}m ${this.z}m`;\n }\n };\n};\nexport const toVector2D = (v) => {\n return {\n u: v.x,\n v: v.y,\n toString() {\n return `${this.u} ${this.v}`;\n }\n };\n};\n/**\n * Definition for a basic element.\n */\nexport default class ModelViewerElementBase extends ReactiveElement {\n static get is() {\n return 'model-viewer';\n }\n /** @export */\n static set modelCacheSize(value) {\n CachingGLTFLoader[$evictionPolicy].evictionThreshold = value;\n }\n /** @export */\n static get modelCacheSize() {\n return CachingGLTFLoader[$evictionPolicy].evictionThreshold;\n }\n /** @export */\n static set minimumRenderScale(value) {\n if (value > 1) {\n console.warn(' minimumRenderScale has been clamped to a maximum value of 1.');\n }\n if (value <= 0) {\n console.warn(' minimumRenderScale has been clamped to a minimum value of 0.25.');\n }\n Renderer.singleton.minScale = value;\n }\n /** @export */\n static get minimumRenderScale() {\n return Renderer.singleton.minScale;\n }\n /** @export */\n get loaded() {\n return this[$getLoaded]();\n }\n get [(_a = $isElementInViewport, _b = $loaded, _c = $loadedTime, _d = $status, _e = $clearModelTimeout, _f = $fallbackResizeHandler, _g = $announceModelVisibility, _h = $resizeObserver, _j = $intersectionObserver, _k = $progressTracker, $renderer)]() {\n return Renderer.singleton;\n }\n /** @export */\n get modelIsVisible() {\n return this[$getModelIsVisible]();\n }\n /**\n * Creates a new ModelViewerElement.\n */\n constructor() {\n super();\n this.alt = null;\n this.src = null;\n this.withCredentials = false;\n /**\n * Generates a 3D model schema https://schema.org/3DModel associated with\n * the loaded src and inserts it into the header of the page for search\n * engines to crawl.\n */\n this.generateSchema = false;\n this[_a] = false;\n this[_b] = false;\n this[_c] = 0;\n this[_d] = '';\n this[_e] = null;\n this[_f] = debounce(() => {\n const boundingRect = this.getBoundingClientRect();\n this[$updateSize](boundingRect);\n }, FALLBACK_SIZE_UPDATE_THRESHOLD_MS);\n this[_g] = debounce((oldVisibility) => {\n const newVisibility = this.modelIsVisible;\n if (newVisibility !== oldVisibility) {\n this.dispatchEvent(new CustomEvent('model-visibility', { detail: { visible: newVisibility } }));\n }\n }, ANNOUNCE_MODEL_VISIBILITY_DEBOUNCE_THRESHOLD);\n this[_h] = null;\n this[_j] = null;\n this[_k] = new ProgressTracker();\n this[_l] = () => {\n this[$statusElement].textContent = this[$status];\n };\n this[_m] = () => {\n this[$statusElement].textContent = '';\n };\n this[_o] = (event) => {\n this.dispatchEvent(new CustomEvent('error', { detail: { type: 'webglcontextlost', sourceError: event.sourceEvent } }));\n };\n this.attachShadow({ mode: 'open' });\n const shadowRoot = this.shadowRoot;\n makeTemplate(shadowRoot);\n this[$container] = shadowRoot.querySelector('.container');\n this[$userInputElement] =\n shadowRoot.querySelector('.userInput');\n this[$canvas] = shadowRoot.querySelector('canvas');\n this[$statusElement] =\n shadowRoot.querySelector('#status');\n this[$defaultAriaLabel] =\n this[$userInputElement].getAttribute('aria-label');\n // Because of potential race conditions related to invoking the constructor\n // we only use the bounding rect to set the initial size if the element is\n // already connected to the document:\n let width, height;\n if (this.isConnected) {\n const rect = this.getBoundingClientRect();\n width = rect.width;\n height = rect.height;\n }\n else {\n width = UNSIZED_MEDIA_WIDTH;\n height = UNSIZED_MEDIA_HEIGHT;\n }\n // Create the underlying ModelScene.\n this[$scene] =\n new ModelScene({ canvas: this[$canvas], element: this, width, height });\n // Update initial size on microtask timing so that subclasses have a\n // chance to initialize\n Promise.resolve().then(() => {\n this[$updateSize](this.getBoundingClientRect());\n });\n if (HAS_RESIZE_OBSERVER) {\n // Set up a resize observer so we can scale our canvas\n // if our changes\n this[$resizeObserver] =\n new ResizeObserver((entries) => {\n // Don't resize anything if in AR mode; otherwise the canvas\n // scaling to fullscreen on entering AR will clobber the flat/2d\n // dimensions of the element.\n if (this[$renderer].isPresenting) {\n return;\n }\n for (let entry of entries) {\n if (entry.target === this) {\n this[$updateSize](entry.contentRect);\n }\n }\n });\n }\n if (HAS_INTERSECTION_OBSERVER) {\n this[$intersectionObserver] = new IntersectionObserver(entries => {\n for (let entry of entries) {\n if (entry.target === this) {\n const oldVisibility = this.modelIsVisible;\n this[$isElementInViewport] = entry.isIntersecting;\n this[$announceModelVisibility](oldVisibility);\n if (this[$isElementInViewport] && !this.loaded) {\n this[$updateSource]();\n }\n }\n }\n }, {\n root: null,\n // We used to have margin here, but it was causing animated models below\n // the fold to steal the frame budget. Weirder still, it would also\n // cause input events to be swallowed, sometimes for seconds on the\n // model above the fold, but only when the animated model was completely\n // below. Setting this margin to zero fixed it.\n rootMargin: '0px',\n // With zero threshold, an element adjacent to but not intersecting the\n // viewport will be reported as intersecting, which will cause\n // unnecessary rendering. Any slight positive threshold alleviates this.\n threshold: 0.00001,\n });\n }\n else {\n // If there is no intersection observer, then all models should be visible\n // at all times:\n this[$isElementInViewport] = true;\n }\n }\n connectedCallback() {\n super.connectedCallback && super.connectedCallback();\n if (HAS_RESIZE_OBSERVER) {\n this[$resizeObserver].observe(this);\n }\n else {\n self.addEventListener('resize', this[$fallbackResizeHandler]);\n }\n if (HAS_INTERSECTION_OBSERVER) {\n this[$intersectionObserver].observe(this);\n }\n this.addEventListener('focus', this[$onFocus]);\n this.addEventListener('blur', this[$onBlur]);\n const renderer = this[$renderer];\n renderer.addEventListener('contextlost', this[$onContextLost]);\n renderer.registerScene(this[$scene]);\n if (this[$clearModelTimeout] != null) {\n self.clearTimeout(this[$clearModelTimeout]);\n this[$clearModelTimeout] = null;\n // Force an update in case the model has been evicted from our GLTF cache\n // @see https://lit-element.polymer-project.org/guide/lifecycle#requestupdate\n this.requestUpdate('src', null);\n }\n }\n disconnectedCallback() {\n super.disconnectedCallback && super.disconnectedCallback();\n if (HAS_RESIZE_OBSERVER) {\n this[$resizeObserver].unobserve(this);\n }\n else {\n self.removeEventListener('resize', this[$fallbackResizeHandler]);\n }\n if (HAS_INTERSECTION_OBSERVER) {\n this[$intersectionObserver].unobserve(this);\n }\n this.removeEventListener('focus', this[$onFocus]);\n this.removeEventListener('blur', this[$onBlur]);\n const renderer = this[$renderer];\n renderer.removeEventListener('contextlost', this[$onContextLost]);\n renderer.unregisterScene(this[$scene]);\n this[$clearModelTimeout] = self.setTimeout(() => {\n this[$scene].dispose();\n this[$clearModelTimeout] = null;\n }, CLEAR_MODEL_TIMEOUT_MS);\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n // NOTE(cdata): If a property changes from values A -> B -> A in the space\n // of a microtask, LitElement/UpdatingElement will notify of a change even\n // though the value has effectively not changed, so we need to check to make\n // sure that the value has actually changed before changing the loaded flag.\n if (changedProperties.has('src')) {\n if (this.src == null) {\n this[$loaded] = false;\n this[$loadedTime] = 0;\n this[$scene].reset();\n }\n else if (this.src !== this[$scene].url) {\n this[$loaded] = false;\n this[$loadedTime] = 0;\n this[$updateSource]();\n }\n }\n if (changedProperties.has('alt')) {\n this[$userInputElement].setAttribute('aria-label', this[$ariaLabel]);\n }\n if (changedProperties.has('generateSchema')) {\n if (this.generateSchema) {\n this[$scene].updateSchema(this.src);\n }\n else {\n this[$scene].updateSchema(null);\n }\n }\n }\n /** @export */\n toDataURL(type, encoderOptions) {\n return this[$renderer]\n .displayCanvas(this[$scene])\n .toDataURL(type, encoderOptions);\n }\n /** @export */\n async toBlob(options) {\n const mimeType = options ? options.mimeType : undefined;\n const qualityArgument = options ? options.qualityArgument : undefined;\n const useIdealAspect = options ? options.idealAspect : undefined;\n const { width, height, idealAspect, aspect } = this[$scene];\n const { dpr, scaleFactor } = this[$renderer];\n let outputWidth = width * scaleFactor * dpr;\n let outputHeight = height * scaleFactor * dpr;\n let offsetX = 0;\n let offsetY = 0;\n if (useIdealAspect === true) {\n if (idealAspect > aspect) {\n const oldHeight = outputHeight;\n outputHeight = Math.round(outputWidth / idealAspect);\n offsetY = (oldHeight - outputHeight) / 2;\n }\n else {\n const oldWidth = outputWidth;\n outputWidth = Math.round(outputHeight * idealAspect);\n offsetX = (oldWidth - outputWidth) / 2;\n }\n }\n blobCanvas.width = outputWidth;\n blobCanvas.height = outputHeight;\n try {\n return new Promise(async (resolve, reject) => {\n blobCanvas.getContext('2d').drawImage(this[$renderer].displayCanvas(this[$scene]), offsetX, offsetY, outputWidth, outputHeight, 0, 0, outputWidth, outputHeight);\n blobCanvas.toBlob((blob) => {\n if (!blob) {\n return reject(new Error('Unable to retrieve canvas blob'));\n }\n resolve(blob);\n }, mimeType, qualityArgument);\n });\n }\n finally {\n this[$updateSize]({ width, height });\n }\n ;\n }\n /**\n * Registers a new EffectComposer as the main rendering pipeline,\n * instead of the default ThreeJs renderer.\n * This method also calls setRenderer, setMainScene, and setMainCamera on\n * your effectComposer.\n * @param effectComposer An EffectComposer from `pmndrs/postprocessing`\n */\n registerEffectComposer(effectComposer) {\n effectComposer.setRenderer(this[$renderer].threeRenderer);\n effectComposer.setMainCamera(this[$scene].getCamera());\n effectComposer.setMainScene(this[$scene]);\n this[$scene].effectRenderer = effectComposer;\n }\n /**\n * Removes the registered EffectComposer\n */\n unregisterEffectComposer() {\n this[$scene].effectRenderer = null;\n }\n registerRenderer(renderer) {\n this[$scene].externalRenderer = renderer;\n }\n unregisterRenderer() {\n this[$scene].externalRenderer = null;\n }\n get [$ariaLabel]() {\n return this[$altDefaulted];\n }\n get [$altDefaulted]() {\n return (this.alt == null || this.alt === 'null') ? this[$defaultAriaLabel] :\n this.alt;\n }\n // NOTE(cdata): Although this may seem extremely redundant, it is required in\n // order to support overloading when TypeScript is compiled to ES5\n // @see https://github.com/Polymer/lit-element/pull/745\n // @see https://github.com/microsoft/TypeScript/issues/338\n [$getLoaded]() {\n return this[$loaded];\n }\n // @see [$getLoaded]\n [$getModelIsVisible]() {\n return this.loaded && this[$isElementInViewport];\n }\n [$shouldAttemptPreload]() {\n return !!this.src && this[$isElementInViewport];\n }\n /**\n * Called on initialization and when the resize observer fires.\n */\n [$updateSize]({ width, height }) {\n if (width === 0 || height === 0) {\n return;\n }\n this[$container].style.width = `${width}px`;\n this[$container].style.height = `${height}px`;\n this[$onResize]({ width, height });\n }\n [$tick](time, delta) {\n var _p;\n (_p = this[$scene].effectRenderer) === null || _p === void 0 ? void 0 : _p.beforeRender(time, delta);\n }\n [$markLoaded]() {\n if (this[$loaded]) {\n return;\n }\n this[$loaded] = true;\n this[$loadedTime] = performance.now();\n }\n [$needsRender]() {\n this[$scene].queueRender();\n }\n [$onModelLoad]() {\n }\n [$updateStatus](status) {\n this[$status] = status;\n const rootNode = this.getRootNode();\n // Only change the aria-label if is currently focused:\n if (rootNode != null && rootNode.activeElement === this &&\n this[$statusElement].textContent != status) {\n this[$statusElement].textContent = status;\n }\n }\n [(_l = $onFocus, _m = $onBlur, $onResize)](e) {\n this[$scene].setSize(e.width, e.height);\n }\n /**\n * Parses the element for an appropriate source URL and\n * sets the views to use the new model based.\n */\n async [(_o = $onContextLost, $updateSource)]() {\n const scene = this[$scene];\n if (this.loaded || !this[$shouldAttemptPreload]() ||\n this.src === scene.url) {\n return;\n }\n if (this.generateSchema) {\n scene.updateSchema(this.src);\n }\n this[$updateStatus]('Loading');\n // If we are loading a new model, we need to stop the animation of\n // the current one (if any is playing). Otherwise, we might lose\n // the reference to the scene root and running actions start to\n // throw exceptions and/or behave in unexpected ways:\n scene.stopAnimation();\n const updateSourceProgress = this[$progressTracker].beginActivity('model-load');\n const source = this.src;\n try {\n const srcUpdated = scene.setSource(source, (progress) => updateSourceProgress(clamp(progress, 0, 1) * 0.95));\n const envUpdated = this[$updateEnvironment]();\n await Promise.all([srcUpdated, envUpdated]);\n this[$markLoaded]();\n this[$onModelLoad]();\n this.updateComplete.then(() => {\n this.dispatchEvent(new CustomEvent('before-render'));\n });\n // Wait for shaders to compile and pixels to be drawn.\n await new Promise(resolve => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.dispatchEvent(new CustomEvent('load', { detail: { url: source } }));\n resolve();\n });\n });\n });\n }\n catch (error) {\n this.dispatchEvent(new CustomEvent('error', { detail: { type: 'loadfailure', sourceError: error } }));\n }\n finally {\n updateSourceProgress(1.0);\n }\n }\n}\n__decorate([\n property({ type: String })\n], ModelViewerElementBase.prototype, \"alt\", void 0);\n__decorate([\n property({ type: String })\n], ModelViewerElementBase.prototype, \"src\", void 0);\n__decorate([\n property({ type: Boolean, attribute: 'with-credentials' })\n], ModelViewerElementBase.prototype, \"withCredentials\", void 0);\n__decorate([\n property({ type: Boolean, attribute: 'generate-schema' })\n], ModelViewerElementBase.prototype, \"generateSchema\", void 0);\n//# sourceMappingURL=model-viewer-base.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { LoopOnce, LoopPingPong, LoopRepeat } from 'three';\nimport { $getModelIsVisible, $needsRender, $onModelLoad, $renderer, $scene, $tick } from '../model-viewer-base.js';\nconst MILLISECONDS_PER_SECOND = 1000.0;\nconst $changeAnimation = Symbol('changeAnimation');\nconst $appendAnimation = Symbol('appendAnimation');\nconst $detachAnimation = Symbol('detachAnimation');\nconst $paused = Symbol('paused');\nconst DEFAULT_PLAY_OPTIONS = {\n repetitions: Infinity,\n pingpong: false\n};\nconst DEFAULT_APPEND_OPTIONS = {\n pingpong: false,\n repetitions: null,\n weight: 1,\n timeScale: 1,\n fade: false,\n warp: false,\n relativeWarp: true,\n time: null\n};\nconst DEFAULT_DETACH_OPTIONS = {\n fade: true\n};\nexport const AnimationMixin = (ModelViewerElement) => {\n var _a;\n class AnimationModelViewerElement extends ModelViewerElement {\n constructor(...args) {\n super(args);\n this.autoplay = false;\n this.animationName = undefined;\n this.animationCrossfadeDuration = 300;\n this[_a] = true;\n this[$scene].subscribeMixerEvent('loop', (e) => {\n const count = e.action._loopCount;\n const name = e.action._clip.name;\n const uuid = e.action._clip.uuid;\n const targetAnimation = this[$scene].markedAnimations.find(e => e.name === name);\n if (targetAnimation) {\n this[$scene].updateAnimationLoop(targetAnimation.name, targetAnimation.loopMode, targetAnimation.repetitionCount);\n const filtredArr = this[$scene].markedAnimations.filter(e => e.name !== name);\n this[$scene].markedAnimations = filtredArr;\n }\n this.dispatchEvent(new CustomEvent('loop', { detail: { count, name, uuid } }));\n });\n this[$scene].subscribeMixerEvent('finished', (e) => {\n if (!this[$scene].appendedAnimations.includes(e.action._clip.name)) {\n this[$paused] = true;\n }\n else {\n const filteredList = this[$scene].appendedAnimations.filter(i => i !== e.action._clip.name);\n this[$scene].appendedAnimations = filteredList;\n }\n this.dispatchEvent(new CustomEvent('finished'));\n });\n }\n /**\n * Returns an array\n */\n get availableAnimations() {\n if (this.loaded) {\n return this[$scene].animationNames;\n }\n return [];\n }\n get duration() {\n return this[$scene].duration;\n }\n get paused() {\n return this[$paused];\n }\n get currentTime() {\n return this[$scene].animationTime;\n }\n get appendedAnimations() {\n return this[$scene].appendedAnimations;\n }\n set currentTime(value) {\n this[$scene].animationTime = value;\n this[$needsRender]();\n }\n get timeScale() {\n return this[$scene].animationTimeScale;\n }\n set timeScale(value) {\n this[$scene].animationTimeScale = value;\n }\n pause() {\n if (this[$paused]) {\n return;\n }\n this[$paused] = true;\n this.dispatchEvent(new CustomEvent('pause'));\n }\n play(options) {\n if (this.availableAnimations.length > 0) {\n this[$paused] = false;\n this[$changeAnimation](options);\n this.dispatchEvent(new CustomEvent('play'));\n }\n }\n appendAnimation(animationName, options) {\n if (this.availableAnimations.length > 0) {\n this[$paused] = false;\n this[$appendAnimation](animationName, options);\n this.dispatchEvent(new CustomEvent('append-animation'));\n }\n }\n detachAnimation(animationName, options) {\n if (this.availableAnimations.length > 0) {\n this[$paused] = false;\n this[$detachAnimation](animationName, options);\n this.dispatchEvent(new CustomEvent('detach-animation'));\n }\n }\n [(_a = $paused, $onModelLoad)]() {\n super[$onModelLoad]();\n this[$paused] = true;\n if (this.animationName != null) {\n this[$changeAnimation]();\n }\n if (this.autoplay) {\n this.play();\n }\n }\n [$tick](_time, delta) {\n super[$tick](_time, delta);\n if (this[$paused] ||\n (!this[$getModelIsVisible]() && !this[$renderer].isPresenting)) {\n return;\n }\n this[$scene].updateAnimation(delta / MILLISECONDS_PER_SECOND);\n this[$needsRender]();\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('autoplay') && this.autoplay) {\n this.play();\n }\n if (changedProperties.has('animationName')) {\n this[$changeAnimation]();\n }\n }\n [$changeAnimation](options = DEFAULT_PLAY_OPTIONS) {\n var _b;\n const repetitions = (_b = options.repetitions) !== null && _b !== void 0 ? _b : Infinity;\n const mode = options.pingpong ?\n LoopPingPong :\n (repetitions === 1 ? LoopOnce : LoopRepeat);\n this[$scene].playAnimation(this.animationName, this.animationCrossfadeDuration / MILLISECONDS_PER_SECOND, mode, repetitions);\n // If we are currently paused, we need to force a render so that\n // the scene updates to the first frame of the new animation\n if (this[$paused]) {\n this[$scene].updateAnimation(0);\n this[$needsRender]();\n }\n }\n [$appendAnimation](animationName = '', options = DEFAULT_APPEND_OPTIONS) {\n var _b;\n const repetitions = (_b = options.repetitions) !== null && _b !== void 0 ? _b : Infinity;\n const mode = options.pingpong ?\n LoopPingPong :\n (repetitions === 1 ? LoopOnce : LoopRepeat);\n const needsToStop = !!options.repetitions || 'pingpong' in options;\n this[$scene].appendAnimation(animationName ? animationName : this.animationName, mode, repetitions, options.weight, options.timeScale, options.fade, options.warp, options.relativeWarp, options.time, needsToStop);\n // If we are currently paused, we need to force a render so that\n // the scene updates to the first frame of the new animation\n if (this[$paused]) {\n this[$scene].updateAnimation(0);\n this[$needsRender]();\n }\n }\n [$detachAnimation](animationName = '', options = DEFAULT_DETACH_OPTIONS) {\n this[$scene].detachAnimation(animationName ? animationName : this.animationName, options.fade);\n // If we are currently paused, we need to force a render so that\n // the scene updates to the first frame of the new animation\n if (this[$paused]) {\n this[$scene].updateAnimation(0);\n this[$needsRender]();\n }\n }\n }\n __decorate([\n property({ type: Boolean })\n ], AnimationModelViewerElement.prototype, \"autoplay\", void 0);\n __decorate([\n property({ type: String, attribute: 'animation-name' })\n ], AnimationModelViewerElement.prototype, \"animationName\", void 0);\n __decorate([\n property({ type: Number, attribute: 'animation-crossfade-duration' })\n ], AnimationModelViewerElement.prototype, \"animationCrossfadeDuration\", void 0);\n return AnimationModelViewerElement;\n};\n//# sourceMappingURL=animation.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Matrix4, Vector3 } from 'three';\nimport { $needsRender, $onModelLoad, $scene, $tick, toVector2D, toVector3D } from '../model-viewer-base.js';\nimport { Hotspot } from '../three-components/Hotspot.js';\nconst $hotspotMap = Symbol('hotspotMap');\nconst $mutationCallback = Symbol('mutationCallback');\nconst $observer = Symbol('observer');\nconst $addHotspot = Symbol('addHotspot');\nconst $removeHotspot = Symbol('removeHotspot');\nconst worldToModel = new Matrix4();\n/**\n * AnnotationMixin implements a declarative API to add hotspots and annotations.\n * Child elements of the element that have a slot name that\n * begins with \"hotspot\" and data-position and data-normal attributes in\n * the format of the camera-target attribute will be added to the scene and\n * track the specified model coordinates.\n */\nexport const AnnotationMixin = (ModelViewerElement) => {\n var _a, _b, _c;\n class AnnotationModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this[_a] = new Map();\n this[_b] = (mutations) => {\n mutations.forEach((mutation) => {\n // NOTE: Be wary that in ShadyDOM cases, the MutationRecord\n // only has addedNodes and removedNodes (and no other details).\n if (!(mutation instanceof MutationRecord) ||\n mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n this[$addHotspot](node);\n });\n mutation.removedNodes.forEach((node) => {\n this[$removeHotspot](node);\n });\n this[$needsRender]();\n }\n });\n };\n this[_c] = new MutationObserver(this[$mutationCallback]);\n }\n connectedCallback() {\n super.connectedCallback();\n for (let i = 0; i < this.children.length; ++i) {\n this[$addHotspot](this.children[i]);\n }\n const { ShadyDOM } = self;\n if (ShadyDOM == null) {\n this[$observer].observe(this, { childList: true });\n }\n else {\n this[$observer] =\n ShadyDOM.observeChildren(this, this[$mutationCallback]);\n }\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n const { ShadyDOM } = self;\n if (ShadyDOM == null) {\n this[$observer].disconnect();\n }\n else {\n ShadyDOM.unobserveChildren(this[$observer]);\n }\n }\n [(_a = $hotspotMap, _b = $mutationCallback, _c = $observer, $onModelLoad)]() {\n super[$onModelLoad]();\n const scene = this[$scene];\n scene.forHotspots((hotspot) => {\n scene.updateSurfaceHotspot(hotspot);\n });\n }\n [$tick](time, delta) {\n super[$tick](time, delta);\n const scene = this[$scene];\n const { annotationRenderer } = scene;\n const camera = scene.getCamera();\n if (scene.shouldRender()) {\n scene.animateSurfaceHotspots();\n scene.updateHotspotsVisibility(camera.position);\n annotationRenderer.domElement.style.display = '';\n annotationRenderer.render(scene, camera);\n }\n }\n /**\n * Since the data-position and data-normal attributes are not observed, use\n * this method to move a hotspot. Keep in mind that all hotspots with the\n * same slot name use a single location and the first definition takes\n * precedence, until updated with this method.\n */\n updateHotspot(config) {\n const hotspot = this[$hotspotMap].get(config.name);\n if (hotspot == null) {\n return;\n }\n hotspot.updatePosition(config.position);\n hotspot.updateNormal(config.normal);\n hotspot.surface = config.surface;\n this[$scene].updateSurfaceHotspot(hotspot);\n this[$needsRender]();\n }\n /**\n * This method returns in-scene data about a requested hotspot including\n * its position in screen (canvas) space and its current visibility.\n */\n queryHotspot(name) {\n const hotspot = this[$hotspotMap].get(name);\n if (hotspot == null) {\n return null;\n }\n const position = toVector3D(hotspot.position);\n const normal = toVector3D(hotspot.normal);\n const facingCamera = hotspot.facingCamera;\n const scene = this[$scene];\n const camera = scene.getCamera();\n const vector = new Vector3();\n vector.setFromMatrixPosition(hotspot.matrixWorld);\n vector.project(camera);\n const widthHalf = scene.width / 2;\n const heightHalf = scene.height / 2;\n vector.x = (vector.x * widthHalf) + widthHalf;\n vector.y = -(vector.y * heightHalf) + heightHalf;\n const canvasPosition = toVector3D(new Vector3(vector.x, vector.y, vector.z));\n if (!Number.isFinite(canvasPosition.x) ||\n !Number.isFinite(canvasPosition.y)) {\n return null;\n }\n return { position, normal, canvasPosition, facingCamera };\n }\n /**\n * This method returns the model position, normal and texture coordinate\n * of the point on the mesh corresponding to the input pixel coordinates\n * given relative to the model-viewer element. The position and normal\n * are returned as strings in the format suitable for putting in a\n * hotspot's data-position and data-normal attributes. If the mesh is\n * not hit, the result is null.\n */\n positionAndNormalFromPoint(pixelX, pixelY) {\n const scene = this[$scene];\n const ndcPosition = scene.getNDC(pixelX, pixelY);\n const hit = scene.positionAndNormalFromPoint(ndcPosition);\n if (hit == null) {\n return null;\n }\n worldToModel.copy(scene.target.matrixWorld).invert();\n const position = toVector3D(hit.position.applyMatrix4(worldToModel));\n const normal = toVector3D(hit.normal.transformDirection(worldToModel));\n let uv = null;\n if (hit.uv != null) {\n uv = toVector2D(hit.uv);\n }\n return { position: position, normal: normal, uv: uv };\n }\n /**\n * This method returns a dynamic hotspot ID string of the point on the mesh\n * corresponding to the input pixel coordinates given relative to the\n * model-viewer element. The ID string can be used in the data-surface\n * attribute of the hotspot to make it follow this point on the surface even\n * as the model animates. If the mesh is not hit, the result is null.\n */\n surfaceFromPoint(pixelX, pixelY) {\n const scene = this[$scene];\n const ndcPosition = scene.getNDC(pixelX, pixelY);\n return scene.surfaceFromPoint(ndcPosition);\n }\n [$addHotspot](node) {\n if (!(node instanceof HTMLElement &&\n node.slot.indexOf('hotspot') === 0)) {\n return;\n }\n let hotspot = this[$hotspotMap].get(node.slot);\n if (hotspot != null) {\n hotspot.increment();\n }\n else {\n hotspot = new Hotspot({\n name: node.slot,\n position: node.dataset.position,\n normal: node.dataset.normal,\n surface: node.dataset.surface,\n });\n this[$hotspotMap].set(node.slot, hotspot);\n this[$scene].addHotspot(hotspot);\n }\n this[$scene].queueRender();\n }\n [$removeHotspot](node) {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n const hotspot = this[$hotspotMap].get(node.slot);\n if (!hotspot) {\n return;\n }\n if (hotspot.decrement()) {\n this[$scene].removeHotspot(hotspot);\n this[$hotspotMap].delete(node.slot);\n }\n this[$scene].queueRender();\n }\n }\n return AnnotationModelViewerElement;\n};\n//# sourceMappingURL=annotation.js.map","/*!\nfflate - fast JavaScript compression/decompression\n\nLicensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE\nversion 0.8.2\n*/\n\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n ,\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data.length) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush();\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function () { w.postMessage([]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n */\n Deflate.prototype.flush = function () {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n */\n Gzip.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n // process concatenated GZIP\n if (this.s.f && !this.s.l && !final) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n */\n Zlib.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (val instanceof u8)\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","import {\n\tNoColorSpace,\n\tDoubleSide,\n\tColor,\n} from 'three';\n\nimport {\n\tstrToU8,\n\tzipSync,\n} from '../libs/fflate.module.js';\n\nclass USDZExporter {\n\n\tconstructor() {\n\n\t\tthis.textureUtils = null;\n\n\t}\n\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t}\n\n\tparse( scene, onDone, onError, options ) {\n\n\t\tthis.parseAsync( scene, options ).then( onDone ).catch( onError );\n\n\t}\n\n\tasync parseAsync( scene, options = {} ) {\n\n\t\toptions = Object.assign( {\n\t\t\tar: {\n\t\t\t\tanchoring: { type: 'plane' },\n\t\t\t\tplaneAnchoring: { alignment: 'horizontal' }\n\t\t\t},\n\t\t\tincludeAnchoringProperties: true,\n\t\t\tquickLookCompatible: false,\n\t\t\tmaxTextureSize: 1024,\n\t\t}, options );\n\n\t\tconst files = {};\n\t\tconst modelFileName = 'model.usda';\n\n\t\t// model file should be first in USDZ archive so we init it here\n\t\tfiles[ modelFileName ] = null;\n\n\t\tlet output = buildHeader();\n\n\t\toutput += buildSceneStart( options );\n\n\t\tconst materials = {};\n\t\tconst textures = {};\n\n\t\tscene.traverseVisible( ( object ) => {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tconst geometry = object.geometry;\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\tconst geometryFileName = 'geometries/Geometry_' + geometry.id + '.usda';\n\n\t\t\t\t\tif ( ! ( geometryFileName in files ) ) {\n\n\t\t\t\t\t\tconst meshObject = buildMeshObject( geometry );\n\t\t\t\t\t\tfiles[ geometryFileName ] = buildUSDFileAsString( meshObject );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! ( material.uuid in materials ) ) {\n\n\t\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutput += buildXform( object, geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)', object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isCamera ) {\n\n\t\t\t\toutput += buildCamera( object );\n\n\t\t\t}\n\n\t\t} );\n\n\n\t\toutput += buildSceneEnd();\n\n\t\toutput += buildMaterials( materials, textures, options.quickLookCompatible );\n\n\t\tfiles[ modelFileName ] = strToU8( output );\n\t\toutput = null;\n\n\t\tfor ( const id in textures ) {\n\n\t\t\tlet texture = textures[ id ];\n\n\t\t\tif ( texture.isCompressedTexture === true ) {\n\n\t\t\t\tif ( this.textureUtils === null ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.USDZExporter: setTextureUtils() must be called to process compressed textures.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = await this.textureUtils.decompress( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst canvas = imageToCanvas( texture.image, texture.flipY, options.maxTextureSize );\n\t\t\tconst blob = await new Promise( resolve => canvas.toBlob( resolve, 'image/png', 1 ) );\n\n\t\t\tfiles[ `textures/Texture_${ id }.png` ] = new Uint8Array( await blob.arrayBuffer() );\n\n\t\t}\n\n\t\t// 64 byte alignment\n\t\t// https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n\t\tlet offset = 0;\n\n\t\tfor ( const filename in files ) {\n\n\t\t\tconst file = files[ filename ];\n\t\t\tconst headerSize = 34 + filename.length;\n\n\t\t\toffset += headerSize;\n\n\t\t\tconst offsetMod64 = offset & 63;\n\n\t\t\tif ( offsetMod64 !== 4 ) {\n\n\t\t\t\tconst padLength = 64 - offsetMod64;\n\t\t\t\tconst padding = new Uint8Array( padLength );\n\n\t\t\t\tfiles[ filename ] = [ file, { extra: { 12345: padding } } ];\n\n\t\t\t}\n\n\t\t\toffset = file.length;\n\n\t\t}\n\n\t\treturn zipSync( files, { level: 0 } );\n\n\t}\n\n}\n\nfunction imageToCanvas( image, flipY, maxTextureSize ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\tconst scale = maxTextureSize / Math.max( image.width, image.height );\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = image.width * Math.min( 1, scale );\n\t\tcanvas.height = image.height * Math.min( 1, scale );\n\n\t\tconst context = canvas.getContext( '2d' );\n\n\t\t// TODO: We should be able to do this in the UsdTransform2d?\n\n\t\tif ( flipY === true ) {\n\n\t\t\tcontext.translate( 0, canvas.height );\n\t\t\tcontext.scale( 1, - 1 );\n\n\t\t}\n\n\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\treturn canvas;\n\n\t} else {\n\n\t\tthrow new Error( 'THREE.USDZExporter: No valid image data found. Unable to process texture.' );\n\n\t}\n\n}\n\n//\n\nconst PRECISION = 7;\n\nfunction buildHeader() {\n\n\treturn `#usda 1.0\n(\n\tcustomLayerData = {\n\t\tstring creator = \"Three.js USDZExporter\"\n\t}\n\tdefaultPrim = \"Root\"\n\tmetersPerUnit = 1\n\tupAxis = \"Y\"\n)\n\n`;\n\n}\n\nfunction buildSceneStart( options ) {\n\n\tconst alignment = options.includeAnchoringProperties === true ? `\n\t\ttoken preliminary:anchoring:type = \"${options.ar.anchoring.type}\"\n\t\ttoken preliminary:planeAnchoring:alignment = \"${options.ar.planeAnchoring.alignment}\"\n\t` : '';\n\treturn `def Xform \"Root\"\n{\n\tdef Scope \"Scenes\" (\n\t\tkind = \"sceneLibrary\"\n\t)\n\t{\n\t\tdef Xform \"Scene\" (\n\t\t\tcustomData = {\n\t\t\t\tbool preliminary_collidesWithEnvironment = 0\n\t\t\t\tstring sceneName = \"Scene\"\n\t\t\t}\n\t\t\tsceneName = \"Scene\"\n\t\t)\n\t\t{${alignment}\n`;\n\n}\n\nfunction buildSceneEnd() {\n\n\treturn `\n\t\t}\n\t}\n}\n\n`;\n\n}\n\nfunction buildUSDFileAsString( dataToInsert ) {\n\n\tlet output = buildHeader();\n\toutput += dataToInsert;\n\treturn strToU8( output );\n\n}\n\n// Xform\n\nfunction buildXform( object, geometry, material ) {\n\n\tconst name = 'Object_' + object.id;\n\tconst transform = buildMatrix( object.matrixWorld );\n\n\tif ( object.matrixWorld.determinant() < 0 ) {\n\n\t\tconsole.warn( 'THREE.USDZExporter: USDZ does not support negative scales', object );\n\n\t}\n\n\treturn `def Xform \"${ name }\" (\n\tprepend references = @./geometries/Geometry_${ geometry.id }.usda@\n\tprepend apiSchemas = [\"MaterialBindingAPI\"]\n)\n{\n\tmatrix4d xformOp:transform = ${ transform }\n\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n\trel material:binding = \n}\n\n`;\n\n}\n\nfunction buildMatrix( matrix ) {\n\n\tconst array = matrix.elements;\n\n\treturn `( ${ buildMatrixRow( array, 0 ) }, ${ buildMatrixRow( array, 4 ) }, ${ buildMatrixRow( array, 8 ) }, ${ buildMatrixRow( array, 12 ) } )`;\n\n}\n\nfunction buildMatrixRow( array, offset ) {\n\n\treturn `(${ array[ offset + 0 ] }, ${ array[ offset + 1 ] }, ${ array[ offset + 2 ] }, ${ array[ offset + 3 ] })`;\n\n}\n\n// Mesh\n\nfunction buildMeshObject( geometry ) {\n\n\tconst mesh = buildMesh( geometry );\n\treturn `\ndef \"Geometry\"\n{\n${mesh}\n}\n`;\n\n}\n\nfunction buildMesh( geometry ) {\n\n\tconst name = 'Geometry';\n\tconst attributes = geometry.attributes;\n\tconst count = attributes.position.count;\n\n\treturn `\n\tdef Mesh \"${ name }\"\n\t{\n\t\tint[] faceVertexCounts = [${ buildMeshVertexCount( geometry ) }]\n\t\tint[] faceVertexIndices = [${ buildMeshVertexIndices( geometry ) }]\n\t\tnormal3f[] normals = [${ buildVector3Array( attributes.normal, count )}] (\n\t\t\tinterpolation = \"vertex\"\n\t\t)\n\t\tpoint3f[] points = [${ buildVector3Array( attributes.position, count )}]\n${ buildPrimvars( attributes ) }\n\t\tuniform token subdivisionScheme = \"none\"\n\t}\n`;\n\n}\n\nfunction buildMeshVertexCount( geometry ) {\n\n\tconst count = geometry.index !== null ? geometry.index.count : geometry.attributes.position.count;\n\n\treturn Array( count / 3 ).fill( 3 ).join( ', ' );\n\n}\n\nfunction buildMeshVertexIndices( geometry ) {\n\n\tconst index = geometry.index;\n\tconst array = [];\n\n\tif ( index !== null ) {\n\n\t\tfor ( let i = 0; i < index.count; i ++ ) {\n\n\t\t\tarray.push( index.getX( i ) );\n\n\t\t}\n\n\t} else {\n\n\t\tconst length = geometry.attributes.position.count;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tarray.push( i );\n\n\t\t}\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector3Array( attribute, count ) {\n\n\tif ( attribute === undefined ) {\n\n\t\tconsole.warn( 'USDZExporter: Normals missing.' );\n\t\treturn Array( count ).fill( '(0, 0, 0)' ).join( ', ' );\n\n\t}\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\t\tconst z = attribute.getZ( i );\n\n\t\tarray.push( `(${ x.toPrecision( PRECISION ) }, ${ y.toPrecision( PRECISION ) }, ${ z.toPrecision( PRECISION ) })` );\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector2Array( attribute ) {\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\n\t\tarray.push( `(${ x.toPrecision( PRECISION ) }, ${ 1 - y.toPrecision( PRECISION ) })` );\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildPrimvars( attributes ) {\n\n\tlet string = '';\n\n\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\tconst id = ( i > 0 ? i : '' );\n\t\tconst attribute = attributes[ 'uv' + id ];\n\n\t\tif ( attribute !== undefined ) {\n\n\t\t\tstring += `\n\t\ttexCoord2f[] primvars:st${ id } = [${ buildVector2Array( attribute )}] (\n\t\t\tinterpolation = \"vertex\"\n\t\t)`;\n\n\t\t}\n\n\t}\n\n\t// vertex colors\n\n\tconst colorAttribute = attributes.color;\n\n\tif ( colorAttribute !== undefined ) {\n\n\t\tconst count = colorAttribute.count;\n\n\t\tstring += `\n\tcolor3f[] primvars:displayColor = [${buildVector3Array( colorAttribute, count )}] (\n\t\tinterpolation = \"vertex\"\n\t\t)`;\n\n\t}\n\n\treturn string;\n\n}\n\n// Materials\n\nfunction buildMaterials( materials, textures, quickLookCompatible = false ) {\n\n\tconst array = [];\n\n\tfor ( const uuid in materials ) {\n\n\t\tconst material = materials[ uuid ];\n\n\t\tarray.push( buildMaterial( material, textures, quickLookCompatible ) );\n\n\t}\n\n\treturn `def \"Materials\"\n{\n${ array.join( '' ) }\n}\n\n`;\n\n}\n\nfunction buildMaterial( material, textures, quickLookCompatible = false ) {\n\n\t// https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n\tconst pad = '\t\t\t';\n\tconst inputs = [];\n\tconst samplers = [];\n\n\tfunction buildTexture( texture, mapType, color ) {\n\n\t\tconst id = texture.source.id + '_' + texture.flipY;\n\n\t\ttextures[ id ] = texture;\n\n\t\tconst uv = texture.channel > 0 ? 'st' + texture.channel : 'st';\n\n\t\tconst WRAPPINGS = {\n\t\t\t1000: 'repeat', // RepeatWrapping\n\t\t\t1001: 'clamp', // ClampToEdgeWrapping\n\t\t\t1002: 'mirror' // MirroredRepeatWrapping\n\t\t};\n\n\t\tconst repeat = texture.repeat.clone();\n\t\tconst offset = texture.offset.clone();\n\t\tconst rotation = texture.rotation;\n\n\t\t// rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\n\t\tconst xRotationOffset = Math.sin( rotation );\n\t\tconst yRotationOffset = Math.cos( rotation );\n\n\t\t// texture coordinates start in the opposite corner, need to correct\n\t\toffset.y = 1 - offset.y - repeat.y;\n\n\t\t// turns out QuickLook is buggy and interprets texture repeat inverted/applies operations in a different order.\n\t\t// Apple Feedback: \tFB10036297 and FB11442287\n\t\tif ( quickLookCompatible ) {\n\n\t\t\t// This is NOT correct yet in QuickLook, but comes close for a range of models.\n\t\t\t// It becomes more incorrect the bigger the offset is\n\n\t\t\toffset.x = offset.x / repeat.x;\n\t\t\toffset.y = offset.y / repeat.y;\n\n\t\t\toffset.x += xRotationOffset / repeat.x;\n\t\t\toffset.y += yRotationOffset - 1;\n\n\t\t} else {\n\n\t\t\t// results match glTF results exactly. verified correct in usdview.\n\t\t\toffset.x += xRotationOffset * repeat.x;\n\t\t\toffset.y += ( 1 - yRotationOffset ) * repeat.y;\n\n\t\t}\n\n\t\treturn `\n\t\tdef Shader \"PrimvarReader_${ mapType }\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdPrimvarReader_float2\"\n\t\t\tfloat2 inputs:fallback = (0.0, 0.0)\n\t\t\ttoken inputs:varname = \"${ uv }\"\n\t\t\tfloat2 outputs:result\n\t\t}\n\n\t\tdef Shader \"Transform2d_${ mapType }\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdTransform2d\"\n\t\t\ttoken inputs:in.connect = \n\t\t\tfloat inputs:rotation = ${ ( rotation * ( 180 / Math.PI ) ).toFixed( PRECISION ) }\n\t\t\tfloat2 inputs:scale = ${ buildVector2( repeat ) }\n\t\t\tfloat2 inputs:translation = ${ buildVector2( offset ) }\n\t\t\tfloat2 outputs:result\n\t\t}\n\n\t\tdef Shader \"Texture_${ texture.id }_${ mapType }\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdUVTexture\"\n\t\t\tasset inputs:file = @textures/Texture_${ id }.png@\n\t\t\tfloat2 inputs:st.connect = \n\t\t\t${ color !== undefined ? 'float4 inputs:scale = ' + buildColor4( color ) : '' }\n\t\t\ttoken inputs:sourceColorSpace = \"${ texture.colorSpace === NoColorSpace ? 'raw' : 'sRGB' }\"\n\t\t\ttoken inputs:wrapS = \"${ WRAPPINGS[ texture.wrapS ] }\"\n\t\t\ttoken inputs:wrapT = \"${ WRAPPINGS[ texture.wrapT ] }\"\n\t\t\tfloat outputs:r\n\t\t\tfloat outputs:g\n\t\t\tfloat outputs:b\n\t\t\tfloat3 outputs:rgb\n\t\t\t${ material.transparent || material.alphaTest > 0.0 ? 'float outputs:a' : '' }\n\t\t}`;\n\n\t}\n\n\n\tif ( material.side === DoubleSide ) {\n\n\t\tconsole.warn( 'THREE.USDZExporter: USDZ does not support double sided materials', material );\n\n\t}\n\n\tif ( material.map !== null ) {\n\n\t\tinputs.push( `${ pad }color3f inputs:diffuseColor.connect = ` );\n\n\t\tif ( material.transparent ) {\n\n\t\t\tinputs.push( `${ pad }float inputs:opacity.connect = ` );\n\n\t\t} else if ( material.alphaTest > 0.0 ) {\n\n\t\t\tinputs.push( `${ pad }float inputs:opacity.connect = ` );\n\t\t\tinputs.push( `${ pad }float inputs:opacityThreshold = ${material.alphaTest}` );\n\n\t\t}\n\n\t\tsamplers.push( buildTexture( material.map, 'diffuse', material.color ) );\n\n\t} else {\n\n\t\tinputs.push( `${ pad }color3f inputs:diffuseColor = ${ buildColor( material.color ) }` );\n\n\t}\n\n\tif ( material.emissiveMap !== null ) {\n\n\t\tinputs.push( `${ pad }color3f inputs:emissiveColor.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.emissiveMap, 'emissive', new Color( material.emissive.r * material.emissiveIntensity, material.emissive.g * material.emissiveIntensity, material.emissive.b * material.emissiveIntensity ) ) );\n\n\t} else if ( material.emissive.getHex() > 0 ) {\n\n\t\tinputs.push( `${ pad }color3f inputs:emissiveColor = ${ buildColor( material.emissive ) }` );\n\n\t}\n\n\tif ( material.normalMap !== null ) {\n\n\t\tinputs.push( `${ pad }normal3f inputs:normal.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.normalMap, 'normal' ) );\n\n\t}\n\n\tif ( material.aoMap !== null ) {\n\n\t\tinputs.push( `${ pad }float inputs:occlusion.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.aoMap, 'occlusion', new Color( material.aoMapIntensity, material.aoMapIntensity, material.aoMapIntensity ) ) );\n\n\t}\n\n\tif ( material.roughnessMap !== null ) {\n\n\t\tinputs.push( `${ pad }float inputs:roughness.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.roughnessMap, 'roughness', new Color( material.roughness, material.roughness, material.roughness ) ) );\n\n\t} else {\n\n\t\tinputs.push( `${ pad }float inputs:roughness = ${ material.roughness }` );\n\n\t}\n\n\tif ( material.metalnessMap !== null ) {\n\n\t\tinputs.push( `${ pad }float inputs:metallic.connect = ` );\n\n\t\tsamplers.push( buildTexture( material.metalnessMap, 'metallic', new Color( material.metalness, material.metalness, material.metalness ) ) );\n\n\t} else {\n\n\t\tinputs.push( `${ pad }float inputs:metallic = ${ material.metalness }` );\n\n\t}\n\n\tif ( material.alphaMap !== null ) {\n\n\t\tinputs.push( `${pad}float inputs:opacity.connect = ` );\n\t\tinputs.push( `${pad}float inputs:opacityThreshold = 0.0001` );\n\n\t\tsamplers.push( buildTexture( material.alphaMap, 'opacity' ) );\n\n\t} else {\n\n\t\tinputs.push( `${pad}float inputs:opacity = ${material.opacity}` );\n\n\t}\n\n\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\tif ( material.clearcoatMap !== null ) {\n\n\t\t\tinputs.push( `${pad}float inputs:clearcoat.connect = ` );\n\t\t\tsamplers.push( buildTexture( material.clearcoatMap, 'clearcoat', new Color( material.clearcoat, material.clearcoat, material.clearcoat ) ) );\n\n\t\t} else {\n\n\t\t\tinputs.push( `${pad}float inputs:clearcoat = ${material.clearcoat}` );\n\n\t\t}\n\n\t\tif ( material.clearcoatRoughnessMap !== null ) {\n\n\t\t\tinputs.push( `${pad}float inputs:clearcoatRoughness.connect = ` );\n\t\t\tsamplers.push( buildTexture( material.clearcoatRoughnessMap, 'clearcoatRoughness', new Color( material.clearcoatRoughness, material.clearcoatRoughness, material.clearcoatRoughness ) ) );\n\n\t\t} else {\n\n\t\t\tinputs.push( `${pad}float inputs:clearcoatRoughness = ${material.clearcoatRoughness}` );\n\n\t\t}\n\n\t\tinputs.push( `${ pad }float inputs:ior = ${ material.ior }` );\n\n\t}\n\n\treturn `\n\tdef Material \"Material_${ material.id }\"\n\t{\n\t\tdef Shader \"PreviewSurface\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdPreviewSurface\"\n${ inputs.join( '\\n' ) }\n\t\t\tint inputs:useSpecularWorkflow = 0\n\t\t\ttoken outputs:surface\n\t\t}\n\n\t\ttoken outputs:surface.connect = \n\n${ samplers.join( '\\n' ) }\n\n\t}\n`;\n\n}\n\nfunction buildColor( color ) {\n\n\treturn `(${ color.r }, ${ color.g }, ${ color.b })`;\n\n}\n\nfunction buildColor4( color ) {\n\n\treturn `(${ color.r }, ${ color.g }, ${ color.b }, 1.0)`;\n\n}\n\nfunction buildVector2( vector ) {\n\n\treturn `(${ vector.x }, ${ vector.y })`;\n\n}\n\n\nfunction buildCamera( camera ) {\n\n\tconst name = camera.name ? camera.name : 'Camera_' + camera.id;\n\n\tconst transform = buildMatrix( camera.matrixWorld );\n\n\tif ( camera.matrixWorld.determinant() < 0 ) {\n\n\t\tconsole.warn( 'THREE.USDZExporter: USDZ does not support negative scales', camera );\n\n\t}\n\n\tif ( camera.isOrthographicCamera ) {\n\n\t\treturn `def Camera \"${name}\"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ${ transform }\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n\t\t\tfloat2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) })\n\t\t\tfloat horizontalAperture = ${ ( ( Math.abs( camera.left ) + Math.abs( camera.right ) ) * 10 ).toPrecision( PRECISION ) }\n\t\t\tfloat verticalAperture = ${ ( ( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) * 10 ).toPrecision( PRECISION ) }\n\t\t\ttoken projection = \"orthographic\"\n\t\t}\n\t\n\t`;\n\n\t} else {\n\n\t\treturn `def Camera \"${name}\"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ${ transform }\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n\t\t\tfloat2 clippingRange = (${ camera.near.toPrecision( PRECISION ) }, ${ camera.far.toPrecision( PRECISION ) })\n\t\t\tfloat focalLength = ${ camera.getFocalLength().toPrecision( PRECISION ) }\n\t\t\tfloat focusDistance = ${ camera.focus.toPrecision( PRECISION ) }\n\t\t\tfloat horizontalAperture = ${ camera.getFilmWidth().toPrecision( PRECISION ) }\n\t\t\ttoken projection = \"perspective\"\n\t\t\tfloat verticalAperture = ${ camera.getFilmHeight().toPrecision( PRECISION ) }\n\t\t}\n\t\n\t`;\n\n\t}\n\n}\n\nexport { USDZExporter };\n","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { parseExpressions } from './parsers.js';\n/**\n * For our purposes, an enumeration is a fixed set of CSS-expression-compatible\n * names. When serialized, a selected subset of the members may be specified as\n * whitespace-separated strings. An enumeration deserializer is a function that\n * parses a serialized subset of an enumeration and returns any members that are\n * found as a Set.\n *\n * The following example will produce a deserializer for the days of the\n * week:\n *\n * const deserializeDaysOfTheWeek = enumerationDeserializer([\n * 'Monday',\n * 'Tuesday',\n * 'Wednesday',\n * 'Thursday',\n * 'Friday',\n * 'Saturday',\n * 'Sunday'\n * ]);\n */\nexport const enumerationDeserializer = (allowedNames) => (valueString) => {\n try {\n const expressions = parseExpressions(valueString);\n const names = (expressions.length ? expressions[0].terms : [])\n .filter((valueNode) => valueNode && valueNode.type === 'ident')\n .map(valueNode => valueNode.value)\n .filter(name => allowedNames.indexOf(name) > -1);\n return new Set(names);\n }\n catch (_error) {\n }\n return new Set();\n};\n//# sourceMappingURL=deserializers.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { USDZExporter } from 'three/examples/jsm/exporters/USDZExporter.js';\nimport { IS_AR_QUICKLOOK_CANDIDATE, IS_SCENEVIEWER_CANDIDATE, IS_WEBXR_AR_CANDIDATE } from '../constants.js';\nimport { $needsRender, $progressTracker, $renderer, $scene, $shouldAttemptPreload, $updateSource } from '../model-viewer-base.js';\nimport { enumerationDeserializer } from '../styles/deserializers.js';\nimport { ARStatus, ARTracking } from '../three-components/ARRenderer.js';\nimport { waitForEvent } from '../utilities.js';\nlet isWebXRBlocked = false;\nlet isSceneViewerBlocked = false;\nconst noArViewerSigil = '#model-viewer-no-ar-fallback';\nconst deserializeARModes = enumerationDeserializer(['quick-look', 'scene-viewer', 'webxr', 'none']);\nconst DEFAULT_AR_MODES = 'webxr scene-viewer quick-look';\nconst ARMode = {\n QUICK_LOOK: 'quick-look',\n SCENE_VIEWER: 'scene-viewer',\n WEBXR: 'webxr',\n NONE: 'none'\n};\nconst $arButtonContainer = Symbol('arButtonContainer');\nconst $enterARWithWebXR = Symbol('enterARWithWebXR');\nexport const $openSceneViewer = Symbol('openSceneViewer');\nexport const $openIOSARQuickLook = Symbol('openIOSARQuickLook');\nconst $canActivateAR = Symbol('canActivateAR');\nconst $arMode = Symbol('arMode');\nconst $arModes = Symbol('arModes');\nconst $arAnchor = Symbol('arAnchor');\nconst $preload = Symbol('preload');\nconst $onARButtonContainerClick = Symbol('onARButtonContainerClick');\nconst $onARStatus = Symbol('onARStatus');\nconst $onARTracking = Symbol('onARTracking');\nconst $onARTap = Symbol('onARTap');\nconst $selectARMode = Symbol('selectARMode');\nconst $triggerLoad = Symbol('triggerLoad');\nexport const ARMixin = (ModelViewerElement) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n class ARModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this.ar = false;\n this.arScale = 'auto';\n this.arUsdzMaxTextureSize = 'auto';\n this.arPlacement = 'floor';\n this.arModes = DEFAULT_AR_MODES;\n this.iosSrc = null;\n this.xrEnvironment = false;\n this[_a] = false;\n // TODO: Add this to the shadow root as part of this mixin's\n // implementation:\n this[_b] = this.shadowRoot.querySelector('.ar-button');\n this[_c] = document.createElement('a');\n this[_d] = new Set();\n this[_e] = ARMode.NONE;\n this[_f] = false;\n this[_g] = (event) => {\n event.preventDefault();\n this.activateAR();\n };\n this[_h] = ({ status }) => {\n if (status === ARStatus.NOT_PRESENTING ||\n this[$renderer].arRenderer.presentedScene === this[$scene]) {\n this.setAttribute('ar-status', status);\n this.dispatchEvent(new CustomEvent('ar-status', { detail: { status } }));\n if (status === ARStatus.NOT_PRESENTING) {\n this.removeAttribute('ar-tracking');\n }\n else if (status === ARStatus.SESSION_STARTED) {\n this.setAttribute('ar-tracking', ARTracking.TRACKING);\n }\n }\n };\n this[_j] = ({ status }) => {\n this.setAttribute('ar-tracking', status);\n this.dispatchEvent(new CustomEvent('ar-tracking', { detail: { status } }));\n };\n this[_k] = (event) => {\n if (event.data == '_apple_ar_quicklook_button_tapped') {\n this.dispatchEvent(new CustomEvent('quick-look-button-tapped'));\n }\n };\n }\n get canActivateAR() {\n return this[$arMode] !== ARMode.NONE;\n }\n connectedCallback() {\n super.connectedCallback();\n this[$renderer].arRenderer.addEventListener('status', this[$onARStatus]);\n this.setAttribute('ar-status', ARStatus.NOT_PRESENTING);\n this[$renderer].arRenderer.addEventListener('tracking', this[$onARTracking]);\n this[$arAnchor].addEventListener('message', this[$onARTap]);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this[$renderer].arRenderer.removeEventListener('status', this[$onARStatus]);\n this[$renderer].arRenderer.removeEventListener('tracking', this[$onARTracking]);\n this[$arAnchor].removeEventListener('message', this[$onARTap]);\n }\n update(changedProperties) {\n super.update(changedProperties);\n if (changedProperties.has('arScale')) {\n this[$scene].canScale = this.arScale !== 'fixed';\n }\n if (changedProperties.has('arPlacement')) {\n this[$scene].updateShadow();\n this[$needsRender]();\n }\n if (changedProperties.has('arModes')) {\n this[$arModes] = deserializeARModes(this.arModes);\n }\n if (changedProperties.has('ar') || changedProperties.has('arModes') ||\n changedProperties.has('src') || changedProperties.has('iosSrc') ||\n changedProperties.has('arUsdzMaxTextureSize')) {\n this[$selectARMode]();\n }\n }\n /**\n * Activates AR. Note that for any mode that is not WebXR-based, this\n * method most likely has to be called synchronous from a user\n * interaction handler. Otherwise, attempts to activate modes that\n * require user interaction will most likely be ignored.\n */\n async activateAR() {\n switch (this[$arMode]) {\n case ARMode.QUICK_LOOK:\n await this[$openIOSARQuickLook]();\n break;\n case ARMode.WEBXR:\n await this[$enterARWithWebXR]();\n break;\n case ARMode.SCENE_VIEWER:\n this[$openSceneViewer]();\n break;\n default:\n console.warn('No AR Mode can be activated. This is probably due to missing \\\nconfiguration or device capabilities');\n break;\n }\n }\n async [(_a = $canActivateAR, _b = $arButtonContainer, _c = $arAnchor, _d = $arModes, _e = $arMode, _f = $preload, _g = $onARButtonContainerClick, _h = $onARStatus, _j = $onARTracking, _k = $onARTap, $selectARMode)]() {\n var _l;\n let arMode = ARMode.NONE;\n if (this.ar) {\n if (this.src != null) {\n for (const value of this[$arModes]) {\n if (value === 'webxr' && IS_WEBXR_AR_CANDIDATE && !isWebXRBlocked &&\n await this[$renderer].arRenderer.supportsPresentation()) {\n arMode = ARMode.WEBXR;\n break;\n }\n if (value === 'scene-viewer' && !isSceneViewerBlocked &&\n (IS_SCENEVIEWER_CANDIDATE ||\n (navigator.userAgentData &&\n navigator.userAgentData.getHighEntropyValues &&\n ((_l = (await navigator.userAgentData.getHighEntropyValues([\n 'formFactor'\n ])).formFactor) === null || _l === void 0 ? void 0 : _l.includes('XR'))))) {\n arMode = ARMode.SCENE_VIEWER;\n break;\n }\n if (value === 'quick-look' && IS_AR_QUICKLOOK_CANDIDATE) {\n arMode = ARMode.QUICK_LOOK;\n break;\n }\n }\n }\n // The presence of ios-src overrides the absence of quick-look\n // ar-mode.\n if (arMode === ARMode.NONE && this.iosSrc != null &&\n IS_AR_QUICKLOOK_CANDIDATE) {\n arMode = ARMode.QUICK_LOOK;\n }\n }\n if (arMode !== ARMode.NONE) {\n this[$arButtonContainer].classList.add('enabled');\n this[$arButtonContainer].addEventListener('click', this[$onARButtonContainerClick]);\n }\n else if (this[$arButtonContainer].classList.contains('enabled')) {\n this[$arButtonContainer].removeEventListener('click', this[$onARButtonContainerClick]);\n this[$arButtonContainer].classList.remove('enabled');\n // If AR went from working to not, notify the element.\n const status = ARStatus.FAILED;\n this.setAttribute('ar-status', status);\n this.dispatchEvent(new CustomEvent('ar-status', { detail: { status } }));\n }\n this[$arMode] = arMode;\n }\n async [$enterARWithWebXR]() {\n console.log('Attempting to present in AR with WebXR...');\n await this[$triggerLoad]();\n try {\n this[$arButtonContainer].removeEventListener('click', this[$onARButtonContainerClick]);\n const { arRenderer } = this[$renderer];\n if (this.arPlacement === 'wall') {\n arRenderer.placementMode = 'wall';\n }\n else if (this.arPlacement === 'ceiling') {\n arRenderer.placementMode = 'ceiling';\n }\n else {\n arRenderer.placementMode = 'floor';\n }\n await arRenderer.present(this[$scene], this.xrEnvironment);\n }\n catch (error) {\n console.warn('Error while trying to present in AR with WebXR');\n console.error(error);\n await this[$renderer].arRenderer.stopPresenting();\n isWebXRBlocked = true;\n console.warn('Falling back to next ar-mode');\n await this[$selectARMode]();\n this.activateAR();\n }\n finally {\n this[$selectARMode]();\n }\n }\n async [$triggerLoad]() {\n if (!this.loaded) {\n this[$preload] = true;\n this[$updateSource]();\n await waitForEvent(this, 'load');\n this[$preload] = false;\n }\n }\n [$shouldAttemptPreload]() {\n return super[$shouldAttemptPreload]() || this[$preload];\n }\n /**\n * Takes a URL and a title string, and attempts to launch Scene Viewer on\n * the current device.\n */\n [$openSceneViewer]() {\n const location = self.location.toString();\n const locationUrl = new URL(location);\n const modelUrl = new URL(this.src, location);\n if (modelUrl.hash)\n modelUrl.hash = '';\n const params = new URLSearchParams(modelUrl.search);\n locationUrl.hash = noArViewerSigil;\n // modelUrl can contain title/link/sound etc.\n params.set('mode', 'ar_preferred');\n if (!params.has('disable_occlusion')) {\n params.set('disable_occlusion', 'true');\n }\n if (this.arScale === 'fixed') {\n params.set('resizable', 'false');\n }\n if (this.arPlacement === 'wall') {\n params.set('enable_vertical_placement', 'true');\n }\n if (params.has('sound')) {\n const soundUrl = new URL(params.get('sound'), location);\n params.set('sound', soundUrl.toString());\n }\n if (params.has('link')) {\n const linkUrl = new URL(params.get('link'), location);\n params.set('link', linkUrl.toString());\n }\n const intent = `intent://arvr.google.com/scene-viewer/1.2?${params.toString() + '&file=' +\n encodeURIComponent(modelUrl\n .toString())}#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=${encodeURIComponent(locationUrl.toString())};end;`;\n const undoHashChange = () => {\n if (self.location.hash === noArViewerSigil) {\n isSceneViewerBlocked = true;\n // The new history will be the current URL with a new hash.\n // Go back one step so that we reset to the expected URL.\n // NOTE(cdata): this should not invoke any browser-level navigation\n // because hash-only changes modify the URL in-place without\n // navigating:\n self.history.back();\n console.warn('Error while trying to present in AR with Scene Viewer');\n console.warn('Falling back to next ar-mode');\n this[$selectARMode]();\n // Would be nice to activateAR() here, but webXR fails due to not\n // seeing a user activation.\n }\n };\n self.addEventListener('hashchange', undoHashChange, { once: true });\n this[$arAnchor].setAttribute('href', intent);\n console.log('Attempting to present in AR with Scene Viewer...');\n this[$arAnchor].click();\n }\n /**\n * Takes a URL to a USDZ file and sets the appropriate fields so that\n * Safari iOS can intent to their AR Quick Look.\n */\n async [$openIOSARQuickLook]() {\n const generateUsdz = !this.iosSrc;\n this[$arButtonContainer].classList.remove('enabled');\n const objectURL = generateUsdz ? await this.prepareUSDZ() : this.iosSrc;\n const modelUrl = new URL(objectURL, self.location.toString());\n if (generateUsdz) {\n const location = self.location.toString();\n const locationUrl = new URL(location);\n const srcUrl = new URL(this.src, locationUrl);\n if (srcUrl.hash) {\n modelUrl.hash = srcUrl.hash;\n }\n }\n if (this.arScale === 'fixed') {\n if (modelUrl.hash) {\n modelUrl.hash += '&';\n }\n modelUrl.hash += 'allowsContentScaling=0';\n }\n const anchor = this[$arAnchor];\n anchor.setAttribute('rel', 'ar');\n const img = document.createElement('img');\n anchor.appendChild(img);\n anchor.setAttribute('href', modelUrl.toString());\n if (generateUsdz) {\n anchor.setAttribute('download', 'model.usdz');\n }\n // attach anchor to shadow DOM to ensure iOS16 ARQL banner click message\n // event propagation\n anchor.style.display = 'none';\n if (!anchor.isConnected)\n this.shadowRoot.appendChild(anchor);\n console.log('Attempting to present in AR with Quick Look...');\n anchor.click();\n anchor.removeChild(img);\n if (generateUsdz) {\n URL.revokeObjectURL(objectURL);\n }\n this[$arButtonContainer].classList.add('enabled');\n }\n async prepareUSDZ() {\n const updateSourceProgress = this[$progressTracker].beginActivity('usdz-conversion');\n await this[$triggerLoad]();\n const { model, shadow, target } = this[$scene];\n if (model == null) {\n return '';\n }\n let visible = false;\n // Remove shadow from export\n if (shadow != null) {\n visible = shadow.visible;\n shadow.visible = false;\n }\n updateSourceProgress(0.2);\n const exporter = new USDZExporter();\n target.remove(model);\n model.position.copy(target.position);\n model.updateWorldMatrix(false, true);\n const arraybuffer = await exporter.parseAsync(model, {\n maxTextureSize: isNaN(this.arUsdzMaxTextureSize) ?\n Infinity :\n Math.max(parseInt(this.arUsdzMaxTextureSize), 16),\n });\n model.position.set(0, 0, 0);\n target.add(model);\n const blob = new Blob([arraybuffer], {\n type: 'model/vnd.usdz+zip',\n });\n const url = URL.createObjectURL(blob);\n updateSourceProgress(1);\n if (shadow != null) {\n shadow.visible = visible;\n }\n return url;\n }\n }\n __decorate([\n property({ type: Boolean, attribute: 'ar' })\n ], ARModelViewerElement.prototype, \"ar\", void 0);\n __decorate([\n property({ type: String, attribute: 'ar-scale' })\n ], ARModelViewerElement.prototype, \"arScale\", void 0);\n __decorate([\n property({ type: String, attribute: 'ar-usdz-max-texture-size' })\n ], ARModelViewerElement.prototype, \"arUsdzMaxTextureSize\", void 0);\n __decorate([\n property({ type: String, attribute: 'ar-placement' })\n ], ARModelViewerElement.prototype, \"arPlacement\", void 0);\n __decorate([\n property({ type: String, attribute: 'ar-modes' })\n ], ARModelViewerElement.prototype, \"arModes\", void 0);\n __decorate([\n property({ type: String, attribute: 'ios-src' })\n ], ARModelViewerElement.prototype, \"iosSrc\", void 0);\n __decorate([\n property({ type: Boolean, attribute: 'xr-environment' })\n ], ARModelViewerElement.prototype, \"xrEnvironment\", void 0);\n return ARModelViewerElement;\n};\n//# sourceMappingURL=ar.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { Vector3 } from 'three';\nimport { $altDefaulted, $announceModelVisibility, $getModelIsVisible, $isElementInViewport, $progressTracker, $scene, $shouldAttemptPreload, $updateSource, $userInputElement, toVector3D } from '../model-viewer-base.js';\nimport { $loader, CachingGLTFLoader } from '../three-components/CachingGLTFLoader.js';\nimport { Renderer } from '../three-components/Renderer.js';\nimport { throttle } from '../utilities.js';\nexport const PROGRESS_BAR_UPDATE_THRESHOLD = 100;\nconst DEFAULT_DRACO_DECODER_LOCATION = 'https://www.gstatic.com/draco/versioned/decoders/1.5.6/';\nconst DEFAULT_KTX2_TRANSCODER_LOCATION = 'https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/';\nconst DEFAULT_LOTTIE_LOADER_LOCATION = 'https://cdn.jsdelivr.net/npm/three@0.149.0/examples/jsm/loaders/LottieLoader.js';\nconst RevealStrategy = {\n AUTO: 'auto',\n MANUAL: 'manual'\n};\nconst LoadingStrategy = {\n AUTO: 'auto',\n LAZY: 'lazy',\n EAGER: 'eager'\n};\nexport const $defaultProgressBarElement = Symbol('defaultProgressBarElement');\nexport const $posterContainerElement = Symbol('posterContainerElement');\nexport const $defaultPosterElement = Symbol('defaultPosterElement');\nconst $shouldDismissPoster = Symbol('shouldDismissPoster');\nconst $hidePoster = Symbol('hidePoster');\nconst $modelIsRevealed = Symbol('modelIsRevealed');\nconst $updateProgressBar = Symbol('updateProgressBar');\nconst $ariaLabelCallToAction = Symbol('ariaLabelCallToAction');\nconst $onProgress = Symbol('onProgress');\n/**\n * LoadingMixin implements features related to lazy loading, as well as\n * presentation details related to the pre-load / pre-render presentation of a\n * \n *\n * This mixin implements support for models with DRACO-compressed meshes.\n * The DRACO decoder will be loaded on-demand if a glTF that uses the DRACO mesh\n * compression extension is encountered.\n *\n * By default, the DRACO decoder will be loaded from a Google CDN. It is\n * possible to customize where the decoder is loaded from by defining a global\n * configuration option for `` like so:\n *\n * ```html\n * \n * ```\n *\n * Note that the above configuration strategy must be performed *before* the\n * first `` element is created in the browser. The configuration\n * can be done anywhere, but the easiest way to ensure it is done at the right\n * time is to do it in the `` of the HTML document. This is the\n * recommended way to set the location because it is most compatible with\n * scenarios where the `` library is lazily loaded.\n *\n * If you absolutely have to set the DRACO decoder location *after* the first\n * `` element is created, you can do it this way:\n *\n * ```html\n * \n * ```\n *\n * Note that the above configuration approach will not work until *after*\n * `` is defined in the browser. Also note that this configuration\n * *must* be set *before* the first DRACO model is fully loaded.\n *\n * It is recommended that users who intend to take advantage of DRACO mesh\n * compression consider whether or not it is acceptable for their use case to\n * have code side-loaded from a Google CDN. If it is not acceptable, then the\n * location must be customized before loading any DRACO models in order to cause\n * the decoder to be loaded from an alternative, acceptable location.\n */\nexport const LoadingMixin = (ModelViewerElement) => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n class LoadingModelViewerElement extends ModelViewerElement {\n static set dracoDecoderLocation(value) {\n CachingGLTFLoader.setDRACODecoderLocation(value);\n }\n static get dracoDecoderLocation() {\n return CachingGLTFLoader.getDRACODecoderLocation();\n }\n static set ktx2TranscoderLocation(value) {\n CachingGLTFLoader.setKTX2TranscoderLocation(value);\n }\n static get ktx2TranscoderLocation() {\n return CachingGLTFLoader.getKTX2TranscoderLocation();\n }\n static set meshoptDecoderLocation(value) {\n CachingGLTFLoader.setMeshoptDecoderLocation(value);\n }\n static get meshoptDecoderLocation() {\n return CachingGLTFLoader.getMeshoptDecoderLocation();\n }\n static set lottieLoaderLocation(value) {\n Renderer.singleton.textureUtils.lottieLoaderUrl = value;\n }\n static get lottieLoaderLocation() {\n return Renderer.singleton.textureUtils.lottieLoaderUrl;\n }\n /**\n * If provided, the callback will be passed each resource URL before a\n * request is sent. The callback may return the original URL, or a new URL\n * to override loading behavior. This behavior can be used to load assets\n * from .ZIP files, drag-and-drop APIs, and Data URIs.\n */\n static mapURLs(callback) {\n Renderer.singleton.loader[$loader].manager.setURLModifier(callback);\n }\n /**\n * Dismisses the poster, causing the model to load and render if\n * necessary. This is currently effectively the same as interacting with\n * the poster via user input.\n */\n dismissPoster() {\n if (this.loaded) {\n this[$hidePoster]();\n }\n else {\n this[$shouldDismissPoster] = true;\n this[$updateSource]();\n }\n }\n /**\n * Displays the poster, hiding the 3D model. If this is called after the 3D\n * model has been revealed, then it must be dismissed by a call to\n * dismissPoster().\n */\n showPoster() {\n const posterContainerElement = this[$posterContainerElement];\n if (posterContainerElement.classList.contains('show')) {\n return;\n }\n posterContainerElement.classList.add('show');\n this[$userInputElement].classList.remove('show');\n const defaultPosterElement = this[$defaultPosterElement];\n defaultPosterElement.removeAttribute('tabindex');\n defaultPosterElement.removeAttribute('aria-hidden');\n const oldVisibility = this.modelIsVisible;\n this[$modelIsRevealed] = false;\n this[$announceModelVisibility](oldVisibility);\n }\n /**\n * Returns the model's bounding box dimensions in meters, independent of\n * turntable rotation.\n */\n getDimensions() {\n return toVector3D(this[$scene].size);\n }\n getBoundingBoxCenter() {\n return toVector3D(this[$scene].boundingBox.getCenter(new Vector3()));\n }\n constructor(...args) {\n super(...args);\n /**\n * A URL pointing to the image to use as a poster in scenarios where the\n * is not ready to reveal a rendered model to the viewer.\n */\n this.poster = null;\n /**\n * An enumerable attribute describing under what conditions the\n * should reveal a model to the viewer.\n *\n * The default value is \"auto\". The only supported alternative values is\n * \"manual\".\n */\n this.reveal = RevealStrategy.AUTO;\n /**\n * An enumerable attribute describing under what conditions the\n * should preload a model.\n *\n * The default value is \"auto\". The only supported alternative values are\n * \"lazy\" and \"eager\". Auto is equivalent to lazy, which loads the model\n * when it is near the viewport for reveal = \"auto\", and when interacted\n * with for reveal = \"interaction\". Eager loads the model immediately.\n */\n this.loading = LoadingStrategy.AUTO;\n this[_a] = false;\n this[_b] = false;\n // TODO: Add this to the shadow root as part of this mixin's\n // implementation:\n this[_c] = this.shadowRoot.querySelector('.slot.poster');\n this[_d] = this.shadowRoot.querySelector('#default-poster');\n this[_e] = this.shadowRoot.querySelector('#default-progress-bar > .bar');\n this[_f] = this[$defaultPosterElement].getAttribute('aria-label');\n this[_g] = throttle((progress) => {\n const parentNode = this[$defaultProgressBarElement].parentNode;\n requestAnimationFrame(() => {\n this[$defaultProgressBarElement].style.transform =\n `scaleX(${progress})`;\n if (progress === 0) {\n // NOTE(cdata): We remove and re-append the progress bar in this\n // condition so that the progress bar does not appear to\n // transition backwards from the right when we reset to 0 (or\n // otherwise <1) progress after having already reached 1 progress\n // previously.\n parentNode.removeChild(this[$defaultProgressBarElement]);\n parentNode.appendChild(this[$defaultProgressBarElement]);\n }\n this[$defaultProgressBarElement].classList.toggle('hide', progress === 1.0);\n });\n }, PROGRESS_BAR_UPDATE_THRESHOLD);\n this[_h] = (event) => {\n const progress = event.detail.totalProgress;\n const reason = event.detail.reason;\n if (progress === 1.0) {\n this[$updateProgressBar].flush();\n if (this.loaded &&\n (this[$shouldDismissPoster] ||\n this.reveal === RevealStrategy.AUTO)) {\n this[$hidePoster]();\n }\n }\n this[$updateProgressBar](progress);\n this.dispatchEvent(new CustomEvent('progress', { detail: { totalProgress: progress, reason } }));\n };\n const ModelViewerElement = self.ModelViewerElement || {};\n const dracoDecoderLocation = ModelViewerElement.dracoDecoderLocation ||\n DEFAULT_DRACO_DECODER_LOCATION;\n CachingGLTFLoader.setDRACODecoderLocation(dracoDecoderLocation);\n const ktx2TranscoderLocation = ModelViewerElement.ktx2TranscoderLocation ||\n DEFAULT_KTX2_TRANSCODER_LOCATION;\n CachingGLTFLoader.setKTX2TranscoderLocation(ktx2TranscoderLocation);\n if (ModelViewerElement.meshoptDecoderLocation) {\n CachingGLTFLoader.setMeshoptDecoderLocation(ModelViewerElement.meshoptDecoderLocation);\n }\n const lottieLoaderLocation = ModelViewerElement.lottieLoaderLocation ||\n DEFAULT_LOTTIE_LOADER_LOCATION;\n Renderer.singleton.textureUtils.lottieLoaderUrl = lottieLoaderLocation;\n }\n connectedCallback() {\n super.connectedCallback();\n if (!this.loaded) {\n this.showPoster();\n }\n this[$progressTracker].addEventListener('progress', this[$onProgress]);\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this[$progressTracker].removeEventListener('progress', this[$onProgress]);\n }\n async updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('poster') && this.poster != null) {\n this[$defaultPosterElement].style.backgroundImage =\n `url(${this.poster})`;\n }\n if (changedProperties.has('alt')) {\n this[$defaultPosterElement].setAttribute('aria-label', this[$altDefaulted]);\n }\n if (changedProperties.has('reveal') || changedProperties.has('loading')) {\n this[$updateSource]();\n }\n }\n [(_a = $modelIsRevealed, _b = $shouldDismissPoster, _c = $posterContainerElement, _d = $defaultPosterElement, _e = $defaultProgressBarElement, _f = $ariaLabelCallToAction, _g = $updateProgressBar, _h = $onProgress, $shouldAttemptPreload)]() {\n return !!this.src &&\n (this[$shouldDismissPoster] ||\n this.loading === LoadingStrategy.EAGER ||\n (this.reveal === RevealStrategy.AUTO && this[$isElementInViewport]));\n }\n [$hidePoster]() {\n this[$shouldDismissPoster] = false;\n const posterContainerElement = this[$posterContainerElement];\n if (!posterContainerElement.classList.contains('show')) {\n return;\n }\n posterContainerElement.classList.remove('show');\n this[$userInputElement].classList.add('show');\n const oldVisibility = this.modelIsVisible;\n this[$modelIsRevealed] = true;\n this[$announceModelVisibility](oldVisibility);\n const root = this.getRootNode();\n // If the is still focused, forward the focus to\n // the canvas that has just been revealed\n if (root && root.activeElement === this) {\n this[$userInputElement].focus();\n }\n // Ensure that the poster is no longer focusable or visible to\n // screen readers\n const defaultPosterElement = this[$defaultPosterElement];\n defaultPosterElement.setAttribute('aria-hidden', 'true');\n defaultPosterElement.tabIndex = -1;\n this.dispatchEvent(new CustomEvent('poster-dismissed'));\n }\n [$getModelIsVisible]() {\n return super[$getModelIsVisible]() && this[$modelIsRevealed];\n }\n }\n __decorate([\n property({ type: String })\n ], LoadingModelViewerElement.prototype, \"poster\", void 0);\n __decorate([\n property({ type: String })\n ], LoadingModelViewerElement.prototype, \"reveal\", void 0);\n __decorate([\n property({ type: String })\n ], LoadingModelViewerElement.prototype, \"loading\", void 0);\n return LoadingModelViewerElement;\n};\n//# sourceMappingURL=loading.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { property } from 'lit/decorators.js';\nimport { style } from '../decorators.js';\nimport { $getModelIsVisible, $renderer, $scene, $tick } from '../model-viewer-base.js';\nimport { degreesToRadians } from '../styles/conversions.js';\nimport { numberNode } from '../styles/parsers.js';\n// How much the model will rotate per\n// second in radians:\nconst DEFAULT_ROTATION_SPEED = Math.PI / 32;\nexport const AUTO_ROTATE_DELAY_DEFAULT = 3000;\nconst rotationRateIntrinsics = {\n basis: [degreesToRadians(numberNode(DEFAULT_ROTATION_SPEED, 'rad'))],\n keywords: { auto: [null] }\n};\nconst $autoRotateStartTime = Symbol('autoRotateStartTime');\nconst $radiansPerSecond = Symbol('radiansPerSecond');\nconst $syncRotationRate = Symbol('syncRotationRate');\nconst $onCameraChange = Symbol('onCameraChange');\nexport const StagingMixin = (ModelViewerElement) => {\n var _a, _b, _c;\n class StagingModelViewerElement extends ModelViewerElement {\n constructor() {\n super(...arguments);\n this.autoRotate = false;\n this.autoRotateDelay = AUTO_ROTATE_DELAY_DEFAULT;\n this.rotationPerSecond = 'auto';\n this[_a] = performance.now();\n this[_b] = 0;\n this[_c] = (event) => {\n if (!this.autoRotate) {\n return;\n }\n if (event.detail.source === 'user-interaction') {\n this[$autoRotateStartTime] = performance.now();\n }\n };\n }\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('camera-change', this[$onCameraChange]);\n this[$autoRotateStartTime] = performance.now();\n }\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('camera-change', this[$onCameraChange]);\n this[$autoRotateStartTime] = performance.now();\n }\n updated(changedProperties) {\n super.updated(changedProperties);\n if (changedProperties.has('autoRotate')) {\n this[$autoRotateStartTime] = performance.now();\n }\n }\n [(_a = $autoRotateStartTime, _b = $radiansPerSecond, $syncRotationRate)](style) {\n this[$radiansPerSecond] = style[0];\n }\n [$tick](time, delta) {\n super[$tick](time, delta);\n if (!this.autoRotate || !this[$getModelIsVisible]() ||\n this[$renderer].isPresenting) {\n return;\n }\n const rotationDelta = Math.min(delta, time - this[$autoRotateStartTime] - this.autoRotateDelay);\n if (rotationDelta > 0) {\n this[$scene].yaw = this.turntableRotation +\n this[$radiansPerSecond] * rotationDelta * 0.001;\n }\n }\n get turntableRotation() {\n return this[$scene].yaw;\n }\n resetTurntableRotation(theta = 0) {\n this[$scene].yaw = theta;\n }\n }\n _c = $onCameraChange;\n __decorate([\n property({ type: Boolean, attribute: 'auto-rotate' })\n ], StagingModelViewerElement.prototype, \"autoRotate\", void 0);\n __decorate([\n property({ type: Number, attribute: 'auto-rotate-delay' })\n ], StagingModelViewerElement.prototype, \"autoRotateDelay\", void 0);\n __decorate([\n style({ intrinsics: rotationRateIntrinsics, updateHandler: $syncRotationRate }),\n property({ type: String, attribute: 'rotation-per-second' })\n ], StagingModelViewerElement.prototype, \"rotationPerSecond\", void 0);\n return StagingModelViewerElement;\n};\n//# sourceMappingURL=staging.js.map","/* @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { AnimationMixin } from './features/animation.js';\nimport { AnnotationMixin } from './features/annotation.js';\nimport { ARMixin } from './features/ar.js';\nimport { ControlsMixin } from './features/controls.js';\nimport { EnvironmentMixin } from './features/environment.js';\nimport { LoadingMixin } from './features/loading.js';\nimport { SceneGraphMixin } from './features/scene-graph.js';\nimport { StagingMixin } from './features/staging.js';\nimport ModelViewerElementBase from './model-viewer-base.js';\n// Export these to allow lazy-loaded LottieLoader.js to find what it needs.\n// Requires an import map - \"three\": \"path/to/model-viewer.min.js\".\nexport { CanvasTexture, FileLoader, Loader, NearestFilter } from 'three';\nexport const ModelViewerElement = AnnotationMixin(SceneGraphMixin(StagingMixin(EnvironmentMixin(ControlsMixin(ARMixin(LoadingMixin(AnimationMixin(ModelViewerElementBase))))))));\ncustomElements.define('model-viewer', ModelViewerElement);\n//# sourceMappingURL=model-viewer.js.map"],"names":["global","issueWarning","trustedTypes","polyfillSupport","debugLogEvent","JSCompiler_renameProperty","defaultPropertyDeclaration","clamp","lerp","Texture","_m1$1","Material","_m1","_identityMatrix","Node","MAX_SAMPLES","__decorate","this","_taskCache","GLTFMaterialsClearcoatExtension","GLTFMaterialsDispersionExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsAnisotropyExtension","GLTFMaterialsBumpExtension","GLTFMeshGpuInstancing","GLTFMaterialsUnlitExtension","WEBGL_CONSTANTS","PATH_PROPERTIES","g","C","te","KHR_DF_FLAG_ALPHA_PREMULTIPLIED","read","VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT","VK_FORMAT_UNDEFINED","VK_FORMAT_R32G32B32A32_SFLOAT","VK_FORMAT_R16G16B16A16_SFLOAT","VK_FORMAT_R8G8B8A8_UNORM","VK_FORMAT_R8G8B8A8_SRGB","VK_FORMAT_R32G32_SFLOAT","VK_FORMAT_R16G16_SFLOAT","VK_FORMAT_R8G8_UNORM","VK_FORMAT_R8G8_SRGB","VK_FORMAT_R32_SFLOAT","VK_FORMAT_R16_SFLOAT","VK_FORMAT_R8_SRGB","VK_FORMAT_R8_UNORM","VK_FORMAT_ASTC_6x6_SRGB_BLOCK","VK_FORMAT_ASTC_6x6_UNORM_BLOCK","KHR_SUPERCOMPRESSION_ZSTD","ZSTDDecoder","KHR_SUPERCOMPRESSION_NONE","KHR_DF_PRIMARIES_BT709","KHR_DF_TRANSFER_SRGB","KHR_DF_PRIMARIES_DISPLAYP3","KHR_DF_PRIMARIES_UNSPECIFIED","_a","_b","vector2","_c","_d","vector3","SkeletonUtils.clone","$onUpdate","$threeTexture","$threeTextures","Image","$materials","_e","_f","ModelViewerTexture"],"mappings":"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AAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,E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CA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,OAAO;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,SAAS;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,SAAS;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI;;AAE9B;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,KAAK;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,qBAAqB,GAAG,KAAK;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC;;AAEvB;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,KAAK,GAAG;;AAEb,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;;AAEzB;;AAEA,CAAC,IAAI,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG;;AAE3B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK;;AAE1B;;AAEA;AACA;AACA;AACA;AACA,CAAC,YAAY,GAAG;;AAEhB,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;;AAEvI;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE;;AAE5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,MAAM,GAAG;;AAEhB,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;;AAEzB,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC7B,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;;AAE1C,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAC/B,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;;AAE/B,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;AAC3B,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;;AAE3B,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnC,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;;AAEnC,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;;AAErC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC7B,EAAE,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc;AAC7C,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;;AAEzB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;AACnC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;AACnC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;AACnC,EAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;;AAEjC,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB;AACjD,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;;AAEnC,EAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe;AAC/C,EAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB;AACjD,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;AAC3B,EAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe;AAC/C,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;;AAErC,EAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;AACzC,EAAE,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,qBAAqB;;AAE3D,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE;;AAEjE,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI;;AAEzB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,IAAI,GAAG;;AAEhB,EAAE,MAAM,YAAY,KAAK,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;;AAEzE,EAAE,KAAK,EAAE,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,GAAG;;AAEpE,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE;;AAEpC;;AAEA,EAAE,MAAM,MAAM,GAAG;;AAEjB,GAAG,QAAQ,EAAE;AACb,IAAI,OAAO,EAAE,GAAG;AAChB,IAAI,IAAI,EAAE,SAAS;AACnB,IAAI,SAAS,EAAE;AACf,IAAI;;AAEJ,GAAG,IAAI,EAAE,IAAI,CAAC,IAAI;AAClB,GAAG,IAAI,EAAE,IAAI,CAAC,IAAI;;AAElB,GAAG,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI;;AAEzC,GAAG,OAAO,EAAE,IAAI,CAAC,OAAO;AACxB,GAAG,OAAO,EAAE,IAAI,CAAC,OAAO;;AAExB,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;AAC3C,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;AAC3C,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;AAC3C,GAAG,QAAQ,EAAE,IAAI,CAAC,QAAQ;;AAE1B,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;;AAEnC,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM;AACtB,GAAG,cAAc,EAAE,IAAI,CAAC,cAAc;AACtC,GAAG,IAAI,EAAE,IAAI,CAAC,IAAI;AAClB,GAAG,UAAU,EAAE,IAAI,CAAC,UAAU;;AAE9B,GAAG,SAAS,EAAE,IAAI,CAAC,SAAS;AAC5B,GAAG,SAAS,EAAE,IAAI,CAAC,SAAS;AAC5B,GAAG,UAAU,EAAE,IAAI,CAAC,UAAU;;AAE9B,GAAG,KAAK,EAAE,IAAI,CAAC,KAAK;;AAEpB,GAAG,eAAe,EAAE,IAAI,CAAC,eAAe;AACxC,GAAG,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AAC1C,GAAG,eAAe,EAAE,IAAI,CAAC;;AAEzB,GAAG;;AAEH,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;;AAEhF,EAAE,KAAK,EAAE,YAAY,GAAG;;AAExB,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM;;AAEtC;;AAEA,EAAE,OAAO,MAAM;;AAEf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,GAAG;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;;AAE3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,EAAE,GAAG;;AAEnB,EAAE,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,GAAG,OAAO,EAAE;;AAE7C,EAAE,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE;;AAEhC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG;;AAE9B,GAAG,SAAS,IAAI,CAAC,KAAK;;AAEtB,IAAI,KAAK,cAAc;;AAEvB,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;AACrC,KAAK;;AAEL,IAAI,KAAK,mBAAmB;;AAE5B,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5B,KAAK;;AAEL,IAAI,KAAK,sBAAsB;;AAE/B,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG;;AAErD,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;;AAErC,MAAM,MAAM;;AAEZ,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;;AAEtC;;AAEA,KAAK;;AAEL;;AAEA;;AAEA,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG;;AAE9B,GAAG,SAAS,IAAI,CAAC,KAAK;;AAEtB,IAAI,KAAK,cAAc;;AAEvB,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;AACrC,KAAK;;AAEL,IAAI,KAAK,mBAAmB;;AAE5B,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5B,KAAK;;AAEL,IAAI,KAAK,sBAAsB;;AAE/B,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG;;AAErD,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;;AAErC,MAAM,MAAM;;AAEZ,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;;AAEtC;;AAEA,KAAK;;AAEL;;AAEA;;AAEA,EAAE,KAAK,IAAI,CAAC,KAAK,GAAG;;AAEpB,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;;AAElB;;AAEA,EAAE,OAAO,EAAE;;AAEX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,WAAW,EAAE,KAAK,GAAG;;AAE1B,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG;;AAExB,GAAG,IAAI,CAAC,OAAO,GAAG;AAClB,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,gBAAgB,EAAE,KAAK,GAAG;;AAE/B,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG;;AAExB,GAAG,IAAI,CAAC,YAAY,GAAG;;AAEvB;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACAE,SAAO,CAAC,aAAa,GAAG,IAAI;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACAA,SAAO,CAAC,eAAe,GAAG,SAAS;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACAA,SAAO,CAAC,kBAAkB,GAAG,CAAC;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,OAAO,CAAC;;AAEd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI;;AAEpC;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,KAAK,GAAG;;AAEb,EAAE,OAAO,IAAI,CAAC,CAAC;;AAEf;;AAEA,CAAC,IAAI,KAAK,EAAE,KAAK,GAAG;;AAEpB,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,MAAM,GAAG;;AAEd,EAAE,OAAO,IAAI,CAAC,CAAC;;AAEf;;AAEA,CAAC,IAAI,MAAM,EAAE,KAAK,GAAG;;AAErB,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEnB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;AACZ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;AACZ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;AACZ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,MAAM,GAAG;;AAErB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM;AACjB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM;AACjB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM;AACjB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM;;AAEjB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG;;AAE9B,EAAE,SAAS,KAAK;;AAEhB,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAC3B,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAC3B,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAC3B,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAC3B,GAAG,SAAS,MAAM,IAAI,KAAK,EAAE,yBAAyB,GAAG,KAAK,EAAE;;AAEhE;;AAEA,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,KAAK,GAAG;;AAEvB,EAAE,SAAS,KAAK;;AAEhB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AACxB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AACxB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AACxB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AACxB,GAAG,SAAS,MAAM,IAAI,KAAK,EAAE,yBAAyB,GAAG,KAAK,EAAE;;AAEhE;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;;AAE1C,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEf,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,CAAC,GAAG;;AAEhB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;;AAEb,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAEpB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEzB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;;AAEnB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEf,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,CAAC,GAAG;;AAEhB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;;AAEb,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAEpB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,QAAQ,EAAE,CAAC,GAAG;;AAEf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEf,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,MAAM,GAAG;;AAE1B,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM;AAClB,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM;AAClB,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM;AAClB,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM;;AAElB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,CAAC,GAAG;;AAEnB,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AACtD,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ;;AAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;AAC7D,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;AAC7D,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;AAC9D,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;;AAE9D,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,CAAC,GAAG;;AAEb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEf,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,MAAM,GAAG;;AAExB,EAAE,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,MAAM,EAAE;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B,EAAE,CAAC,GAAG;;AAEjC;;AAEA;;AAEA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;;AAE/B,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;AAEtC,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG;;AAEpB,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;AACb,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;AACb,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEb,GAAG,MAAM;;AAET,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACnB,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACnB,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;;AAEnB;;AAEA,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B,EAAE,CAAC,GAAG;;AAErC;;AAEA;;AAEA,EAAE,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACrB,EAAE,MAAM,OAAO,GAAG,IAAI;AACtB,GAAG,QAAQ,GAAG,GAAG;;AAEjB,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ;;AAElB,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;AAC9C,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;AAC9C,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;;AAE/C,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO;AACxC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE;AAC1C,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG;;AAE7C;AACA;AACA;;AAEA,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ;AAC1C,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE;AAC5C,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE;AAC5C,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG;;AAEzD;;AAEA,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;AAE1B,IAAI,OAAO,IAAI,CAAC;;AAEhB;;AAEA;;AAEA,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE;;AAElB,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;AAC7B,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;AAC7B,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;AAC7B,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC/B,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC/B,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;;AAE/B,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,GAAG;;AAErC;;AAEA,IAAI,KAAK,EAAE,GAAG,OAAO,GAAG;;AAExB,KAAK,CAAC,GAAG,CAAC;AACV,KAAK,CAAC,GAAG,WAAW;AACpB,KAAK,CAAC,GAAG,WAAW;;AAEpB,KAAK,MAAM;;AAEX,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE;AACxB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;AACf,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;;AAEf;;AAEA,IAAI,MAAM,KAAK,EAAE,GAAG,EAAE,GAAG;;AAEzB;;AAEA,IAAI,KAAK,EAAE,GAAG,OAAO,GAAG;;AAExB,KAAK,CAAC,GAAG,WAAW;AACpB,KAAK,CAAC,GAAG,CAAC;AACV,KAAK,CAAC,GAAG,WAAW;;AAEpB,KAAK,MAAM;;AAEX,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE;AACxB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;AACf,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;;AAEf;;AAEA,IAAI,MAAM;;AAEV;;AAEA,IAAI,KAAK,EAAE,GAAG,OAAO,GAAG;;AAExB,KAAK,CAAC,GAAG,WAAW;AACpB,KAAK,CAAC,GAAG,WAAW;AACpB,KAAK,CAAC,GAAG,CAAC;;AAEV,KAAK,MAAM;;AAEX,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE;AACxB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;AACf,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;;AAEf;;AAEA;;AAEA,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;;AAE7B,GAAG,OAAO,IAAI,CAAC;;AAEf;;AAEA;;AAEA,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,EAAE;AAClD,GAAG,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,EAAE;AAChC,GAAG,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC;;AAEnC,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC;;AAEpC;AACA;;AAEA,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC5B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC5B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC5B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE;;AAEnD,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,qBAAqB,EAAE,CAAC,GAAG;;AAE5B,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ;;AAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE;AAClB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE;AAClB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE;AAClB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE;;AAElB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;AAElC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;AAElC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG;;AAEnB;;AAEA,EAAE,IAAI,CAAC,CAAC,GAAGF,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACxC,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACxC,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACxC,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;;AAExC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG;;AAE/B,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;AAC1C,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;AAC1C,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;AAC1C,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;;AAE1C,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG;;AAEzB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;;AAE9B,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,EAAEA,OAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;;AAErF;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE/B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,GAAG;;AAER,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE;AAC9B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE;AAC9B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE;AAC9B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE9B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE/B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,GAAG;;AAEf,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE/B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;AAEnB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAElE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,QAAQ,GAAG;;AAEZ,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;;AAE9E;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE;;AAE3F;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,GAAG;;AAEnB,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE1F;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,GAAG;;AAEb,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;;AAEhD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,MAAM,GAAG;;AAErB,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE;;AAElD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,GAAG;;AAElB,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK;AACpC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK;AACpC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK;AACpC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK;;AAEpC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG;;AAE9B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;AACzC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;AACzC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;AACzC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;;AAEzC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,CAAC,GAAG;;AAEb,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE;;AAE/F;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG;;AAEhC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE;AAC1B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE;AAC9B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE;AAC9B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE;;AAE9B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG;;AAEnC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AAC1B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;AAC9B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;AAC9B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;;AAE9B,EAAE,OAAO,KAAK;;AAEd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,mBAAmB,EAAE,SAAS,EAAE,KAAK,GAAG;;AAEzC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;;AAElC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;;AAExB,EAAE,OAAO,IAAI;;AAEb;;AAEA,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG;;AAExB,EAAE,MAAM,IAAI,CAAC,CAAC;AACd,EAAE,MAAM,IAAI,CAAC,CAAC;AACd,EAAE,MAAM,IAAI,CAAC,CAAC;AACd,EAAE,MAAM,IAAI,CAAC,CAAC;;AAEd;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM,YAAY,SAAS,eAAe,CAAC;;AAE3C,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,GAAG;;AAEpD,EAAE,KAAK,EAAE;;AAET,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI;;AAE5B,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK;AACpB,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM;AACtB,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;;AAEhB,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;AACnD,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK;;AAE1B,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;;AAEpD,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;;AAE1D,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE;AAC3B,GAAG,eAAe,EAAE,KAAK;AACzB,GAAG,cAAc,EAAE,IAAI;AACvB,GAAG,SAAS,EAAE,YAAY;AAC1B,GAAG,WAAW,EAAE,IAAI;AACpB,GAAG,aAAa,EAAE,KAAK;AACvB,GAAG,kBAAkB,EAAE,IAAI;AAC3B,GAAG,oBAAoB,EAAE,IAAI;AAC7B,GAAG,YAAY,EAAE,IAAI;AACrB,GAAG,OAAO,EAAE,CAAC;AACb,GAAG,KAAK,EAAE;AACV,GAAG,EAAE,OAAO,EAAE;;AAEd,EAAE,MAAM,OAAO,GAAG,IAAIE,SAAO,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE;;AAEjM,EAAE,OAAO,CAAC,KAAK,GAAG,KAAK;AACvB,EAAE,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe;AACnD,EAAE,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc;;AAEjD,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE;;AAEpB,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;AAC7B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG;;AAErC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE;AACvC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,qBAAqB,GAAG,IAAI;AAClD,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,YAAY,GAAG,IAAI;;AAEzC;;AAEA,EAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW;AACxC,EAAE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa;;AAE5C,EAAE,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB;AACtD,EAAE,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB;;AAE1D,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI;AAC3B,EAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY;;AAE1C,EAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;;AAEhC;;AAEA,CAAC,IAAI,OAAO,GAAG;;AAEf,EAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE;;AAE3B;;AAEA,CAAC,IAAI,OAAO,EAAE,KAAK,GAAG;;AAEtB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,KAAK;;AAE5B;;AAEA,CAAC,IAAI,YAAY,EAAE,OAAO,GAAG;;AAE7B,EAAE,KAAK,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI;AAC3E,EAAE,KAAK,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI;;AAErD,EAAE,IAAI,CAAC,aAAa,GAAG,OAAO;;AAE9B;;AAEA,CAAC,IAAI,YAAY,GAAG;;AAEpB,EAAE,OAAO,IAAI,CAAC,aAAa;;AAE3B;;AAEA,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG;;AAErC,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,GAAG;;AAEhF,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK;AACrB,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM;AACvB,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK;;AAErB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;AAE9D,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK;AAC1C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC5C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK;;AAE1C;;AAEA,GAAG,IAAI,CAAC,OAAO,EAAE;;AAEjB;;AAEA,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;AAC1C,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;;AAEzC;;AAEA,CAAC,KAAK,GAAG;;AAET,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE;;AAE5C;;AAEA,CAAC,IAAI,EAAE,MAAM,GAAG;;AAEhB,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;AAC3B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC7B,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;;AAE3B,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE;AACrC,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;;AAEvC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;;AAEvC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;;AAE1B,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;AAE/D,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;AACpD,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,qBAAqB,GAAG,IAAI;AAClD,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,YAAY,GAAG,IAAI;;AAEzC;;AAEA,GAAG,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;AAChE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,KAAK,EAAE;;AAElD;;AAEA,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;AACvC,EAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa;;AAE3C,EAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB;AACrD,EAAE,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB;;AAEzD,EAAE,KAAK,MAAM,CAAC,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE;;AAErF,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;;AAE/B,EAAE,OAAO,IAAI;;AAEb;;AAEA,CAAC,OAAO,GAAG;;AAEX,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;;AAE3C;;AAEA;;AAEA,MAAM,iBAAiB,SAAS,YAAY,CAAC;;AAE7C,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,GAAG;;AAEpD,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;;AAEjC,EAAE,IAAI,CAAC,mBAAmB,GAAG,IAAI;;AAEjC;;AAEA;;AAEA,MAAM,gBAAgB,SAASA,SAAO,CAAC;;AAEvC,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG;;AAE9D,EAAE,KAAK,EAAE,IAAI,EAAE;;AAEf,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI;;AAEhC,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;;AAE7C,EAAE,IAAI,CAAC,SAAS,GAAG,aAAa;AAChC,EAAE,IAAI,CAAC,SAAS,GAAG,aAAa;;AAEhC,EAAE,IAAI,CAAC,KAAK,GAAG,mBAAmB;;AAElC,EAAE,IAAI,CAAC,eAAe,GAAG,KAAK;AAC9B,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK;AACpB,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC;;AAE1B,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE;;AAE/B;;AAEA,CAAC,cAAc,EAAE,UAAU,GAAG;;AAE9B,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE;;AAErC;;AAEA,CAAC,iBAAiB,GAAG;;AAErB,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;;AAE3B;;AAEA;;AAoBA,MAAM,aAAa,SAASA,SAAO,CAAC;;AAEpC,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG;;AAE9D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE,KAAK,EAAE,IAAI,EAAE;;AAEf,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI;;AAE7B,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;;AAE7C,EAAE,IAAI,CAAC,SAAS,GAAG,aAAa;AAChC,EAAE,IAAI,CAAC,SAAS,GAAG,aAAa;;AAEhC,EAAE,IAAI,CAAC,KAAK,GAAG,mBAAmB;;AAElC,EAAE,IAAI,CAAC,eAAe,GAAG,KAAK;AAC9B,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK;AACpB,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC;;AAE1B;;AAEA;;AAoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,CAAC;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI;;AAE1B,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;AACb,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;AACb,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;AACb,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,GAAG;;AAE3E;;AAEA,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AACjC,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AAC9B,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AAC9B,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;;AAE9B,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AACnC,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AAC9B,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AAC9B,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;;AAE9B,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;;AAEjB,GAAG,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC5B,GAAG,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC5B,GAAG,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC5B,GAAG,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC5B,GAAG;;AAEH;;AAEA,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;;AAEjB,GAAG,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC5B,GAAG,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC5B,GAAG,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC5B,GAAG,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC5B,GAAG;;AAEH;;AAEA,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG;;AAE1D,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAChB,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACpD,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE;AAC/B,IAAI,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG;;AAE1B;AACA,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG;;AAElC,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE;AACnC,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;;AAEvC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG;AACjC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG;;AAEjC;;AAEA,GAAG,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG;;AAEvB,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;AAC1B,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;AAC1B,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;AAC1B,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;;AAE1B;AACA,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;;AAEtB,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;;AAEpE,IAAI,EAAE,IAAI,CAAC;AACX,IAAI,EAAE,IAAI,CAAC;AACX,IAAI,EAAE,IAAI,CAAC;AACX,IAAI,EAAE,IAAI,CAAC;;AAEX;;AAEA;;AAEA,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE;AACvB,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC3B,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;AAC3B,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE;;AAE3B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,uBAAuB,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG;;AAEtF,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE;AAC/B,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AACnC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AACnC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;;AAEnC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE;AAC/B,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AACnC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;AACnC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE;;AAEnC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC1D,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC9D,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC9D,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;;AAE9D,EAAE,OAAO,GAAG;;AAEZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,CAAC,GAAG;;AAET,EAAE,OAAO,IAAI,CAAC,EAAE;;AAEhB;;AAEA,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG;;AAEhB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK;AACjB,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,CAAC,GAAG;;AAET,EAAE,OAAO,IAAI,CAAC,EAAE;;AAEhB;;AAEA,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG;;AAEhB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK;AACjB,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,CAAC,GAAG;;AAET,EAAE,OAAO,IAAI,CAAC,EAAE;;AAEhB;;AAEA,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG;;AAEhB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK;AACjB,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,CAAC,GAAG;;AAET,EAAE,OAAO,IAAI,CAAC,EAAE;;AAEhB;;AAEA,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG;;AAEhB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK;AACjB,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEnB,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;AACb,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;AACb,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;AACb,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;;AAEb,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;;AAEnE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,UAAU,GAAG;;AAEpB,EAAE,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;AACxB,EAAE,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;AACxB,EAAE,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;AACxB,EAAE,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;;AAExB,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG;;AAEtC,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM;;AAEtE;AACA;AACA;;AAEA,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;AACtB,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;;AAEtB,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;AACzB,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;AACzB,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;;AAEzB,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;AACzB,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;AACzB,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;;AAEzB,EAAE,SAAS,KAAK;;AAEhB,GAAG,KAAK,KAAK;AACb,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI;;AAEJ,GAAG,KAAK,KAAK;AACb,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI;;AAEJ,GAAG,KAAK,KAAK;AACb,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI;;AAEJ,GAAG,KAAK,KAAK;AACb,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI;;AAEJ,GAAG,KAAK,KAAK;AACb,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI;;AAEJ,GAAG,KAAK,KAAK;AACb,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACzC,IAAI;;AAEJ,GAAG;AACH,IAAI,OAAO,CAAC,IAAI,EAAE,kEAAkE,GAAG,KAAK,EAAE;;AAE9F;;AAEA,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE;;AAEjD,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gBAAgB,EAAE,IAAI,EAAE,KAAK,GAAG;;AAEjC;;AAEA,EAAE,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE;;AAExD,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;AACtB,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;AACtB,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;AACtB,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE;;AAEjC,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,qBAAqB,EAAE,CAAC,GAAG;;AAE5B;;AAEA;;AAEA,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ;;AAEvB,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;AAC9C,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;AAC9C,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;;AAE/C,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;;AAE1B,EAAE,KAAK,KAAK,GAAG,CAAC,GAAG;;AAEnB,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,GAAG,EAAE;;AAE3C,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC;AACrB,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC9B,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC9B,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;;AAE9B,GAAG,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG;;AAEvC,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;;AAErD,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC9B,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC;AACrB,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC9B,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;;AAE9B,GAAG,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG;;AAE1B,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;;AAErD,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC9B,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC9B,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC;AACrB,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;;AAE9B,GAAG,MAAM;;AAET,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;;AAErD,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC9B,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC9B,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;AAC9B,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC;;AAErB;;AAEA,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAG,GAAG;;AAElC;;AAEA,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;;AAE9B,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,GAAG;;AAE5B;;AAEA,GAAG,CAAC,GAAG,CAAC;;AAER,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG;;AAEpD,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACvB,IAAI,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;AACrB,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC;AACf,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC;;AAEf,IAAI,MAAM;;AAEV,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC;AACf,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACvB,IAAI,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;AACrB,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC;;AAEf;;AAEA,GAAG,MAAM;;AAET;;AAEA,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAC9C,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAC9C,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAC9C,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;;AAEd;;AAEA,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE;;AAEzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,EAAE,CAAC,GAAG;;AAEd,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAEF,OAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;;AAEnE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,GAAG;;AAE1B,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE;;AAEjC,EAAE,KAAK,KAAK,KAAK,CAAC,GAAG,OAAO,IAAI;;AAEhC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE;;AAEvC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE;;AAEpB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,QAAQ,GAAG;;AAEZ,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;AAE/B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE;;AAEzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,GAAG;;AAEb,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AACf,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AACf,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;;AAEf,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;;AAE1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,QAAQ,GAAG;;AAEZ,EAAE,OAAO,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;;AAEtF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;;AAEnG;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,GAAG;;AAEb,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;;AAEvB,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;;AAEjB,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACd,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACd,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACd,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;;AAEd,GAAG,MAAM;;AAET,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;;AAEZ,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACxB,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACxB,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACxB,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;;AAExB;;AAEA,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,QAAQ,EAAE,CAAC,GAAG;;AAEf,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE;;AAE5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,CAAC,GAAG;;AAElB,EAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,EAAE,IAAI,EAAE;;AAE5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,GAAG;;AAE7B;;AAEA,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE;AACtD,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE;;AAEtD,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;;AAEzD,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG;;AAEhB,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI;AAC5B,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE;;AAEvC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;;AAE1D;;AAEA,EAAE,IAAI,YAAY,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE;;AAElE,EAAE,KAAK,YAAY,GAAG,CAAC,GAAG;;AAE1B,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE;AACpB,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE;AACpB,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE;AACpB,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE;;AAEpB,GAAG,YAAY,GAAG,EAAE,YAAY;;AAEhC,GAAG,MAAM;;AAET,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE;;AAElB;;AAEA,EAAE,KAAK,YAAY,IAAI,GAAG,GAAG;;AAE7B,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACd,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACd,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AACd,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;;AAEd,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,MAAM,eAAe,GAAG,GAAG,GAAG,YAAY,GAAG,YAAY;;AAE3D,EAAE,KAAK,eAAe,IAAI,MAAM,CAAC,OAAO,GAAG;;AAE3C,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;AAChC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;AAChC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;AAChC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;;AAEhC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;;AAEpB,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE;AACnD,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE;AAC5D,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,GAAG,YAAY;AACjE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,YAAY;;AAEpD,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE;AAC7C,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE;AAC7C,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE;AAC7C,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE;;AAE7C,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gBAAgB,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG;;AAE/B,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE;;AAEvC;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV;AACA;AACA;;AAEA,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5C,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;;AAE5C,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AAC1B,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;AAChC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE;;AAE5B,EAAE,OAAO,IAAI,CAAC,GAAG;AACjB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE;AAC1B,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE;AAC1B,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE;AAC1B,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE;AAC1B,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,UAAU,GAAG;;AAEtB,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,QAAQ,UAAU,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,MAAM,UAAU,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,MAAM,UAAU,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE;;AAEzI;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG;;AAEhC,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE;AAC3B,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE;;AAE/B,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG;;AAEnC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;AAC3B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;AAC/B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;AAC/B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;;AAE/B,EAAE,OAAO,KAAK;;AAEd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,mBAAmB,EAAE,SAAS,EAAE,KAAK,GAAG;;AAEzC,EAAE,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;AACnC,EAAE,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;AACnC,EAAE,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;AACnC,EAAE,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;;AAEnC,EAAE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE;;AAEvB;;AAEA,CAAC,SAAS,EAAE,QAAQ,GAAG;;AAEvB,EAAE,IAAI,CAAC,iBAAiB,GAAG,QAAQ;;AAEnC,EAAE,OAAO,IAAI;;AAEb;;AAEA,CAAC,iBAAiB,GAAG;;AAErB,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG;;AAExB,EAAE,MAAM,IAAI,CAAC,EAAE;AACf,EAAE,MAAM,IAAI,CAAC,EAAE;AACf,EAAE,MAAM,IAAI,CAAC,EAAE;AACf,EAAE,MAAM,IAAI,CAAC,EAAE;;AAEf;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,OAAO,CAAC;;AAEd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI;;AAEpC;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEhB,EAAE,KAAK,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;;AAEpC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;AACZ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;AACZ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,MAAM,GAAG;;AAErB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM;AACjB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM;AACjB,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM;;AAEjB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;;AAEZ,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG;;AAE9B,EAAE,SAAS,KAAK;;AAEhB,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAC3B,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAC3B,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAC3B,GAAG,SAAS,MAAM,IAAI,KAAK,EAAE,yBAAyB,GAAG,KAAK,EAAE;;AAEhE;;AAEA,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,KAAK,GAAG;;AAEvB,EAAE,SAAS,KAAK;;AAEhB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AACxB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AACxB,GAAG,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AACxB,GAAG,SAAS,MAAM,IAAI,KAAK,EAAE,yBAAyB,GAAG,KAAK,EAAE;;AAEhE;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE;;AAEvD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAEd,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEf,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,CAAC,GAAG;;AAEhB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;;AAEb,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAEpB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEzB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;;AAEnB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEf,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,CAAC,GAAG;;AAEhB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;;AAEb,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAEpB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,QAAQ,EAAE,CAAC,GAAG;;AAEf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEf,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,MAAM,GAAG;;AAE1B,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM;AAClB,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM;AAClB,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM;;AAElB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEzB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAEpB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,UAAU,EAAE,KAAK,GAAG;;AAErB,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE;;AAEpE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,GAAG;;AAE/B,EAAE,OAAO,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;;AAE9E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,CAAC,GAAG;;AAEnB,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1C,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ;;AAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;AAC/C,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;AAC/C,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;;AAE/C,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,iBAAiB,EAAE,CAAC,GAAG;;AAExB,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE;;AAE3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,CAAC,GAAG;;AAEnB,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1C,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ;;AAEtB,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE;;AAEnE,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC;AACjE,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC;AACjE,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC;;AAElE,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,CAAC,GAAG;;AAEtB;;AAEA,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;AAC7C,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;;AAE9C;AACA,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;AACtC,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;AACtC,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;;AAEtC;AACA,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC3C,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC3C,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;;AAE3C,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,EAAE,MAAM,GAAG;;AAEnB,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,gBAAgB,EAAE;;AAE/F;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,MAAM,GAAG;;AAErB,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,uBAAuB,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE;;AAE/F;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kBAAkB,EAAE,CAAC,GAAG;;AAEzB;AACA;;AAEA,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1C,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ;;AAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;AAC/C,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;AAC/C,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;;AAEhD,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE;;AAEzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,CAAC,GAAG;;AAEb,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACf,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEf,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,MAAM,GAAG;;AAExB,EAAE,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,MAAM,EAAE;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;AAElC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;AAElC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG;;AAEnB;;AAEA,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACxC,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACxC,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;;AAExC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG;;AAE/B,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;AAC1C,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;AAC1C,EAAE,IAAI,CAAC,CAAC,GAAGA,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;;AAE1C,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG;;AAEzB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;;AAE9B,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,EAAEA,OAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;;AAErF;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE/B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,GAAG;;AAER,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE;AAC9B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE;AAC9B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE9B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE/B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,GAAG;;AAEf,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;AAC/B,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE;;AAE/B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACnB,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;AAEnB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,CAAC,GAAG;;AAEV,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAEnD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,QAAQ,GAAG;;AAEZ,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;;AAE5D;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE;;AAEzE;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,GAAG;;AAEnB,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE;;AAErE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,GAAG;;AAEb,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;;AAEhD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,MAAM,GAAG;;AAErB,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE;;AAElD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,GAAG;;AAElB,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK;AACpC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK;AACpC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK;;AAEpC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG;;AAE9B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;AACzC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;AACzC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK;;AAEzC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,EAAE,CAAC,GAAG;;AAEZ,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE;;AAErC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,GAAG;;AAEtB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AACpC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;;AAEpC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC5B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC5B,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;;AAE5B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,CAAC,GAAG;;AAEtB,EAAE,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,EAAE;;AAElC,EAAE,KAAK,WAAW,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;AAErD,EAAE,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,WAAW;;AAE5C,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE;;AAEhD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,WAAW,GAAG;;AAE/B,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE;;AAEvD,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE;;AAE9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,EAAE,MAAM,GAAG;;AAEnB,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;;AAEtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,EAAE,CAAC,GAAG;;AAEd,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;;AAEjE,EAAE,KAAK,WAAW,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC;;AAE7C,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,WAAW;;AAE3C;;AAEA,EAAE,OAAO,IAAI,CAAC,IAAI,EAAEA,OAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;;AAE3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,UAAU,EAAE,CAAC,GAAG;;AAEjB,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE;;AAEjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,iBAAiB,EAAE,CAAC,GAAG;;AAExB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAE/D,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;;AAEpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,mBAAmB,EAAE,CAAC,GAAG;;AAE1B,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;AAEvF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gBAAgB,EAAE,CAAC,GAAG;;AAEvB,EAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE;;AAEhE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sBAAsB,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG;;AAE9C,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;;AAE/C,EAAE,IAAI,CAAC,CAAC,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE;AAC3C,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;AACnC,EAAE,IAAI,CAAC,CAAC,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE;;AAE3C,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kBAAkB,EAAE,CAAC,GAAG;;AAEzB,EAAE,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;;AAEhE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wBAAwB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG;;AAE9C,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE;AACrC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;AACZ,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE;;AAErC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,qBAAqB,EAAE,CAAC,GAAG;;AAE5B,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ;;AAEtB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE;AAClB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE;AAClB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE;;AAElB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kBAAkB,EAAE,CAAC,GAAG;;AAEzB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE;AACtD,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE;AACtD,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE;;AAEtD,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE;AACb,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE;AACb,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE;;AAEb,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,mBAAmB,EAAE,CAAC,EAAE,KAAK,GAAG;;AAEjC,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE;;AAEhD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB,EAAE,CAAC,EAAE,KAAK,GAAG;;AAElC,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE;;AAEhD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,CAAC,GAAG;;AAEnB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;AACf,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;;AAEf,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,CAAC,GAAG;;AAEnB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;AAEd,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,CAAC,GAAG;;AAEb,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE;;AAEzE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG;;AAEhC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE;AAC1B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE;AAC9B,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE;;AAE9B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG;;AAEnC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AAC1B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;AAC9B,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;;AAE9B,EAAE,OAAO,KAAK;;AAEd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,mBAAmB,EAAE,SAAS,EAAE,KAAK,GAAG;;AAEzC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;AAClC,EAAE,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;;AAElC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,GAAG;;AAEV,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;;AAExB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,GAAG;;AAEnB;;AAEA,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AAC3C,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC;AACjC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;;AAElC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE;AAChC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;AACZ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE;;AAEhC,EAAE,OAAO,IAAI;;AAEb;;AAEA,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG;;AAExB,EAAE,MAAM,IAAI,CAAC,CAAC;AACd,EAAE,MAAM,IAAI,CAAC,CAAC;AACd,EAAE,MAAM,IAAI,CAAC,CAAC;;AAEd;;AAEA;;AAEA,MAAM,SAAS,iBAAiB,IAAI,OAAO,EAAE;AAC7C,MAAM,aAAa,iBAAiB,IAAI,UAAU,EAAE;;AAEpD;AACA;AACA;AACA,MAAM,IAAI,CAAC;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,GAAG,GAAG,IAAI,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,GAAG,IAAI,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG;;AAEjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI;;AAEpB;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,GAAG,GAAG,GAAG;;AAEhB;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,GAAG,GAAG,GAAG;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG;;AAEjB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE;AACtB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE;;AAEtB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,KAAK,GAAG;;AAEvB,EAAE,IAAI,CAAC,SAAS,EAAE;;AAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG;;AAEvD,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;;AAExD;;AAEA,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sBAAsB,EAAE,SAAS,GAAG;;AAErC,EAAE,IAAI,CAAC,SAAS,EAAE;;AAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;AAExD,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE;;AAEtE;;AAEA,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,MAAM,GAAG;;AAEzB,EAAE,IAAI,CAAC,SAAS,EAAE;;AAElB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;AAEtD,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;;AAEpC;;AAEA,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB,EAAE,MAAM,EAAE,IAAI,GAAG;;AAEtC,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;;AAE/D,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE;AACzC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE;;AAEzC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG;;AAE1C,EAAE,IAAI,CAAC,SAAS,EAAE;;AAElB,EAAE,OAAO,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE;;AAE/C;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE;;AAE5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,GAAG,GAAG;;AAEb,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE;AAC1B,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE;;AAE1B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,GAAG;;AAEb,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ;AACnD,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ;;AAEnD,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,GAAG;;AAEX;;AAEA,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;;AAElG;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,MAAM,GAAG;;AAErB,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;;AAE/G;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,EAAE,MAAM,GAAG;;AAEnB,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;;AAEzF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,KAAK,GAAG;;AAExB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE;AACvB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE;;AAEvB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,MAAM,GAAG;;AAE1B,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE;AACxB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE;;AAExB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,MAAM,GAAG;;AAE1B,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE;AAChC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE;;AAE9B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG;;AAE3C;AACA;;AAEA,EAAE,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE;;AAE1C,EAAE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;;AAElC,EAAE,KAAK,QAAQ,KAAK,SAAS,GAAG;;AAEhC,GAAG,MAAM,iBAAiB,GAAG,QAAQ,CAAC,YAAY,EAAE,UAAU,EAAE;;AAEhE;AACA;;AAEA,GAAG,KAAK,OAAO,KAAK,IAAI,IAAI,iBAAiB,KAAK,SAAS,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,GAAG;;AAEjG,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;AAEhE,KAAK,KAAK,MAAM,CAAC,MAAM,KAAK,IAAI,GAAG;;AAEnC,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC,EAAE,SAAS,EAAE;;AAE9C,MAAM,MAAM;;AAEZ,MAAM,SAAS,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,CAAC,EAAE;;AAE3D;;AAEA,KAAK,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE;AACjD,KAAK,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE;;AAEpC;;AAEA,IAAI,MAAM;;AAEV,IAAI,KAAK,MAAM,CAAC,WAAW,KAAK,SAAS,GAAG;;AAE5C;;AAEA,KAAK,KAAK,MAAM,CAAC,WAAW,KAAK,IAAI,GAAG;;AAExC,MAAM,MAAM,CAAC,kBAAkB,EAAE;;AAEjC;;AAEA,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE;;;AAGtC,KAAK,MAAM;;AAEX;;AAEA,KAAK,KAAK,QAAQ,CAAC,WAAW,KAAK,IAAI,GAAG;;AAE1C,MAAM,QAAQ,CAAC,kBAAkB,EAAE;;AAEnC;;AAEA,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE;;AAExC;;AAEA,IAAI,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE;;AAE7C,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;;AAExB;;AAEA;;AAEA,EAAE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;;AAElC,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;AAEtD,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE;;AAEhD;;AAEA,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,KAAK,GAAG;;AAExB,EAAE,OAAO,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AACvD,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;;AAEjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,GAAG,GAAG;;AAEpB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3D,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;;AAErD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG;;AAE/B;AACA;;AAEA,EAAE,OAAO,MAAM,CAAC,GAAG;AACnB,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AACzD,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AACzD,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACvD,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,GAAG,GAAG;;AAEtB;AACA,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3D,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;;AAErD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gBAAgB,EAAE,MAAM,GAAG;;AAE5B;AACA,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE;;AAE7C;AACA,EAAE,OAAO,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE;;AAE1F;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,KAAK,GAAG;;AAE1B;AACA;;AAEA,EAAE,IAAI,GAAG,EAAE,GAAG;;AAEd,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG;;AAE5B,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;AAEpC,GAAG,MAAM;;AAET,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;AAEpC;;AAEA,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG;;AAE5B,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;AAErC,GAAG,MAAM;;AAET,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;AAErC;;AAEA,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG;;AAE5B,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;AAErC,GAAG,MAAM;;AAET,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;AAErC;;AAEA,EAAE,SAAS,GAAG,IAAI,EAAE,KAAK,CAAC,QAAQ,IAAI,GAAG,IAAI,EAAE,KAAK,CAAC,QAAQ;;AAE7D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kBAAkB,EAAE,QAAQ,GAAG;;AAEhC,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG;;AAExB,GAAG,OAAO,KAAK;;AAEf;;AAEA;AACA,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;AAC3B,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;;AAE1C;AACA,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE;AACzC,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE;AACzC,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE;;AAEzC;AACA,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;AAChC,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;AAChC,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;;AAEhC;AACA;AACA;AACA,EAAE,IAAI,IAAI,GAAG;AACb,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1D,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC1D,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACzD,GAAG;AACH,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG;;AAE7D,GAAG,OAAO,KAAK;;AAEf;;AAEA;AACA,EAAE,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACtC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG;;AAE7D,GAAG,OAAO,KAAK;;AAEf;;AAEA;AACA;AACA,EAAE,eAAe,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE;AAC1C,EAAE,IAAI,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE;;AAEpE,EAAE,OAAO,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;;AAE1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG;;AAE7B,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;;AAEzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,KAAK,GAAG;;AAE1B,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE;;AAEhE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,iBAAiB,EAAE,MAAM,GAAG;;AAE7B,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG;;AAExB,GAAG,MAAM,CAAC,SAAS,EAAE;;AAErB,GAAG,MAAM;;AAET,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;;AAElC,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,GAAG;;AAE3D;;AAEA,EAAE,OAAO,MAAM;;AAEf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,GAAG,GAAG;;AAElB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACzB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;;AAEzB;AACA,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;;AAExC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,EAAE,GAAG,GAAG;;AAEd,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACzB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;;AAEzB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,MAAM,GAAG;;AAExB;AACA,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,IAAI;;AAEnC;AACA,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;AAChF,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;AAChF,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;AAChF,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;AAChF,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;AAChF,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;AAChF,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;AAChF,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;;AAEhF,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE;;AAE/B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,MAAM,GAAG;;AAErB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE;AACxB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE;;AAExB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,GAAG,GAAG;;AAEf,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE;;AAEjE;;AAEA;;AAEA,MAAM,OAAO,GAAG;AAChB,eAAe,IAAI,OAAO,EAAE;AAC5B,eAAe,IAAI,OAAO,EAAE;AAC5B,eAAe,IAAI,OAAO,EAAE;AAC5B,eAAe,IAAI,OAAO,EAAE;AAC5B,eAAe,IAAI,OAAO,EAAE;AAC5B,eAAe,IAAI,OAAO,EAAE;AAC5B,eAAe,IAAI,OAAO,EAAE;AAC5B,eAAe,IAAI,OAAO;AAC1B,CAAC;;AAED,MAAM,SAAS,iBAAiB,IAAI,OAAO,EAAE;;AAE7C,MAAM,MAAM,iBAAiB,IAAI,IAAI,EAAE;;AAEvC;;AAEA,MAAM,KAAK,iBAAiB,IAAI,OAAO,EAAE;AACzC,MAAM,KAAK,iBAAiB,IAAI,OAAO,EAAE;AACzC,MAAM,KAAK,iBAAiB,IAAI,OAAO,EAAE;;AAEzC;;AAEA,MAAM,GAAG,iBAAiB,IAAI,OAAO,EAAE;AACvC,MAAM,GAAG,iBAAiB,IAAI,OAAO,EAAE;AACvC,MAAM,GAAG,iBAAiB,IAAI,OAAO,EAAE;;AAEvC,MAAM,OAAO,iBAAiB,IAAI,OAAO,EAAE;AAC3C,MAAM,QAAQ,iBAAiB,IAAI,OAAO,EAAE;AAC5C,MAAM,eAAe,iBAAiB,IAAI,OAAO,EAAE;AACnD,MAAM,SAAS,iBAAiB,IAAI,OAAO,EAAE;;AAE7C,SAAS,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,GAAG;;AAEjD,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;;AAExD,EAAE,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE;AAChC;AACA,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE;AAC3H;AACA,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE;AAChC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE;AAChC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE;AAChC;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG;;AAE1E;AACA;AACA,GAAG,OAAO,KAAK;;AAEf;;AAEA;;AAEA,CAAC,OAAO,IAAI;;AAEZ;;AAEA,MAAM,MAAM,iBAAiB,IAAI,IAAI,EAAE;AACvC,MAAM,KAAK,iBAAiB,IAAI,OAAO,EAAE;AACzC,MAAM,KAAK,iBAAiB,IAAI,OAAO,EAAE;;AAEzC;AACA;AACA;AACA;AACA,MAAM,MAAM,CAAC;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE,GAAG;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI;;AAEtB;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM;;AAEtB;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM;;AAEtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG;;AAEvB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE;AAC5B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM;;AAEtB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG;;AAEzC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;;AAE5B,EAAE,KAAK,cAAc,KAAK,SAAS,GAAG;;AAEtC,GAAG,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE;;AAEhC,GAAG,MAAM;;AAET,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE;;AAErD;;AAEA,EAAE,IAAI,WAAW,GAAG,CAAC;;AAErB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG;;AAEtD,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;;AAEjF;;AAEA,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;;AAExC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,MAAM,GAAG;;AAEhB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;AACnC,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;;AAE7B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,OAAO,GAAG;;AAEX,EAAE,SAAS,IAAI,CAAC,MAAM,GAAG,CAAC;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,GAAG;;AAEb,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC5B,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE;;AAElB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,KAAK,GAAG;;AAExB,EAAE,SAAS,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;;AAElF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,KAAK,GAAG;;AAE1B,EAAE,SAAS,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM;;AAExD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gBAAgB,EAAE,MAAM,GAAG;;AAE5B,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;;AAE/C,EAAE,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,SAAS,GAAG,SAAS,EAAE;;AAEpF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,GAAG,GAAG;;AAEtB,EAAE,OAAO,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE;;AAErC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,KAAK,GAAG;;AAE1B,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM;;AAExE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG;;AAE7B,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE;;AAE9D,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;;AAEtB,EAAE,KAAK,aAAa,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG;;AAEvD,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;AACxC,GAAG,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE;;AAE1D;;AAEA,EAAE,OAAO,MAAM;;AAEf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,MAAM,GAAG;;AAE1B,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG;;AAExB;AACA,GAAG,MAAM,CAAC,SAAS,EAAE;AACrB,GAAG,OAAO,MAAM;;AAEhB;;AAEA,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACxC,EAAE,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE;;AAEtC,EAAE,OAAO,MAAM;;AAEf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,MAAM,GAAG;;AAExB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE;AACpC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,iBAAiB,EAAE;;AAExD,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,MAAM,GAAG;;AAErB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE;;AAE3B,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,KAAK,GAAG;;AAExB,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG;;AAExB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;;AAE5B,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;;AAElB,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;;AAExC,EAAE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE;;AAEnC,EAAE,KAAK,QAAQ,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG;;AAElD;;AAEA,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE;;AAEvC,GAAG,MAAM,KAAK,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG;;AAE/C,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;;AAEvD,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK;;AAEvB;;AAEA,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,EAAE,MAAM,GAAG;;AAEjB,EAAE,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG;;AAE1B,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,GAAG;;AAExB,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE;;AAEtB,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,GAAG;;AAEtD,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;;AAExD,GAAG,MAAM;;AAET,GAAG,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;;AAE5E,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;;AAEjE,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;;AAEjE;;AAEA,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,MAAM,GAAG;;AAElB,EAAE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;;AAEjF;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE;;AAE5C;;AAEA;;AAEA,MAAM,SAAS,iBAAiB,IAAI,OAAO,EAAE;AAC7C,MAAM,UAAU,iBAAiB,IAAI,OAAO,EAAE;AAC9C,MAAM,OAAO,iBAAiB,IAAI,OAAO,EAAE;AAC3C,MAAM,KAAK,iBAAiB,IAAI,OAAO,EAAE;;AAEzC,MAAM,MAAM,iBAAiB,IAAI,OAAO,EAAE;AAC1C,MAAM,MAAM,iBAAiB,IAAI,OAAO,EAAE;AAC1C,MAAM,SAAS,iBAAiB,IAAI,OAAO,EAAE;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,GAAG,CAAC;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,OAAO,EAAE,EAAE,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG;;AAE5E;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM;;AAEtB;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,SAAS;;AAE5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG;;AAE1B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE;AAC5B,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE;;AAElC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,GAAG,GAAG;;AAEb,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE;AAChC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE;;AAEtC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG;;AAEjB,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE;;AAExE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,CAAC,GAAG;;AAEb,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;;AAEzD,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,CAAC,GAAG;;AAEb,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE;;AAE7C,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG;;AAEtC,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;;AAEzC,EAAE,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;;AAExD,EAAE,KAAK,iBAAiB,GAAG,CAAC,GAAG;;AAE/B,GAAG,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;;AAEpC;;AAEA,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE;;AAExF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,KAAK,GAAG;;AAE1B,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE;;AAErD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,iBAAiB,EAAE,KAAK,GAAG;;AAE5B,EAAE,MAAM,iBAAiB,GAAG,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;;AAE5F;;AAEA,EAAE,KAAK,iBAAiB,GAAG,CAAC,GAAG;;AAE/B,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE;;AAEhD;;AAEA,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE;;AAEpF,EAAE,OAAO,SAAS,CAAC,iBAAiB,EAAE,KAAK,EAAE;;AAE7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,sBAAsB,GAAG;;AAE3E;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;AACvD,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE;AAC1C,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE;;AAE7C,EAAE,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,GAAG;AAC7C,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE;AAC7C,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;AACxC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE;AACnC,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE;AAC5B,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE;AACvC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM;;AAE7B,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG;;AAEjB;;AAEA,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE;AACrB,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE;AACrB,GAAG,MAAM,GAAG,SAAS,GAAG,GAAG;;AAE3B,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG;;AAElB,IAAI,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG;;AAE1B,KAAK,KAAK,EAAE,IAAI,MAAM,GAAG;;AAEzB;AACA;;AAEA,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG;AAC5B,MAAM,EAAE,IAAI,MAAM;AAClB,MAAM,EAAE,IAAI,MAAM;AAClB,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;;AAErF,MAAM,MAAM;;AAEZ;;AAEA,MAAM,EAAE,GAAG,SAAS;AACpB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE;AAC7C,MAAM,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;;AAEpD;;AAEA,KAAK,MAAM;;AAEX;;AAEA,KAAK,EAAE,GAAG,EAAE,SAAS;AACrB,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE;AAC5C,KAAK,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;;AAEnD;;AAEA,IAAI,MAAM;;AAEV,IAAI,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG;;AAE1B;;AAEA,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,SAAS,GAAG,EAAE,EAAE,EAAE;AACrD,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;AACzF,KAAK,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;;AAEnD,KAAK,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG;;AAE/B;;AAEA,KAAK,EAAE,GAAG,CAAC;AACX,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;AAC9D,KAAK,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;;AAEvC,KAAK,MAAM;;AAEX;;AAEA,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,GAAG,SAAS,GAAG,EAAE,EAAE,EAAE;AACnD,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;AACvF,KAAK,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;;AAEnD;;AAEA;;AAEA,GAAG,MAAM;;AAET;;AAEA,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS;AAC7C,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE;AAC1C,GAAG,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;;AAEjD;;AAEA,EAAE,KAAK,kBAAkB,GAAG;;AAE5B,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE;;AAE/E;;AAEA,EAAE,KAAK,sBAAsB,GAAG;;AAEhC,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE;;AAE3E;;AAEA,EAAE,OAAO,OAAO;;AAEhB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG;;AAEnC,EAAE,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACpD,EAAE,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;AAC7C,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG;AACnD,EAAE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;;AAE/C,EAAE,KAAK,EAAE,GAAG,OAAO,GAAG,OAAO,IAAI;;AAEjC,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE;;AAEvC;AACA,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG;;AAEtB;AACA,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG;;AAEtB;AACA,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,OAAO,IAAI;;AAE3B;AACA;AACA;AACA,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;;AAE5C;AACA,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;;AAE9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gBAAgB,EAAE,MAAM,GAAG;;AAE5B,EAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE;;AAErF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,KAAK,GAAG;;AAE1B,EAAE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;;AAExD,EAAE,KAAK,WAAW,KAAK,CAAC,GAAG;;AAE3B;AACA,GAAG,KAAK,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG;;AAErD,IAAI,OAAO,CAAC;;AAEZ;;AAEA;;AAEA,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,WAAW;;AAEhF;;AAEA,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG;;AAEjC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE;;AAEzC,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG;;AAEpB,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE;;AAE7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,KAAK,GAAG;;AAE1B;;AAEA,EAAE,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE;;AAE1D,EAAE,KAAK,WAAW,KAAK,CAAC,GAAG;;AAE3B,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;;AAExD,EAAE,KAAK,WAAW,GAAG,WAAW,GAAG,CAAC,GAAG;;AAEvC,GAAG,OAAO,IAAI;;AAEd;;AAEA;;AAEA,EAAE,OAAO,KAAK;;AAEd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG;;AAE7B,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;;AAE5C,EAAE,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AACtC,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AACjC,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;;AAEjC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;;AAE5B,EAAE,KAAK,OAAO,IAAI,CAAC,GAAG;;AAEtB,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;AAC5C,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;;AAE5C,GAAG,MAAM;;AAET,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;AAC5C,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;;AAE5C;;AAEA,EAAE,KAAK,OAAO,IAAI,CAAC,GAAG;;AAEtB,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;AAC7C,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;;AAE7C,GAAG,MAAM;;AAET,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;AAC7C,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;;AAE7C;;AAEA,EAAE,KAAK,EAAE,IAAI,GAAG,KAAK,QAAQ,KAAK,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI;;AAEzD,EAAE,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,KAAK;;AAEnD,EAAE,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,KAAK;;AAEnD,EAAE,KAAK,OAAO,IAAI,CAAC,GAAG;;AAEtB,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;AAC7C,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;;AAE7C,GAAG,MAAM;;AAET,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;AAC7C,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO;;AAE7C;;AAEA,EAAE,KAAK,EAAE,IAAI,GAAG,KAAK,QAAQ,KAAK,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI;;AAEzD,EAAE,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK;;AAEnD,EAAE,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK;;AAEnD;;AAEA,EAAE,KAAK,IAAI,GAAG,CAAC,GAAG,OAAO,IAAI;;AAE7B,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE;;AAEnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,aAAa,EAAE,GAAG,GAAG;;AAEtB,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,IAAI;;AAErD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,GAAG;;AAEvD;;AAEA;;AAEA,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE;AAC3B,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE;AAC3B,EAAE,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE;;AAE1C;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE;AAC3C,EAAE,IAAI,IAAI;;AAEV,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG;;AAEjB,GAAG,KAAK,eAAe,GAAG,OAAO,IAAI;AACrC,GAAG,IAAI,GAAG,CAAC;;AAEX,GAAG,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG;;AAExB,GAAG,IAAI,GAAG,EAAE;AACZ,GAAG,GAAG,GAAG,EAAE,GAAG;;AAEd,GAAG,MAAM;;AAET,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;AACpC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;;AAElF;AACA,EAAE,KAAK,MAAM,GAAG,CAAC,GAAG;;AAEpB,GAAG,OAAO,IAAI;;AAEd;;AAEA,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;;AAEnE;AACA,EAAE,KAAK,MAAM,GAAG,CAAC,GAAG;;AAEpB,GAAG,OAAO,IAAI;;AAEd;;AAEA;AACA,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG;;AAE/B,GAAG,OAAO,IAAI;;AAEd;;AAEA;AACA,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE;;AAE7C;AACA,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG;;AAEjB,GAAG,OAAO,IAAI;;AAEd;;AAEA;AACA,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,MAAM,EAAE;;AAErC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,OAAO,GAAG;;AAEzB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE;AACrC,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,OAAO,EAAE;;AAE9C,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,GAAG,GAAG;;AAEf,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;;AAEnF;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE;;AAE5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,OAAO,CAAC;;AAEd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG;;AAE/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI;;AAEpC;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,QAAQ,GAAG;;AAElB,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACb,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACb,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACb,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;AAEZ,GAAG;;AAEH,EAAE,KAAK,GAAG,KAAK,SAAS,GAAG;;AAE3B,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;;AAE7F;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG;;AAEvF,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ;;AAE1B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG;AAC7D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG;AAC7D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG;AAC9D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG;;AAE9D,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,QAAQ,GAAG;;AAEZ,EAAE,IAAI,CAAC,GAAG;;AAEV,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACb,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACb,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACb,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;AAEZ,GAAG;;AAEH,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,KAAK,GAAG;;AAET,EAAE,OAAO,IAAI,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;;AAEjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,IAAI,EAAE,CAAC,GAAG;;AAEX,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ;AAC1B,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ;;AAEvB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE;AAC5E,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE;AAC5E,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;AAChF,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;;AAEpF,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,CAAC,GAAG;;AAEnB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,QAAQ;;AAE3C,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;AACrB,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;AACrB,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;;AAErB,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,cAAc,EAAE,CAAC,GAAG;;AAErB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ;;AAEvB,EAAE,IAAI,CAAC,GAAG;;AAEV,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;AAC/B,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;AAC/B,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;AAC/B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;AAEZ,GAAG;;AAEH,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG;;AAErC,EAAE,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE;AACtC,EAAE,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE;AACtC,EAAE,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE;;AAEtC,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG;;AAElC,EAAE,IAAI,CAAC,GAAG;AACV,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AAC/B,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AAC/B,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AAC/B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACZ,GAAG;;AAEH,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,eAAe,EAAE,CAAC,GAAG;;AAEtB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ;AAC1B,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ;;AAEvB,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE;AAC/D,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE;AAC/D,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE;;AAE/D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM;AAC5B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM;AAC5B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM;AAC5B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;;AAEb,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM;AAC5B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM;AAC5B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM;AAC5B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;;AAEb,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM;AAC5B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM;AAC5B,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM;AAC9B,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;;AAEd,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AACd,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AACd,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AACd,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;;AAEd,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,qBAAqB,EAAE,KAAK,GAAG;;AAEhC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ;;AAE1B,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;AAC7C,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE;AAC5C,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE;AAC5C,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE;;AAE5C,EAAE,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,GAAG;;AAE/B,GAAG,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEvD,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;AACpB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;;AAEd,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;;AAEpB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxB,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEnB,GAAG,MAAM,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,GAAG;;AAEtC,GAAG,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEvD,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;;AAElB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;;AAEhB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxB,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEnB,GAAG,MAAM,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,GAAG;;AAEtC,GAAG,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEvD,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;AACpB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;;AAExB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;;AAExB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;AACpB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;AACd,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEnB,GAAG,MAAM,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,GAAG;;AAEtC,GAAG,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEvD,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;;AAExB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;;AAExB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;AAChB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEnB,GAAG,MAAM,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,GAAG;;AAEtC,GAAG,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEvD,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;;AAExB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;AACd,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;;AAEpB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;AACpB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACxB,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;;AAEzB,GAAG,MAAM,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,GAAG;;AAEtC,GAAG,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;;AAEvD,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;AAChB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;;AAElB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;;AAExB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;AACxB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAClB,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;;AAEzB;;AAEA;AACA,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;AACb,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;AACb,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;;AAEd;AACA,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AACd,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AACd,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AACd,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;;AAEd,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B,EAAE,CAAC,GAAG;;AAEjC,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE;;AAEvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG;;AAE3B,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ;;AAE1B,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE;;AAE9B,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG;;AAE7B;;AAEA,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;;AAEX;;AAEA,EAAE,EAAE,CAAC,SAAS,EAAE;AAChB,EAAE,EAAE,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE;;AAE3B,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG;;AAE7B;;AAEA,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG;;AAEjC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM;;AAElB,IAAI,MAAM;;AAEV,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM;;AAElB;;AAEA,GAAG,EAAE,CAAC,SAAS,EAAE;AACjB,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE;;AAE5B;;AAEA,EAAE,EAAE,CAAC,SAAS,EAAE;AAChB,EAAE,EAAE,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE;;AAE3B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAChD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAChD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;;AAEjD,EAAE,OAAO,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,QAAQ,EAAE,CAAC,GAAG;;AAEf,EAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE;;AAEzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,WAAW,EAAE,CAAC,GAAG;;AAElB,EAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE;;AAEzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,GAAG;;AAE1B,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ;AACvB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ;AACvB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ;;AAE1B,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;AACnE,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;AACnE,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;AACpE,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;;AAEpE,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;AACnE,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;AACnE,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;AACpE,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE;;AAEpE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;;AAE1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;;AAE1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC1D,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;;AAE1D,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACzD,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,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GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM;AAClI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM;AAClI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM;;AAElI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,MAAM;AACxB,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM;AAClI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM;AAClI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAA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AACA;AACA,KAAK,CAAC,KAAK,GAAG,cAAc;;AAE5B,IAAI,WAAW,GAAG,CAAC;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;iBACA,MAAM,QAAQ,SAAS,eAAe,CAAC;;AAEvC;AACA;AACA;AACA,CAAC,WAAW,GAAG;;AAEf,EAAE,KAAK,EAAE;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,EAAE,EAAE;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE;;AAE5B;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,QAAQ,GAAG,cAAc;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,KAAK;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,KAAK;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,QAAQ,GAAG,cAAc;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,QAAQ,GAAG,sBAAsB;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,WAAW;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,cAAc;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,iBAAiB;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,aAAa;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,aAAa;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,aAAa;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,KAAK;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,KAAK;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,KAAK;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,mBAAmB,GAAG,CAAC;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,kBAAkB,GAAG,CAAC;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,KAAK;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,eAAe,GAAG,KAAK;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,kBAAkB,GAAG,KAAK;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,eAAe,GAAG,KAAK;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC;;ACjCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,qBAAe,IAAI,CAAC;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC;;AClCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,cAAe,IAAI,CAAC;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC;;AC/BP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,EAAE,OAAO;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ,EAAE,cAAc;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,EAAE,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC;AACA,MAAM,YAAY,GAAG,CAAC,UAAU,KAAK;AAC5C,IAAI,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC;AACtC,CAAC;;ACtXD;AACA;AACA,IAAI,cAAc,GAAG,CAAC,WAAW;;AAGjC;AACA;AACA,CAAC,IAAI,SAAS,GAAG,2kOAA2kO;AAC5lO,CAAC,IA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","x_google_ignoreList":[0,1,2,3,4,5,6,7,15,16,17,18,19,20,21,22,23,27,28,29,31,44,48,49,50,67,68,69,76,77]} \ No newline at end of file diff --git a/packages/model-viewer/index.html b/packages/model-viewer/index.html index 3cca565..f3b7a27 100644 --- a/packages/model-viewer/index.html +++ b/packages/model-viewer/index.html @@ -1,6 +1,6 @@ - \ No newline at end of file + ios-src="./Astronaut.usdz" xr-environment> \ No newline at end of file diff --git a/packages/model-viewer/shared-assets b/packages/model-viewer/shared-assets new file mode 120000 index 0000000..b768ac8 --- /dev/null +++ b/packages/model-viewer/shared-assets @@ -0,0 +1 @@ +../shared-assets \ No newline at end of file diff --git a/packages/render-fidelity-tools/dist/image-comparison-app.js b/packages/render-fidelity-tools/dist/image-comparison-app.js new file mode 100644 index 0000000..92a82ef --- /dev/null +++ b/packages/render-fidelity-tools/dist/image-comparison-app.js @@ -0,0 +1,24431 @@ +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const canvas = document.createElement('canvas'); +const context = canvas.getContext('2d'); +class ImageAccessor { + static fromArrayBuffer(buffer, width, height) { + return new ImageAccessor(new ImageData(new Uint8ClampedArray(buffer), width, height)); + } + static fromImageElement(image) { + canvas.width = image.naturalWidth; + canvas.height = image.naturalHeight; + context.drawImage(image, 0, 0); + return new ImageAccessor(context.getImageData(0, 0, canvas.width, canvas.height)); + } + toArrayBuffer() { + const { buffer } = this.source.data; + return buffer.slice(0, buffer.byteLength); + } + cssColorAt(x, y) { + if (x < 0 || y < 0 || x > (this.width - 1) || y > (this.height - 1)) { + return 'black'; + } + const position = (y * this.width + x) * 4; + const array = this.source.data; + const color = `rgb(${array[position]}, ${array[position + 1]}, ${array[position + 2]})`; + return color; + } + constructor(source) { + this.source = source; + } + get width() { + return this.source.width; + } + get height() { + return this.source.height; + } +} + +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +const t$1=globalThis,e$4=t$1.ShadowRoot&&(void 0===t$1.ShadyCSS||t$1.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,s$1=Symbol(),o$3=new WeakMap;let n$3 = class n{constructor(t,e,o){if(this._$cssResult$=true,o!==s$1)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e;}get styleSheet(){let t=this.o;const s=this.t;if(e$4&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o$3.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o$3.set(s,t));}return t}toString(){return this.cssText}};const r$4=t=>new n$3("string"==typeof t?t:t+"",void 0,s$1),S$1=(s,o)=>{if(e$4)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement("style"),n=t$1.litNonce;void 0!==n&&o.setAttribute("nonce",n),o.textContent=e.cssText,s.appendChild(o);}},c$2=e$4?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const s of t.cssRules)e+=s.cssText;return r$4(e)})(t):t; + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const{is:i$2,defineProperty:e$3,getOwnPropertyDescriptor:r$3,getOwnPropertyNames:h$1,getOwnPropertySymbols:o$2,getPrototypeOf:n$2}=Object,a$1=globalThis,c$1=a$1.trustedTypes,l$1=c$1?c$1.emptyScript:"",p$2=a$1.reactiveElementPolyfillSupport,d$1=(t,s)=>t,u$1={toAttribute(t,s){switch(s){case Boolean:t=t?l$1:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t);}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t);}catch(t){i=null;}}return i}},f$1=(t,s)=>!i$2(t,s),y$1={attribute:true,type:String,converter:u$1,reflect:false,hasChanged:f$1};Symbol.metadata??=Symbol("metadata"),a$1.litPropertyMetadata??=new WeakMap;class b extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t);}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=y$1){if(s.state&&(s.attribute=false),this._$Ei(),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,s);void 0!==r&&e$3(this.prototype,t,r);}}static getPropertyDescriptor(t,s,i){const{get:e,set:h}=r$3(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t;}};return {get(){return e?.call(this)},set(s){const r=e?.call(this);h.call(this,s),this.requestUpdate(t,r,i);},configurable:true,enumerable:true}}static getPropertyOptions(t){return this.elementProperties.get(t)??y$1}static _$Ei(){if(this.hasOwnProperty(d$1("elementProperties")))return;const t=n$2(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties);}static finalize(){if(this.hasOwnProperty(d$1("finalized")))return;if(this.finalized=true,this._$Ei(),this.hasOwnProperty(d$1("properties"))){const t=this.properties,s=[...h$1(t),...o$2(t)];for(const i of s)this.createProperty(i,t[i]);}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i);}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t);}this.elementStyles=this.finalizeStyles(this.styles);}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(c$2(s));}else void 0!==s&&i.push(c$2(s));return i}static _$Eu(t,s){const i=s.attribute;return false===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=false,this.hasUpdated=false,this._$Em=null,this._$Ev();}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)));}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.();}removeController(t){this._$EO?.delete(t);}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t);}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return S$1(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(true),this._$EO?.forEach((t=>t.hostConnected?.()));}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()));}attributeChangedCallback(t,s,i){this._$AK(t,i);}_$EC(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&true===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:u$1).toAttribute(s,i.type);this._$Em=t,null==r?this.removeAttribute(e):this.setAttribute(e,r),this._$Em=null;}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),r="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u$1;this._$Em=e,this[e]=r.fromAttribute(s,t.type),this._$Em=null;}}requestUpdate(t,s,i){if(void 0!==t){if(i??=this.constructor.getPropertyOptions(t),!(i.hasChanged??f$1)(this[t],s))return;this.P(t,s,i);} false===this.isUpdatePending&&(this._$ES=this._$ET());}P(t,s,i){this._$AL.has(t)||this._$AL.set(t,s),true===i.reflect&&this._$Em!==t&&(this._$Ej??=new Set).add(t);}async _$ET(){this.isUpdatePending=true;try{await this._$ES;}catch(t){Promise.reject(t);}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0;}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t) true!==i.wrapped||this._$AL.has(s)||void 0===this[s]||this.P(s,this[s],i);}let t=false;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EU();}catch(s){throw t=false,this._$EU(),s}t&&this._$AE(s);}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=true,this.firstUpdated(t)),this.updated(t);}_$EU(){this._$AL=new Map,this.isUpdatePending=false;}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return true}update(t){this._$Ej&&=this._$Ej.forEach((t=>this._$EC(t,this[t]))),this._$EU();}updated(t){}firstUpdated(t){}}b.elementStyles=[],b.shadowRootOptions={mode:"open"},b[d$1("elementProperties")]=new Map,b[d$1("finalized")]=new Map,p$2?.({ReactiveElement:b}),(a$1.reactiveElementVersions??=[]).push("2.0.4"); + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +const t=globalThis,i$1=t.trustedTypes,s=i$1?i$1.createPolicy("lit-html",{createHTML:t=>t}):void 0,e$2="$lit$",h=`lit$${Math.random().toFixed(9).slice(2)}$`,o$1="?"+h,n$1=`<${o$1}>`,r$2=document,l=()=>r$2.createComment(""),c=t=>null===t||"object"!=typeof t&&"function"!=typeof t,a=Array.isArray,u=t=>a(t)||"function"==typeof t?.[Symbol.iterator],d="[ \t\n\f\r]",f=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,v=/-->/g,_=/>/g,m=RegExp(`>|${d}(?:([^\\s"'>=/]+)(${d}*=${d}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),p$1=/'/g,g=/"/g,$=/^(?:script|style|textarea|title)$/i,y=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),x=y(1),T=Symbol.for("lit-noChange"),E=Symbol.for("lit-nothing"),A=new WeakMap,C=r$2.createTreeWalker(r$2,129);function P(t,i){if(!a(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==s?s.createHTML(i):i}const V=(t,i)=>{const s=t.length-1,o=[];let r,l=2===i?"":3===i?"":"",c=f;for(let i=0;i"===u[0]?(c=r??f,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?m:'"'===u[3]?g:p$1):c===g||c===p$1?c=m:c===v||c===_?c=f:(c=m,r=void 0);const x=c===m&&t[i+1].startsWith("/>")?" ":"";l+=c===f?s+n$1:d>=0?(o.push(a),s.slice(0,d)+e$2+s.slice(d)+h+x):s+h+(-2===d?i:x);}return [P(t,l+(t[s]||"")+(2===i?"":3===i?"":"")),o]};class N{constructor({strings:t,_$litType$:s},n){let r;this.parts=[];let c=0,a=0;const u=t.length-1,d=this.parts,[f,v]=V(t,s);if(this.el=N.createElement(f,n),C.currentNode=this.el.content,2===s||3===s){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes);}for(;null!==(r=C.nextNode())&&d.length0){r.textContent=i$1?i$1.emptyScript:"";for(let i=0;i2||""!==s[0]||""!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=E;}_$AI(t,i=this,s,e){const h=this.strings;let o=false;if(void 0===h)t=S(this,t,i,0),o=!c(t)||t!==this._$AH&&t!==T,o&&(this._$AH=t);else {const e=t;let n,r;for(t=h[0],n=0;n{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new R(i.insertBefore(l(),t),t,void 0,s??{});}return h._$AI(t),h}; + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */let r$1 = class r extends b{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0;}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const s=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=B(s,this.renderRoot,this.renderOptions);}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(true);}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(false);}render(){return T}};r$1._$litElement$=true,r$1["finalized"]=true,globalThis.litElementHydrateSupport?.({LitElement:r$1});const i=globalThis.litElementPolyfillSupport;i?.({LitElement:r$1});(globalThis.litElementVersions??=[]).push("4.1.1"); + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const o={attribute:true,type:String,converter:u$1,reflect:false,hasChanged:f$1},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),s.set(r.name,t),"accessor"===n){const{name:o}=r;return {set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t);},init(e){return void 0!==e&&this.P(o,void 0,t),e}}}if("setter"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t);}}throw Error("Unsupported decorator location: "+n)};function n(t){return (e,o)=>"object"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,r?{...t,wrapped:true}:t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)} + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +const e$1=(e,t,c)=>(c.configurable=true,c.enumerable=true,c); + +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */function e(e,r){return (n,s,i)=>{const o=t=>t.renderRoot?.querySelector(e)??null;return e$1(n,s,{get(){return o(this)}})}} + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$4 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +const PIXEL_SIZE = 10; +class MagnifyingGlass extends r$1 { + constructor() { + super(...arguments); + this.imageAccessor = null; + this.pixel = null; + this.direction = 'vertical'; + this.position = { x: 0, y: 0 }; + this.context = null; + this.xRay = true; + this.reticleSize = 1; + } + enhance() { + if (this.pixel == null || this.imageAccessor == null) { + return; + } + this.classList.remove('hidden'); + if (this.context == null) { + const canvas = this.shadowRoot.querySelector('canvas'); + if (canvas == null) { + return; + } + this.context = canvas.getContext('2d'); + } + const { context } = this; + const rect = this.getBoundingClientRect(); + const scale = rect.width / this.imageAccessor.width; + for (let y = 0; y < 24; ++y) { + for (let x = 0; x < 24; ++x) { + context.fillStyle = this.imageAccessor.cssColorAt(this.pixel.x + x - 12, this.pixel.y + y - 12); + context.fillRect(x * PIXEL_SIZE, y * PIXEL_SIZE, PIXEL_SIZE, PIXEL_SIZE); + } + } + this.reticleSize = Math.round(26 * scale); + this.position = { + x: this.pixel.x * scale - 130, + y: this.pixel.y * scale - 130 + }; + } + toggleXRay() { + this.xRay = !this.xRay; + } + hide() { + this.classList.add('hidden'); + } + get glassPosition() { + const { width, height } = this.imageAccessor != null ? this.imageAccessor : { width: 0, height: 0 }; + const { x, y } = this.pixel != null ? this.pixel : { x: 0, y: 0 }; + return this.direction === 'horizontal' ? + x < (width / 2) ? 'right' : 'left' : + y < (height / 2) ? 'bottom' : 'top'; + } + render() { + this.enhance(); + return x ` + + +
    + +
    + +`; + } +} +__decorate$4([ + n({ type: Object }) +], MagnifyingGlass.prototype, "imageAccessor", void 0); +__decorate$4([ + n({ type: Object }) +], MagnifyingGlass.prototype, "pixel", void 0); +__decorate$4([ + n({ type: String }) +], MagnifyingGlass.prototype, "direction", void 0); +__decorate$4([ + n({ type: Object }) +], MagnifyingGlass.prototype, "position", void 0); +__decorate$4([ + n({ type: Boolean }) +], MagnifyingGlass.prototype, "xRay", void 0); +__decorate$4([ + n({ type: Number }) +], MagnifyingGlass.prototype, "reticleSize", void 0); +customElements.define('magnifying-glass', MagnifyingGlass); + +/* @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var __decorate$3 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +class Images4Up extends r$1 { + constructor() { + super(...arguments); + this.topLeftImageAccessor = null; + this.topRightImageAccessor = null; + this.bottomLeftImageAccessor = null; + this.bottomRightImageAccessor = null; + this.magnifiedPixel = null; + this.dimensions = { width: 0, height: 0 }; + this.containerRect = { x: 0, y: 0, width: 0, height: 0 }; + } + localCoordinateToImagePixel(localX, localY) { + const constrainedX = Math.min(Math.max(localX - this.containerRect.x, -1), this.containerRect.width + 1); + const constrainedY = Math.min(Math.max(localY - this.containerRect.y, -1), this.containerRect.height + 1); + const scaledWidth = this.containerRect.width / 2; + const scaledHeight = this.containerRect.height / 2; + const scale = this.dimensions.width / scaledWidth; + return { + x: Math.floor((constrainedX % scaledWidth) * scale), + y: Math.floor((constrainedY % scaledHeight) * scale) + }; + } + selectPixel(pixel) { + this.magnifiedPixel = pixel; + this.dispatchEvent(new CustomEvent('select-pixel', { detail: pixel })); + } + onPointerEvent(event) { + const pixel = this.localCoordinateToImagePixel(event.x, event.y); + if (pixel.x > -1 && pixel.x < this.dimensions.width && pixel.y > -1 && + pixel.y < this.dimensions.height) { + this.selectPixel(pixel); + } + else { + this.magnifiedPixel = null; + } + } + connectedCallback() { + super.connectedCallback && super.connectedCallback(); + self.addEventListener('resize', (_event) => this.updateSize()); + } + updateSize() { + const rect = this.getBoundingClientRect(); + const { width: containerWidth, height: containerHeight } = rect; + const fourUpWidth = 2 * this.dimensions.width; + const fourUpHeight = 2 * this.dimensions.height; + const containerAspectRatio = containerWidth / containerHeight; + const fourUpAspectRatio = fourUpWidth / fourUpHeight; + const scale = fourUpAspectRatio < containerAspectRatio ? + containerHeight / fourUpHeight : + containerWidth / fourUpWidth; + const width = scale * fourUpWidth; + const height = scale * fourUpHeight; + const x = (containerWidth - width) / 2; + const y = (containerHeight - height) / 2; + this.containerRect = { x, y, width, height }; + } + async updated(changedProperties) { + super.updated(changedProperties); + if (changedProperties.has('dimensions') && this.dimensions != null) { + this.updateSize(); + this.selectPixel({ + x: Math.floor(this.dimensions.width / 2), + y: Math.floor(this.dimensions.height / 2) + }); + } + } + render() { + const { x: x$1, y, width, height } = this.containerRect; + return x ` + +
    + + + + + + + + + + + + +
    `; + } +} +__decorate$3([ + n({ type: Object }) +], Images4Up.prototype, "topLeftImageAccessor", void 0); +__decorate$3([ + n({ type: Object }) +], Images4Up.prototype, "topRightImageAccessor", void 0); +__decorate$3([ + n({ type: Object }) +], Images4Up.prototype, "bottomLeftImageAccessor", void 0); +__decorate$3([ + n({ type: Object }) +], Images4Up.prototype, "bottomRightImageAccessor", void 0); +__decorate$3([ + n({ type: Object }) +], Images4Up.prototype, "magnifiedPixel", void 0); +__decorate$3([ + n({ type: Object }) +], Images4Up.prototype, "dimensions", void 0); +__decorate$3([ + n({ type: Object }) +], Images4Up.prototype, "containerRect", void 0); +customElements.define('images-4-up', Images4Up); + +/** +@license +Copyright (c) 2017 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ + + +const nativeShadow = !( + window['ShadyDOM'] && window['ShadyDOM']['inUse'] +); +/** @type {boolean} */ +let nativeCssVariables_; + +/** + * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings + */ +function calcCssVariables(settings) { + if (settings && settings.shimcssproperties) { + nativeCssVariables_ = false; + } else { + // chrome 49 has semi-working css vars, check if box-shadow works + // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782 + // However, shim css custom properties are only supported with ShadyDOM enabled, + // so fall back on native if we do not detect ShadyDOM + // Edge 15: custom properties used in ::before and ::after will also be used in the parent element + // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/ + nativeCssVariables_ = + nativeShadow || + Boolean( + !navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/) && + window.CSS && + CSS.supports && + CSS.supports('box-shadow', '0 0 0 var(--foo)') + ); + } +} + +/** @type {string | undefined} */ +let cssBuild; +if (window.ShadyCSS && window.ShadyCSS.cssBuild !== undefined) { + cssBuild = window.ShadyCSS.cssBuild; +} + +/** @type {boolean} */ +const disableRuntime = Boolean( + window.ShadyCSS && window.ShadyCSS.disableRuntime +); + +if (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) { + nativeCssVariables_ = window.ShadyCSS.nativeCss; +} else if (window.ShadyCSS) { + calcCssVariables(window.ShadyCSS); + // reset window variable to let ShadyCSS API take its place + window.ShadyCSS = undefined; +} else { + calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']); +} + +// Hack for type error under new type inference which doesn't like that +// nativeCssVariables is updated in a function and assigns the type +// `function(): ?` instead of `boolean`. +const nativeCssVariables = /** @type {boolean} */ (nativeCssVariables_); + +/** +@license +Copyright (c) 2017 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ + + +/** @unrestricted */ +class StyleNode { + constructor() { + /** @type {number} */ + this['start'] = 0; + /** @type {number} */ + this['end'] = 0; + /** @type {StyleNode} */ + this['previous'] = null; + /** @type {StyleNode} */ + this['parent'] = null; + /** @type {Array} */ + this['rules'] = null; + /** @type {string} */ + this['parsedCssText'] = ''; + /** @type {string} */ + this['cssText'] = ''; + /** @type {boolean} */ + this['atRule'] = false; + /** @type {number} */ + this['type'] = 0; + /** @type {string} */ + this['keyframesName'] = ''; + /** @type {string} */ + this['selector'] = ''; + /** @type {string} */ + this['parsedSelector'] = ''; + } +} + +// given a string of css, return a simple rule tree +/** + * @param {string} text + * @return {StyleNode} + */ +function parse(text) { + text = clean(text); + return parseCss(lex(text), text); +} + +// remove stuff we don't care about that may hinder parsing +/** + * @param {string} cssText + * @return {string} + */ +function clean(cssText) { + return cssText.replace(RX.comments, '').replace(RX.port, ''); +} + +// super simple {...} lexer that returns a node tree +/** + * @param {string} text + * @return {!StyleNode} + */ +function lex(text) { + let root = new StyleNode(); + root['start'] = 0; + root['end'] = text.length; + let n = root; + for (let i = 0, l = text.length; i < l; i++) { + if (text[i] === OPEN_BRACE) { + if (!n['rules']) { + n['rules'] = []; + } + let p = n; + let previous = p['rules'][p['rules'].length - 1] || null; + n = new StyleNode(); + n['start'] = i + 1; + n['parent'] = p; + n['previous'] = previous; + p['rules'].push(n); + } else if (text[i] === CLOSE_BRACE) { + n['end'] = i + 1; + n = n['parent'] || root; + } + } + return root; +} + +// add selectors/cssText to node tree +/** + * @param {StyleNode} node + * @param {string} text + * @return {!StyleNode} + */ +function parseCss(node, text) { + let t = text.substring(node['start'], node['end'] - 1); + node['parsedCssText'] = node['cssText'] = t.trim(); + if (node['parent']) { + let ss = node['previous'] + ? node['previous']['end'] + : node['parent']['start']; + t = text.substring(ss, node['start'] - 1); + t = _expandUnicodeEscapes(t); + t = t.replace(RX.multipleSpaces, ' '); + // TODO(sorvell): ad hoc; make selector include only after last ; + // helps with mixin syntax + t = t.substring(t.lastIndexOf(';') + 1); + let s = (node['parsedSelector'] = node['selector'] = t.trim()); + node['atRule'] = s.indexOf(AT_START) === 0; + // note, support a subset of rule types... + if (node['atRule']) { + if (s.indexOf(MEDIA_START) === 0) { + node['type'] = types.MEDIA_RULE; + } else if (s.match(RX.keyframesRule)) { + node['type'] = types.KEYFRAMES_RULE; + node['keyframesName'] = node['selector'].split(RX.multipleSpaces).pop(); + } + } else { + if (s.indexOf(VAR_START) === 0) { + node['type'] = types.MIXIN_RULE; + } else { + node['type'] = types.STYLE_RULE; + } + } + } + let r$ = node['rules']; + if (r$) { + for (let i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) { + parseCss(r, text); + } + } + return node; +} + +/** + * conversion of sort unicode escapes with spaces like `\33 ` (and longer) into + * expanded form that doesn't require trailing space `\000033` + * @param {string} s + * @return {string} + */ +function _expandUnicodeEscapes(s) { + return s.replace(/\\([0-9a-f]{1,6})\s/gi, function () { + let code = arguments[1], + repeat = 6 - code.length; + while (repeat--) { + code = '0' + code; + } + return '\\' + code; + }); +} + +/** + * stringify parsed css. + * @param {StyleNode} node + * @param {boolean=} preserveProperties + * @param {string=} text + * @return {string} + */ +function stringify(node, preserveProperties, text = '') { + // calc rule cssText + let cssText = ''; + if (node['cssText'] || node['rules']) { + let r$ = node['rules']; + if (r$ && !_hasMixinRules(r$)) { + for (let i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) { + cssText = stringify(r, preserveProperties, cssText); + } + } else { + cssText = preserveProperties + ? node['cssText'] + : removeCustomProps(node['cssText']); + cssText = cssText.trim(); + if (cssText) { + cssText = ' ' + cssText + '\n'; + } + } + } + // emit rule if there is cssText + if (cssText) { + if (node['selector']) { + text += node['selector'] + ' ' + OPEN_BRACE + '\n'; + } + text += cssText; + if (node['selector']) { + text += CLOSE_BRACE + '\n\n'; + } + } + return text; +} + +/** + * @param {Array} rules + * @return {boolean} + */ +function _hasMixinRules(rules) { + let r = rules[0]; + return ( + Boolean(r) && + Boolean(r['selector']) && + r['selector'].indexOf(VAR_START) === 0 + ); +} + +/** + * @param {string} cssText + * @return {string} + */ +function removeCustomProps(cssText) { + cssText = removeCustomPropAssignment(cssText); + return removeCustomPropApply(cssText); +} + +/** + * @param {string} cssText + * @return {string} + */ +function removeCustomPropAssignment(cssText) { + return cssText.replace(RX.customProp, '').replace(RX.mixinProp, ''); +} + +/** + * @param {string} cssText + * @return {string} + */ +function removeCustomPropApply(cssText) { + return cssText.replace(RX.mixinApply, '').replace(RX.varApply, ''); +} + +/** @enum {number} */ +const types = { + STYLE_RULE: 1, + KEYFRAMES_RULE: 7, + MEDIA_RULE: 4, + MIXIN_RULE: 1000, +}; + +const OPEN_BRACE = '{'; +const CLOSE_BRACE = '}'; + +// helper regexp's +const RX = { + comments: /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim, + port: /@import[^;]*;/gim, + customProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim, + mixinProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim, + mixinApply: /@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim, + varApply: /[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim, + keyframesRule: /^@[^\s]*keyframes/, + multipleSpaces: /\s+/g, +}; + +const VAR_START = '--'; +const MEDIA_START = '@media'; +const AT_START = '@'; + +/** +@license +Copyright (c) 2017 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ + +const VAR_ASSIGN = /(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi; +const MIXIN_MATCH = /(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi; + +/** +@license +Copyright (c) 2017 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ + + +/** @type {!Set} */ +const styleTextSet = new Set(); + +const scopingAttribute = 'shady-unscoped'; + +/** + * Add a specifically-marked style to the document directly, and only one copy of that style. + * + * @param {!HTMLStyleElement} style + * @return {undefined} + */ +function processUnscopedStyle(style) { + const text = style.textContent; + if (!styleTextSet.has(text)) { + styleTextSet.add(text); + const newStyle = document.createElement('style'); + newStyle.setAttribute('shady-unscoped', ''); + newStyle.textContent = text; + document.head.appendChild(newStyle); + } +} + +/** + * Check if a style is supposed to be unscoped + * @param {!HTMLStyleElement} style + * @return {boolean} true if the style has the unscoping attribute + */ +function isUnscopedStyle(style) { + return style.hasAttribute(scopingAttribute); +} + +/** +@license +Copyright (c) 2017 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ + + +/** + * @param {string|StyleNode} rules + * @param {function(StyleNode)=} callback + * @return {string} + */ +function toCssText(rules, callback) { + if (!rules) { + return ''; + } + if (typeof rules === 'string') { + rules = parse(rules); + } + return stringify(rules, nativeCssVariables); +} + +/** + * @param {HTMLStyleElement} style + * @return {StyleNode} + */ +function rulesForStyle(style) { + if (!style['__cssRules'] && style.textContent) { + style['__cssRules'] = parse(style.textContent); + } + return style['__cssRules'] || null; +} + +/** + * @param {StyleNode} node + * @param {Function=} styleRuleCallback + * @param {Function=} keyframesRuleCallback + * @param {boolean=} onlyActiveRules + */ +function forEachRule( + node, + styleRuleCallback, + keyframesRuleCallback, + onlyActiveRules +) { + if (!node) { + return; + } + let skipRules = false; + let type = node['type']; + if (type === types.STYLE_RULE) { + styleRuleCallback(node); + } else if (type === types.MIXIN_RULE) { + skipRules = true; + } + let r$ = node['rules']; + if (r$ && !skipRules) { + for (let i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) { + forEachRule(r, styleRuleCallback); + } + } +} + +/** + * Walk from text[start] matching parens and + * returns position of the outer end paren + * @param {string} text + * @param {number} start + * @return {number} + */ +function findMatchingParen(text, start) { + let level = 0; + for (let i = start, l = text.length; i < l; i++) { + if (text[i] === '(') { + level++; + } else if (text[i] === ')') { + if (--level === 0) { + return i; + } + } + } + return -1; +} + +/** + * @param {string} str + * @param {function(string, string, string, string)} callback + */ +function processVariableAndFallback(str, callback) { + // find 'var(' + let start = str.indexOf('var('); + if (start === -1) { + // no var?, everything is prefix + return callback(str, '', '', ''); + } + //${prefix}var(${inner})${suffix} + let end = findMatchingParen(str, start + 3); + let inner = str.substring(start + 4, end); + let prefix = str.substring(0, start); + // suffix may have other variables + let suffix = processVariableAndFallback(str.substring(end + 1), callback); + let comma = inner.indexOf(','); + // value and fallback args should be trimmed to match in property lookup + if (comma === -1) { + // variable, no fallback + return callback(prefix, inner.trim(), '', suffix); + } + // var(${value},${fallback}) + let value = inner.substring(0, comma).trim(); + let fallback = inner.substring(comma + 1).trim(); + return callback(prefix, value, fallback, suffix); +} + +/** + * @type {function(*):*} + */ +(window['ShadyDOM'] && window['ShadyDOM']['wrap']) || ((node) => node); + +/** + * @param {Element | {is: string, extends: string}} element + * @return {{is: string, typeExtension: string}} + */ +function getIsExtends(element) { + let localName = element['localName']; + let is = '', + typeExtension = ''; + /* + NOTE: technically, this can be wrong for certain svg elements + with `-` in the name like `` + */ + if (localName) { + if (localName.indexOf('-') > -1) { + is = localName; + } else { + typeExtension = localName; + is = (element.getAttribute && element.getAttribute('is')) || ''; + } + } else { + is = /** @type {?} */ (element).is; + typeExtension = /** @type {?} */ (element).extends; + } + return {is, typeExtension}; +} + +/** + * @param {Element|DocumentFragment} element + * @return {string} + */ +function gatherStyleText(element) { + /** @type {!Array} */ + const styleTextParts = []; + const styles = /** @type {!NodeList} */ (element.querySelectorAll( + 'style' + )); + for (let i = 0; i < styles.length; i++) { + const style = styles[i]; + if (isUnscopedStyle(style)) { + if (!nativeShadow) { + processUnscopedStyle(style); + style.parentNode.removeChild(style); + } + } else { + styleTextParts.push(style.textContent); + style.parentNode.removeChild(style); + } + } + return styleTextParts.join('').trim(); +} + +const CSS_BUILD_ATTR = 'css-build'; + +/** + * Return the polymer-css-build "build type" applied to this element + * + * @param {!HTMLElement} element + * @return {string} Can be "", "shady", or "shadow" + */ +function getCssBuild(element) { + if (cssBuild !== undefined) { + return /** @type {string} */ (cssBuild); + } + if (element.__cssBuild === undefined) { + // try attribute first, as it is the common case + const attrValue = element.getAttribute(CSS_BUILD_ATTR); + if (attrValue) { + element.__cssBuild = attrValue; + } else { + const buildComment = getBuildComment(element); + if (buildComment !== '') { + // remove build comment so it is not needlessly copied into every element instance + removeBuildComment(element); + } + element.__cssBuild = buildComment; + } + } + return element.__cssBuild || ''; +} + +/** + * Check if the given element, either a

    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�v}x+i94n?^H(6y15&tRyYfE`A;vNO}II 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